resolveClinic($clinicUuid, $user); $data = array_map( fn(ClinicDoctorPermission $p) => $p->toArray(), $this->permRepo->findByClinic($clinic), ); return $this->success($data); } #[Route('/api/v1/admin/clinic/{clinicUuid}/doctor/{doctorUuid}/permissions', methods: ['GET'])] #[IsGranted('IS_AUTHENTICATED_FULLY')] public function showPermissions(string $clinicUuid, string $doctorUuid, #[CurrentUser] User $user): JsonResponse { $clinic = $this->resolveClinic($clinicUuid, $user); $doctor = $this->resolveMember($clinic, $doctorUuid); return $this->success($this->permRepo->getOrCreate($clinic, $doctor)->toArray()); } #[Route('/api/v1/admin/clinic/{clinicUuid}/doctor/{doctorUuid}/permissions', methods: ['PATCH'])] #[IsGranted('IS_AUTHENTICATED_FULLY')] public function updatePermissions(string $clinicUuid, string $doctorUuid, Request $request, #[CurrentUser] User $user): JsonResponse { $clinic = $this->resolveClinic($clinicUuid, $user); $doctor = $this->resolveMember($clinic, $doctorUuid); $perm = $this->permRepo->getOrCreate($clinic, $doctor); $body = json_decode($request->getContent(), true) ?? []; if (array_key_exists('permissions', $body)) { if (!is_array($body['permissions'])) { throw new AppException(ErrorCodes::ERR_VALIDATION_001, 'permissions باید آبجکت باشد', 422, 'permissions'); } $perm->mergePermissions($body['permissions']); } if (array_key_exists('active', $body)) { $perm->setActive((bool) $body['active']); } $this->em->flush(); return $this->success($perm->toArray()); } private function resolveClinic(string $clinicUuid, User $user): Clinic { $clinic = $this->clinicRepo->findByUuid($clinicUuid); if ($clinic === null) { throw new AppException(ErrorCodes::ERR_NOT_FOUND_001, 'کلینیک یافت نشد', 404); } $isOwner = $clinic->getUser()->getId() === $user->getId(); if (!$user->hasRole('ROLE_ADMIN') && !$isOwner) { throw new AppException(ErrorCodes::ERR_ACCESS_DENIED, 'دسترسی ندارید', 403); } return $clinic; } private function resolveMember(Clinic $clinic, string $doctorUuid): \App\Doctor\Entity\Doctor { $doctor = $this->doctorRepo->findByUuid($doctorUuid); if ($doctor === null || !$clinic->hasDoctor($doctor)) { throw new AppException(ErrorCodes::ERR_NOT_FOUND_001, 'این پزشک به کلینیک متصل نیست', 404); } return $doctor; } }