<?php
namespace App\Controller\APIRest\SynerticMobileApp;
// Core app
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\JsonResponse;
// Services
use App\Services\APIRest\Tools\APIResponseTools;
use App\Services\Log\LogMobileAppTools;
use App\Services\LogTools;
use App\Utils\APIError;
// Exceptions
use App\Entity\APIRest\AccessAPI;
use App\Entity\SocietyGroup;
use App\Exception\APIRest\APIAuthenticationException;
use App\Exception\APIRest\APIException;
use Exception;
use Symfony\Component\HttpFoundation\Request;
class SocietyGroupController extends AbstractController
{
public function __construct(
ManagerRegistry $doctrine,
LogTools $logTools,
LogMobileAppTools $logMobileAppTools,
APIResponseTools $apiResponseTools
)
{
$this->em = $doctrine->getManager();
$this->logTools = $logTools;
$this->logMobileAppTools = $logMobileAppTools;
$this->apiResponseTools = $apiResponseTools;
}
public function listSocietyGroups(): JsonResponse
{
try
{
if($this->getUser() instanceof AccessAPI)
{
$accessAPI = $this->getUser();
}
else
{
$this->logMobileAppTools->error(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS), []);
throw new APIAuthenticationException(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS));
}
// Check if user has admin API access (based on tokenExpirationDate and ROLE_ADMIN)
if (!$accessAPI->hasApiAdminAccess())
{
$this->logMobileAppTools->error(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS), []);
throw new APIAuthenticationException(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS));
}
// Get all society groups
$societyGroups = $this->em->getRepository(SocietyGroup::class)->findAll();
$data = [];
foreach ($societyGroups as $group)
{
$data[] = [
'id' => $group->getId(),
'ref' => $group->getRef(),
'name' => $group->getName(),
'isActive' => $group->getIsActive(),
'internalRef' => $group->getInternalRef(),
];
}
return $this->apiResponseTools->successResponse($data);
}
catch (Exception $e)
{
if (!$e instanceof APIException)
{
$this->logMobileAppTools->critical('', $e, []);
$e = new APIException(new APIError(APIError::UNEXPECTED_ERROR));
}
$this->logMobileAppTools->error($e->getApiError(), []);
return $this->apiResponseTools->exceptionResponse($e);
}
}
public function listSocietyGroupUsers(Request $request): JsonResponse
{
try
{
$requestedData = json_decode($request->getContent(), true);
$userAppContext = $this->logMobileAppTools->buildUserAppContext($requestedData);
$this->logMobileAppTools->logApiCall(
$request->getMethod(),
$request->getPathInfo(),
$userAppContext
);
if($this->getUser() instanceof AccessAPI)
{
$accessAPI = $this->getUser();
}
else
{
$this->logMobileAppTools->error(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS), $userAppContext);
throw new APIAuthenticationException(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS));
}
if (!$accessAPI->hasApiAdminAccess())
{
$this->logMobileAppTools->error(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS), $userAppContext);
throw new APIAuthenticationException(new APIError(APIError::AUTHENTICATION_UNAUTHORIZED_ACCESS));
}
$societyGroupId = $requestedData['society_group_id'];
if (empty($societyGroupId))
{
throw new APIException(new APIError(APIError::UNEXPECTED_ERROR, 'society_group_id is required'));
}
$societyGroup = $this->em->getRepository(SocietyGroup::class)->find($societyGroupId);
if ($societyGroup === null)
{
throw new APIException(new APIError(APIError::UNEXPECTED_ERROR, 'Society group not found'));
}
$accesses = $this->em->getRepository(\App\Entity\Access::class)
->findBy(['societyGroup' => $societyGroup]);
$data = [];
foreach ($accesses as $access)
{
$humanResource = $access->getHumanResource();
$function = $access->getFunction();
$society = $access->getSociety();
$accessApi = $access->getAccessApi();
$data[] = [
'id' => $access->getId(),
'email' => $access->getEmail(),
'lastname' => $humanResource ? $humanResource->getLastname() : null,
'firstname' => $humanResource ? $humanResource->getFirstname() : null,
'isActive' => $access->getIsActive(),
'function' => $function ? $function->getName() : null,
'society' => $society ? [
'id' => $society->getId(),
'ref' => $society->getRef(),
'name' => $society->getName(),
] : null,
'accessApiId' => $accessApi ? $accessApi->getId() : null,
];
}
return $this->apiResponseTools->successResponse($data);
}
catch (Exception $e)
{
if (!$e instanceof APIException)
{
$this->logMobileAppTools->critical('', $e, $userAppContext ?? []);
$e = new APIException(new APIError(APIError::UNEXPECTED_ERROR));
}
$this->logMobileAppTools->error($e->getApiError(), $userAppContext ?? []);
return $this->apiResponseTools->exceptionResponse($e);
}
}
}