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
@@ -38,6 +38,8 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
#[IsGranted('IS_AUTHENTICATED_FULLY')]
class ResourceBlockController extends BaseController
{
use \App\Shared\Controller\PermissionGateTrait;
public function __construct(
private readonly ClinicResourceRepository $resources,
private readonly ResourceOccupancyRepository $occupancy,
@@ -63,6 +65,11 @@ class ResourceBlockController extends BaseController
#[Route('/api/v1/resource/{uuid}/blocks', name: 'resource_block_create', methods: ['POST'])]
public function create(#[CurrentUser] User $user, string $uuid, Request $request): JsonResponse
{
// پیش‌چکِ منشی، پیش از واکشیِ رکورد. چکِ اصلی به خودِ شیء نیاز دارد و بالا
// نمی‌رود؛ سهمِ منشی از آن اما همیشه همین توگل است، پس این خط هیچ مسیرِ
// مجازی نمی‌بندد و فقط ۴۰۴ را به ۴۰۳ تبدیل می‌کند. یافتهٔ ۱۰ آدیت ۲۰۲۶-۰۸-۰۷.
$this->denySecretaryWithout($user, 'resources', 'create');
$resource = $this->requireResource($user, $uuid);
$data = json_decode($request->getContent(), true);
@@ -105,6 +112,11 @@ class ResourceBlockController extends BaseController
#[Route('/api/v1/resource-block/{uuid}', name: 'resource_block_delete', methods: ['DELETE'])]
public function delete(#[CurrentUser] User $user, string $uuid): JsonResponse
{
// پیش‌چکِ منشی، پیش از واکشیِ رکورد. چکِ اصلی به خودِ شیء نیاز دارد و بالا
// نمی‌رود؛ سهمِ منشی از آن اما همیشه همین توگل است، پس این خط هیچ مسیرِ
// مجازی نمی‌بندد و فقط ۴۰۴ را به ۴۰۳ تبدیل می‌کند. یافتهٔ ۱۰ آدیت ۲۰۲۶-۰۸-۰۷.
$this->denySecretaryWithout($user, 'resources', 'delete');
$block = $this->occupancy->findOneBy(['uuid' => $uuid]);
[$entityType, $entityId] = $this->branches->pair($user);