feat: add RichTextEditor component for rich text editing in articles

feat: create SanitizeBlogBodiesCommand to clean existing blog bodies according to current HTML sanitization policies

test: add AppointmentTreatmentSessionLinkTest to ensure appointment booking functionality works correctly with treatment session links
This commit is contained in:
hamed
2026-08-08 11:40:17 +03:30
parent 934405c42d
commit 47323daa27
36 changed files with 3461 additions and 12686 deletions
@@ -224,6 +224,11 @@ class ClinicController extends BaseController
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function update(string $uuid, Request $request, #[CurrentUser] User $user): JsonResponse
{
// پیش‌چکِ منشی، پیش از واکشیِ رکورد. چکِ اصلی به خودِ شیء نیاز دارد و بالا
// نمی‌رود؛ سهمِ منشی از آن اما همیشه همین توگل است، پس این خط هیچ مسیرِ
// مجازی نمی‌بندد و فقط ۴۰۴ را به ۴۰۳ تبدیل می‌کند. یافتهٔ ۱۰ آدیت ۲۰۲۶-۰۸-۰۷.
$this->secretaryAccess->denyUnlessGranted($user, 'clinic_info', 'update');
$clinic = $this->clinicRepo->findByUuid($uuid);
if ($clinic === null) {
return $this->error(ErrorCodes::ERR_VALIDATION_002, 'کلینیک یافت نشد', 404);
@@ -385,6 +390,11 @@ class ClinicController extends BaseController
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function detachDoctor(string $clinicUuid, string $doctorUuid, #[CurrentUser] User $user): JsonResponse
{
// پیش‌چکِ منشی، پیش از واکشیِ رکورد. چکِ اصلی به خودِ شیء نیاز دارد و بالا
// نمی‌رود؛ سهمِ منشی از آن اما همیشه همین توگل است، پس این خط هیچ مسیرِ
// مجازی نمی‌بندد و فقط ۴۰۴ را به ۴۰۳ تبدیل می‌کند. یافتهٔ ۱۰ آدیت ۲۰۲۶-۰۸-۰۷.
$this->secretaryAccess->denyUnlessGranted($user, 'clinic_doctors', 'delete');
$clinic = $this->clinicRepo->findByUuid($clinicUuid);
if ($clinic === null) {
return $this->error(ErrorCodes::ERR_VALIDATION_002, 'کلینیک یافت نشد', 404);
@@ -58,6 +58,11 @@ class ClinicDoctorPermissionController extends BaseController
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function updatePermissions(string $clinicUuid, string $doctorUuid, Request $request, #[CurrentUser] User $user): JsonResponse
{
// پیش‌چکِ منشی، پیش از واکشیِ رکورد. چکِ اصلی به خودِ شیء نیاز دارد و بالا
// نمی‌رود؛ سهمِ منشی از آن اما همیشه همین توگل است، پس این خط هیچ مسیرِ
// مجازی نمی‌بندد و فقط ۴۰۴ را به ۴۰۳ تبدیل می‌کند. یافتهٔ ۱۰ آدیت ۲۰۲۶-۰۸-۰۷.
$this->secretaryAccess->denyUnlessGranted($user, 'clinic_doctors', 'update');
$clinic = $this->resolveClinic($clinicUuid, $user, 'update');
$doctor = $this->resolveMember($clinic, $doctorUuid);
$perm = $this->permRepo->getOrCreate($clinic, $doctor);