Files
clinicpro/src/Clinic/Repository/ClinicDoctorPermissionRepository.php
T
hamed e4ddd38f0c feat: add per-doctor permissions management in clinics
- Implement DoctorPermissionsModal for managing doctor permissions in clinics.
- Create usePermissions hook to handle user permissions context.
- Add migration for clinic_doctor_permissions table with default permissions.
- Develop ClinicDoctorPermissionController for handling permissions API.
- Create ClinicDoctorPermission entity to manage permissions data.
- Implement ClinicDoctorPermissionRepository for database interactions.
- Add ClinicDoctorPermissionChecker for permission validation logic.
- Write tests for clinic doctor permissions functionality.
2026-07-18 09:44:13 +03:30

92 lines
2.6 KiB
PHP

<?php
namespace App\Clinic\Repository;
use App\Clinic\Entity\Clinic;
use App\Clinic\Entity\ClinicDoctorPermission;
use App\Doctor\Entity\Doctor;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<ClinicDoctorPermission>
*/
class ClinicDoctorPermissionRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, ClinicDoctorPermission::class);
}
public function findOneFor(Clinic $clinic, Doctor $doctor): ?ClinicDoctorPermission
{
return $this->findOneBy(['clinic' => $clinic, 'doctor' => $doctor]);
}
/** @return ClinicDoctorPermission[] */
public function findByClinic(Clinic $clinic): array
{
return $this->findBy(['clinic' => $clinic]);
}
/**
* پزشکانی که پیش از این قابلیت عضو شده‌اند سطر مجوز ندارند؛ در اولین دسترسی
* با مجوز پیش‌فرض ساخته می‌شود.
*/
public function getOrCreate(Clinic $clinic, Doctor $doctor): ClinicDoctorPermission
{
$perm = $this->findOneFor($clinic, $doctor);
if ($perm !== null) {
return $perm;
}
$perm = new ClinicDoctorPermission($clinic, $doctor);
$em = $this->getEntityManager();
$em->persist($perm);
$em->flush();
return $perm;
}
/**
* مجوزهای یک پزشک در چند کلینیک، کلیددار با شناسهٔ کلینیک — برای پرهیز از N+1
* هنگام ساخت available_contexts.
*
* @param int[] $clinicIds
* @return array<int, ClinicDoctorPermission>
*/
public function mapByClinicForDoctor(Doctor $doctor, array $clinicIds): array
{
if ($clinicIds === []) {
return [];
}
$rows = $this->createQueryBuilder('p')
->andWhere('p.doctor = :doctor')
->andWhere('IDENTITY(p.clinic) IN (:clinics)')
->setParameter('doctor', $doctor)
->setParameter('clinics', $clinicIds)
->getQuery()
->getResult();
$map = [];
foreach ($rows as $row) {
$map[$row->getClinic()->getId()] = $row;
}
return $map;
}
public function deleteFor(Clinic $clinic, Doctor $doctor): void
{
$perm = $this->findOneFor($clinic, $doctor);
if ($perm === null) {
return;
}
$em = $this->getEntityManager();
$em->remove($perm);
$em->flush();
}
}