inti project

This commit is contained in:
root
2026-05-29 04:33:03 -04:00
commit cdeab1796f
699 changed files with 20516 additions and 0 deletions
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Attendance;
use App\Domain\SchoolCore\Attendance\Contracts\ScannerServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Attendance\ProcessScanRequest;
use App\Http\Resources\V2\Attendance\ScanResultResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ScanController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ScannerServiceContract $scanner) {}
public function store(ProcessScanRequest $request): JsonResponse
{
$result = $this->scanner->processScan($this->context->current(), $request->toDTO());
return ApiResponse::success((new ScanResultResource($result))->resolve($request), 'Scan processed.');
}
}
@@ -0,0 +1,29 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
abstract class BaseApiController extends Controller
{
public function __construct(protected readonly SchoolContextStore $schoolContext) {}
protected function context(): SchoolContext
{
return $this->schoolContext->current();
}
protected function ok(mixed $data = null, ?string $message = null, array $meta = []): JsonResponse
{
return ApiResponse::success($data, $message, $meta);
}
protected function created(mixed $data = null, ?string $message = null, array $meta = []): JsonResponse
{
return ApiResponse::success($data, $message, $meta, 201);
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Communication;
use App\Domain\SchoolCore\Communication\Contracts\CommunicationServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Communication\BulkSendMessageRequest;
use App\Http\Resources\V2\Communication\MessageResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class BulkSendController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly CommunicationServiceContract $communication) {}
public function store(BulkSendMessageRequest $request): JsonResponse
{
$result = $this->communication->sendBulkMessage($this->context->current(), $request->toDTO());
return ApiResponse::success((new MessageResource($result))->resolve($request), 'Bulk message accepted.');
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Communication;
use App\Domain\SchoolCore\Communication\Contracts\RecipientPreviewServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Communication\RecipientPreviewRequest;
use App\Http\Resources\V2\Communication\RecipientPreviewResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class RecipientPreviewController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly RecipientPreviewServiceContract $previews) {}
public function store(RecipientPreviewRequest $request): JsonResponse
{
$result = $this->previews->preview($this->context->current(), $request->toDTO());
return ApiResponse::success((new RecipientPreviewResource($result))->resolve($request), 'Recipient preview created.', [], 201);
}
}
@@ -0,0 +1,35 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Finance;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Finance\Contracts\PaymentServiceContract;
use App\Http\Requests\Finance\EditPaymentRequest;
use App\Http\Requests\Finance\RecordPaymentRequest;
use App\Http\Resources\V2\Finance\PaymentResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class PaymentController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly PaymentServiceContract $payments) {}
public function store(RecordPaymentRequest $request): JsonResponse
{
$result = $this->payments->recordPayment($this->context->current(), $request->toDTO());
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment recorded.', [], 201);
}
public function update(EditPaymentRequest $request, int $payment): JsonResponse
{
$result = $this->payments->editPayment($this->context->current(), $payment, $request->toDTO());
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment updated.');
}
public function reverse(EditPaymentRequest $request, int $payment): JsonResponse
{
$result = $this->payments->reversePayment($this->context->current(), $payment, (string) $request->validated('edit_reason', 'Reversed through API'));
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment reversed.');
}
}
@@ -0,0 +1,19 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Finance;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Finance\Contracts\FinanceFileServiceContract;
use App\Http\Requests\Finance\DownloadPaymentFileRequest;
use Illuminate\Routing\Controller;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
final class PaymentFileController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly FinanceFileServiceContract $files) {}
public function show(DownloadPaymentFileRequest $request, int $payment): BinaryFileResponse
{
return $this->files->downloadPaymentFile($this->context->current(), $payment, (string) $request->validated('mode', 'download'));
}
}
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\IslamicSundaySchool;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRunnerContract;
use App\Domain\SchoolCore\Reporting\DTO\ReportRequestData;
use App\Http\Resources\V2\IslamicSundaySchool\QuranProgressReportResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class QuranProgressController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportRunnerContract $reports) {}
public function index(): JsonResponse
{
$data = new ReportRequestData('islamic.quran_progress', [], null, null, null, null, false, null, null, false, []);
$result = $this->reports->run($this->context->current(), $data);
return ApiResponse::success((new QuranProgressReportResource($result))->resolve(request()));
}
}
@@ -0,0 +1,36 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Reporting;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRegistryContract;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRunnerContract;
use App\Http\Requests\Reporting\ListReportsRequest;
use App\Http\Requests\Reporting\RunReportRequest;
use App\Http\Resources\V2\Reporting\ReportResultResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ReportController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportRegistryContract $registry, private readonly ReportRunnerContract $runner) {}
public function index(ListReportsRequest $request): JsonResponse
{
$reports = array_map(fn ($report) => [
'key' => $report->key(),
'name' => $report->name(),
'category' => $report->category()->value,
'visibility' => $report->visibility()->value,
], $this->registry->availableReports($this->context->current()));
return ApiResponse::success($reports);
}
public function run(RunReportRequest $request): JsonResponse
{
$result = $this->runner->run($this->context->current(), $request->toDTO());
return ApiResponse::success((new ReportResultResource($result))->resolve($request));
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Reporting;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportExportServiceContract;
use App\Http\Requests\Reporting\ExportReportRequest;
use App\Http\Resources\V2\Reporting\ReportExportResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ReportExportController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportExportServiceContract $exports) {}
public function store(ExportReportRequest $request): JsonResponse
{
$result = $this->exports->export($this->context->current(), $request->toDTO());
return ApiResponse::success((new ReportExportResource($result))->resolve($request), 'Report export created.');
}
}
@@ -0,0 +1,50 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Students;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Students\Contracts\StudentReadServiceContract;
use App\Domain\SchoolCore\Students\Contracts\StudentServiceContract;
use App\Http\Requests\Students\CreateStudentRequest;
use App\Http\Requests\Students\StudentSearchRequest;
use App\Http\Requests\Students\StudentStatusTransitionRequest;
use App\Http\Requests\Students\UpdateStudentRequest;
use App\Http\Resources\V2\Students\StudentResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class StudentController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly StudentServiceContract $students, private readonly StudentReadServiceContract $reader) {}
public function index(StudentSearchRequest $request): JsonResponse
{
$result = $this->reader->search($this->context->current(), $request->toDTO());
return ApiResponse::success($result);
}
public function store(CreateStudentRequest $request): JsonResponse
{
$result = $this->students->createStudent($this->context->current(), $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student created.', [], 201);
}
public function show(int $student): JsonResponse
{
$result = $this->students->getStudent($this->context->current(), $student);
return ApiResponse::success((new StudentResource($result))->resolve(request()));
}
public function update(UpdateStudentRequest $request, int $student): JsonResponse
{
$result = $this->students->updateStudent($this->context->current(), $student, $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student updated.');
}
public function transition(StudentStatusTransitionRequest $request, int $student): JsonResponse
{
$result = $this->students->transitionStatus($this->context->current(), $student, $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student status changed.');
}
}
@@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Attendance;
use App\Domain\SchoolCore\Attendance\Contracts\ScannerServiceContract;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Http\Requests\Attendance\ProcessScanRequest;
use Illuminate\Routing\Controller;
final class ScannerController extends Controller
{
public function __construct(private ScannerServiceContract $scanner) {}
public function __invoke(ProcessScanRequest $request)
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
$result = $this->scanner->processScan($context, $request->toDTO());
return response()->json($result->toArray());
}
}
@@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Attendance;
use App\Domain\SchoolCore\Attendance\Contracts\StaffAttendanceServiceContract;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Http\Requests\Attendance\RecordStaffAttendanceRequest;
use Illuminate\Routing\Controller;
final class StaffAttendanceController extends Controller
{
public function __construct(private StaffAttendanceServiceContract $staff) {}
public function store(RecordStaffAttendanceRequest $request)
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
$result = $this->staff->recordStaffAttendance($context, $request->toDTO());
return response()->json(['data' => $result]);
}
}
@@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Attendance;
use App\Domain\SchoolCore\Attendance\Contracts\StudentAttendanceServiceContract;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Http\Requests\Attendance\RecordStudentAttendanceRequest;
use Illuminate\Routing\Controller;
final class StudentAttendanceController extends Controller
{
public function __construct(private StudentAttendanceServiceContract $students) {}
public function store(RecordStudentAttendanceRequest $request)
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
$result = $this->students->recordStudentAttendance($context, $request->toDTO());
return response()->json(['data' => $result]);
}
}
@@ -0,0 +1 @@
<?php declare(strict_types=1); namespace App\Http\Controllers\Communication; use Illuminate\Routing\Controller; use App\Domain\SchoolCore\Communication\Contracts\CommunicationServiceContract; final class BulkMessageController extends Controller { public function __construct(private CommunicationServiceContract $messages) {} public function send(): array { return ['status'=>'delegated']; } }
@@ -0,0 +1 @@
<?php declare(strict_types=1); namespace App\Http\Controllers\Communication; use Illuminate\Routing\Controller; use App\Domain\SchoolCore\Communication\Contracts\MessageTemplateServiceContract; final class MessageTemplateController extends Controller { public function __construct(private MessageTemplateServiceContract $templates) {} public function store(): array { return ['status'=>'delegated']; } }
@@ -0,0 +1 @@
<?php declare(strict_types=1); namespace App\Http\Controllers\Communication; use Illuminate\Routing\Controller; use App\Domain\SchoolCore\Communication\Contracts\RecipientPreviewServiceContract; final class RecipientPreviewController extends Controller { public function __construct(private RecipientPreviewServiceContract $previews) {} public function store(): array { return ['status'=>'preview-required']; } }
@@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Finance;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Finance\Contracts\FinanceFileServiceContract;
use App\Http\Requests\Finance\DownloadPaymentFileRequest;
final class PaymentFileController
{
public function __construct(private readonly FinanceFileServiceContract $files) {}
public function show(DownloadPaymentFileRequest $request, int $payment)
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
return $this->files->downloadPaymentFile($context, $payment, $request->mode());
}
}
@@ -0,0 +1,28 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Reporting;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRegistryContract;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRunnerContract;
use App\Http\Requests\Reporting\RunReportRequest;
use Illuminate\Routing\Controller;
final class ReportController extends Controller
{
public function __construct(private readonly ReportRunnerContract $runner, private readonly ReportRegistryContract $registry) {}
public function index(RunReportRequest $request): array
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
return ['reports' => array_map(fn ($report) => ['key' => $report->key(), 'name' => $report->name()], $this->registry->availableReports($context))];
}
public function run(RunReportRequest $request): array
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
$result = $this->runner->run($context, $request->toDTO());
return ['data' => $result];
}
}
@@ -0,0 +1,18 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Reporting;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Reporting\Contracts\ReportExportServiceContract;
use App\Http\Requests\Reporting\ExportReportRequest;
use Illuminate\Routing\Controller;
final class ReportExportController extends Controller
{
public function __construct(private readonly ReportExportServiceContract $exports) {}
public function export(ExportReportRequest $request): array
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
return ['export' => $this->exports->export($context, $request->toDTO())];
}
}
@@ -0,0 +1,18 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Reporting;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Reporting\Contracts\ScheduledReportServiceContract;
use App\Http\Requests\Reporting\ScheduleReportRequest;
use Illuminate\Routing\Controller;
final class ScheduledReportController extends Controller
{
public function __construct(private readonly ScheduledReportServiceContract $scheduled) {}
public function store(ScheduleReportRequest $request): array
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
return ['scheduled_report' => $this->scheduled->schedule($context, $request->toDTO())];
}
}
@@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Contracts\StudentServiceContract;
use App\Domain\SchoolCore\Students\Data\CreateStudentData;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
final class StudentCreateController
{
public function __construct(private readonly StudentServiceContract $students) {}
public function __invoke(Request $request): JsonResponse
{
/** @var SchoolContext $context */
$context = $request->attributes->get(SchoolContext::class);
$student = $this->students->create($context, new CreateStudentData(method_exists($request, 'validated') ? $request->validated() : $request->all()));
return response()->json($student->attributes, 201);
}
}
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\SchoolCore\Context\SchoolContext; use App\Domain\SchoolCore\Students\Contracts\AssignmentServiceContract; use App\Http\Requests\Students\AssignmentRequest; use Illuminate\Http\Request; use Illuminate\Routing\Controller;
final class AssignmentController extends Controller { public function __construct(private readonly AssignmentServiceContract $assignments){} public function store(AssignmentRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->assignments->assignStudent($context,$request->toDTO())]; } public function destroy(Request $request,int $assignment): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->assignments->unassignStudent($context,$assignment,(string)$request->input('reason','unassign student'))]; } }
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\SchoolCore\Context\SchoolContext; use App\Domain\SchoolCore\Students\Contracts\EnrollmentServiceContract; use App\Http\Requests\Students\EnrollmentRequest; use Illuminate\Http\Request; use Illuminate\Routing\Controller;
final class EnrollmentController extends Controller { public function __construct(private readonly EnrollmentServiceContract $enrollments){} public function store(EnrollmentRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->enrollments->enrollStudent($context,$request->toDTO())]; } public function withdraw(Request $request,int $student): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->enrollments->withdrawStudent($context,$student,(string)$request->input('reason','withdrawal'))]; } }
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\SchoolCore\Context\SchoolContext; use App\Domain\SchoolCore\Students\Contracts\GuardianServiceContract; use App\Http\Requests\Students\CreateGuardianRequest; use App\Http\Requests\Students\LinkGuardianRequest; use Illuminate\Http\Request; use Illuminate\Routing\Controller;
final class GuardianController extends Controller { public function __construct(private readonly GuardianServiceContract $guardians){} public function store(CreateGuardianRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->guardians->createGuardian($context,$request->toDTO())]; } public function link(LinkGuardianRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->guardians->linkGuardianToStudent($context,$request->toDTO())]; } public function unlink(Request $request,int $student,int $guardian): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->guardians->unlinkGuardianFromStudent($context,$student,$guardian,(string)$request->input('reason','unlink guardian'))]; } }
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\IslamicSundaySchool\Students\Services\IslamicSundaySchoolStudentProfileService; use App\Domain\SchoolCore\Context\SchoolContext; use App\Http\Requests\Students\IslamicSundaySchoolStudentProfileRequest; use Illuminate\Routing\Controller;
final class IslamicSundaySchoolStudentProfileController extends Controller { public function __construct(private readonly IslamicSundaySchoolStudentProfileService $profiles){} public function store(IslamicSundaySchoolStudentProfileRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->profiles->save($context,$request->toDTO())]; } }
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\SchoolCore\Context\SchoolContext; use App\Domain\SchoolCore\Students\Contracts\PromotionServiceContract; use App\Http\Requests\Students\BulkPromotionRequest; use App\Http\Requests\Students\PromotionRequest; use Illuminate\Http\Request; use Illuminate\Routing\Controller;
final class PromotionController extends Controller { public function __construct(private readonly PromotionServiceContract $promotions){} public function evaluate(Request $request,int $student): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->promotions->evaluatePromotion($context,$student)]; } public function promote(PromotionRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->promotions->promoteStudent($context,$request->toDTO())]; } public function bulk(BulkPromotionRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->promotions->bulkPromote($context,$request->toDTO())]; } }
@@ -0,0 +1,5 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Students;
use App\Domain\SchoolCore\Context\SchoolContext; use App\Domain\SchoolCore\Students\Contracts\StudentReadServiceContract; use App\Domain\SchoolCore\Students\Contracts\StudentServiceContract; use App\Http\Requests\Students\CreateStudentRequest; use App\Http\Requests\Students\StudentSearchRequest; use App\Http\Requests\Students\StudentStatusTransitionRequest; use App\Http\Requests\Students\UpdateStudentRequest; use Illuminate\Routing\Controller;
final class StudentLifecycleController extends Controller { public function __construct(private readonly StudentServiceContract $students, private readonly StudentReadServiceContract $reads){} public function store(CreateStudentRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->students->createStudent($context,$request->toDTO())]; } public function show(CreateStudentRequest $request,int $student): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->students->getStudent($context,$student)]; } public function update(UpdateStudentRequest $request,int $student): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->students->updateStudent($context,$student,$request->toDTO())]; } public function transition(StudentStatusTransitionRequest $request,int $student): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->students->transitionStatus($context,$student,$request->toDTO())]; } public function index(StudentSearchRequest $request): array { $context=$request->attributes->get(SchoolContext::class); return ['data'=>$this->reads->search($context,$request->toDTO())]; } }