has('school_year_id')) { return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY); } $context = $this->schoolYears->fromRequest($request); $page = $this->profiles->index( $context->name, trim((string) $request->query('q', '')), (int) $request->query('per_page', 25), ); return $this->success([ 'school_year' => $context->name, 'read_only' => $context->isReadOnly, 'parents' => $page->getCollection() ->map(fn ($row) => $this->profiles->parentSummary((array) $row, $context->name)) ->values() ->all(), 'pagination' => [ 'page' => $page->currentPage(), 'per_page' => $page->perPage(), 'total' => $page->total(), ], ]); } public function search(Request $request): JsonResponse { if ($request->has('school_year_id')) { return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY); } $context = $this->schoolYears->fromRequest($request); return $this->success([ 'school_year' => $context->name, 'read_only' => $context->isReadOnly, 'items' => $this->profiles->search( $context->name, trim((string) $request->query('q', '')), (int) $request->query('limit', 10), ), ]); } public function show(Request $request, int $parent): JsonResponse { if ($request->has('school_year_id')) { return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY); } $context = $this->schoolYears->fromRequest($request); $payload = $this->profiles->show($parent, $context->name); if (! $payload) { return $this->error('Parent profile not found.', Response::HTTP_NOT_FOUND); } return $this->success([ 'school_year' => $context->name, 'read_only' => $context->isReadOnly, ...$payload, ]); } public function update(Request $request, int $parent): JsonResponse { if ($request->has('school_year_id')) { return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY); } $payload = $request->validate([ 'firstname' => ['sometimes', 'required', 'string', 'max:100'], 'lastname' => ['sometimes', 'required', 'string', 'max:100'], 'email' => ['sometimes', 'nullable', 'email', 'max:255'], 'cellphone' => ['sometimes', 'nullable', 'string', 'max:30'], 'address_street' => ['sometimes', 'nullable', 'string', 'max:255'], 'city' => ['sometimes', 'nullable', 'string', 'max:100'], 'state' => ['sometimes', 'nullable', 'string', 'max:100'], 'zip' => ['sometimes', 'nullable', 'string', 'max:30'], 'status' => ['sometimes', 'nullable', 'string', 'max:30'], ]); $updated = $this->profiles->updateParent($parent, $payload); if (! $updated) { return $this->error('Parent profile not found.', Response::HTTP_NOT_FOUND); } return $this->success(['parent' => $updated], 'Parent profile updated.'); } }