<?php
namespace App\Controller\ApiLens;
use App\Entity\LensOverlay;
use App\Entity\User;
use App\Service\SerializeService;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class LensOverlayController
* @package App\Controller\ApiLens
* @Route(path="/api/lens/overlays", name="api_lens_overlays_")
* @IsGranted("ACCESS_LENS")
*/
class LensOverlayController extends AbstractController
{
private EntityManagerInterface $em;
private SerializeService $serializeService;
public function __construct(
EntityManagerInterface $em,
SerializeService $serializeService,
) {
$this->em = $em;
$this->serializeService = $serializeService;
}
/**
* Get all overlays accessible to the authenticated user
* Filters overlays based on user's access rights (isEmenu, isDistrimenu, isBkarte)
*
* @param Request $request
* @return JsonResponse
* @Route("", name="list", methods={"GET"})
*/
public function findAll(Request $request): JsonResponse
{
$baseUrl = $request->getSchemeAndHttpHost();
/** @var User|null $user */
$user = $this->getUser();
if (!$user) {
return new JsonResponse([
'success' => false,
'message' => 'Unauthorized',
], 401);
}
// Get all active overlays
$allOverlays = $this->em->getRepository(LensOverlay::class)->findBy([
'active' => true,
], ['position' => 'ASC']);
$resultOverlays = [];
/** @var LensOverlay $overlay */
foreach ($allOverlays as $overlay) {
// Check if overlay is accessible to this user
if ($this->isOverlayAccessibleToUser($overlay, $user)) {
$resultOverlays[] = $this->serializeService->serializeLensOverlay($overlay, $baseUrl);
}
}
return new JsonResponse([
'success' => true,
'overlays' => $resultOverlays,
'userAccess' => [
'isEmenu' => $user->isEmenu(),
'isDistrimenu' => $user->isDistrimenu(),
'isBkarte' => $user->isBkarte(),
],
]);
}
/**
* Check if an overlay is accessible to a user based on their access rights
*/
private function isOverlayAccessibleToUser(LensOverlay $overlay, User $user): bool
{
// If overlay is visible to all, grant access
if ($overlay->isVisibleForAll()) {
return true;
}
// Check restrictions
if ($overlay->isRestrictedToEmenu() && !$user->isEmenu()) {
return false;
}
if ($overlay->isRestrictedToDistrimenu() && !$user->isDistrimenu()) {
return false;
}
if ($overlay->isRestrictedToBkarte() && !$user->isBkarte()) {
return false;
}
return true;
}
}