feat: add patient appointment interface and endpoints

- Introduced `PatientAppointment` interface to define appointment structure.
- Implemented `findByUserAndDoctorIds` method in `AppointmentRepository` to retrieve appointments for a user filtered by doctor IDs.
- Added `acceptedDoctorIdsByClinic` method in `ClinicDoctorInvitationRepository` to get accepted doctor IDs for a clinic.
- Created new endpoint in `PatientController` to fetch appointments for a patient, ensuring only relevant doctors' appointments are displayed.
This commit is contained in:
hamed
2026-07-13 10:15:44 +03:30
parent 5c09fe8ac3
commit a4a17bf8c7
5 changed files with 564 additions and 370 deletions
@@ -128,6 +128,29 @@ class AppointmentRepository extends ServiceEntityRepository
return $this->findBy($criteria, ['slotStart' => 'DESC']);
}
/**
* نوبت‌های یک بیمار (کاربر) که با پزشک(های) مشخص گرفته شده‌اند — برای نمایش در
* پروندهٔ بیمار. اگر لیست پزشک خالی باشد، آرایهٔ خالی برمی‌گرداند.
*
* @param int[] $doctorIds
* @return Appointment[]
*/
public function findByUserAndDoctorIds(User $user, array $doctorIds): array
{
if ($doctorIds === []) {
return [];
}
return $this->createQueryBuilder('a')
->where('a.user = :user')
->andWhere('a.doctor IN (:doctorIds)')
->setParameter('user', $user)
->setParameter('doctorIds', $doctorIds)
->orderBy('a.slotStart', 'DESC')
->getQuery()
->getResult();
}
/** Whether the user had a confirmed appointment with this doctor within the last $sinceDays days. */
public function hasRecentConfirmed(User $user, Doctor $doctor, int $sinceDays = 30): bool
{