Преглед изворни кода

feat(class): endpoints de alunos e registro de presença

Controller filtra por unidade ativa e adiciona students/saveAttendance;
rotas GET /class/{id}/students e POST /class/{id}/attendances.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee пре 1 месец
родитељ
комит
25859101d3
2 измењених фајлова са 42 додато и 2 уклоњено
  1. 38 2
      app/Http/Controllers/ClassController.php
  2. 4 0
      routes/authRoutes/class.php

+ 38 - 2
app/Http/Controllers/ClassController.php

@@ -2,26 +2,36 @@
 
 namespace App\Http\Controllers;
 
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Services\ClassService;
 use App\Http\Requests\ClassRequest;
 use App\Http\Resources\ClassResource;
+use Illuminate\Http\Request;
 use Illuminate\Http\JsonResponse;
 
 class ClassController extends Controller
 {
+    use ResolvesActiveUnit;
+
     public function __construct(
         protected ClassService $service,
     ) {}
 
     public function index(): JsonResponse
     {
-        $items = $this->service->getAll();
+        $unitId = $this->activeUnitId();
+        if (!$unitId) {
+            return $this->successResponse(payload: []);
+        }
+
+        $items = $this->service->getAllByUnit($unitId);
         return $this->successResponse(payload: ClassResource::collection($items));
     }
 
     public function store(ClassRequest $request): JsonResponse
     {
-        $item = $this->service->create($request->validated());
+        $data = array_merge($request->validated(), ['unit_id' => $this->activeUnitId()]);
+        $item = $this->service->create($data);
         return $this->successResponse(payload: new ClassResource($item), message: __('messages.created'), code: 201);
     }
 
@@ -42,4 +52,30 @@ public function destroy(int $id): JsonResponse
         $this->service->delete($id);
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
+
+    /**
+     * Alunos com contrato ativo no pacote da aula + presença registrada.
+     */
+    public function students(int $id): JsonResponse
+    {
+        $students = $this->service->getStudentsForClass($id);
+        return $this->successResponse(payload: $students);
+    }
+
+    /**
+     * Salva a lista de presença da aula (upsert em lote).
+     */
+    public function saveAttendance(Request $request, int $id): JsonResponse
+    {
+        $validated = $request->validate([
+            'attendances'              => 'required|array',
+            'attendances.*.student_id' => 'required|integer|exists:students,id',
+            'attendances.*.in_class'   => 'required|boolean',
+            'attendances.*.justified'  => 'sometimes|boolean',
+            'attendances.*.notes'      => 'nullable|string',
+        ]);
+
+        $this->service->saveAttendance($id, $validated['attendances']);
+        return $this->successResponse(message: __('messages.updated'));
+    }
 }

+ 4 - 0
routes/authRoutes/class.php

@@ -10,6 +10,10 @@
 
     Route::get('/{id}', 'show')->middleware('permission:class,view');
 
+    // Lista de presença
+    Route::get('/{id}/students', 'students')->middleware('permission:class,view');
+    Route::post('/{id}/attendances', 'saveAttendance')->middleware('permission:class,edit');
+
     Route::put('/{id}', 'update')->middleware('permission:class,edit');
 
     Route::delete('/{id}', 'destroy')->middleware('permission:class,delete');