<?php
namespace App\Controller;
use App\Controller\base\AbstractController;
use App\Entity\UserActivity;
use App\Entity\Location;
use App\Entity\ResetPasswordRequest;
use App\Enum\EntityTypeEnum;
use App\Enum\FilterEnum;
use App\EventListener\LoggableListener;
use App\Interfaces\FormInterface;
use App\Repository\ResetPasswordRequestRepository;
use App\Service\FormService;
use App\Util\JSONParseUtil;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;
use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
/**
* @Route("/admin")
*/
class AdminController extends AbstractController
{
use ResetPasswordControllerTrait;
private $resetPasswordHelper;
private $repository;
private $logger;
public function __construct(
ResetPasswordHelperInterface $resetPasswordHelper,
ResetPasswordRequestRepository $repository,
LoggerInterface $logger
) {
$this->resetPasswordHelper = $resetPasswordHelper;
$this->repository = $repository;
$this->logger = $logger;
}
/**
* @Route("/", name="admin_index")
*/
public function index()
{
if(!($this->isGranted('ROLE_PREVIOUS_ADMIN')) && is_null($this->getUser()->getLastLogin())) {
try {
$resetPasswordRequest = $this->getDoctrine()->getRepository(ResetPasswordRequest::class)->findOneBy(['user' => $this->getUser()->getId()]);
if(!is_null($resetPasswordRequest)) {
$this->repository->remove($resetPasswordRequest);
}
$resetToken = $this->resetPasswordHelper->generateResetToken($this->getUser());
return $this->redirectToRoute('app_reset_password',['token'=> $resetToken->getToken()]);
} catch (ResetPasswordExceptionInterface $e) {
$this->logger->error($e->getMessage());
}
}
if(!$this->getUser()->isHatchAdministrator()){
return $this->redirectToRoute('client_index',['locationId'=> $this->getUser()->getUserLocations()[0]->getLocation()->getId()]);
}
return $this->render('admin/index.html.twig', ['number' => rand()]);
}
/**
* @Route("/activity", name="admin_activity")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function adminActivity(Request $request)
{
if (!$this->getUser()->isHatchAdministrator()) {
return $this->redirectToRoute('client_index', ['locationId' => $this->getUser()->getUserLocations()[0]->getLocation()->getId()]);
}
$dateFrom = $request->query->get('dateFrom');
$dateTo = $request->query->get('dateTo');
if (null === $dateFrom || "" === $dateFrom) {
if ($request->query->get('username') && $request->query->get('userId')) {
return $this->redirectToRoute('admin_activity', [
'dateFrom' => date('Y-m-d', strtotime('-7 days')),
'username' => $request->query->get('username'),
'userId' => $request->query->get('userId'),
]);
} else {
return $this->redirectToRoute('admin_activity', [
'dateFrom' => date('Y-m-d', strtotime('-7 days'))
]);
}
}
if(!$request->get('userFilter')) {
$request->request->set('userFilter', FilterEnum::FILTER_USERS_ALL);
}
$userId =$request->query->get('userId');
$activityData = $this->getDoctrine()
->getRepository(UserActivity::class)
->getByLocationIdBetweenDates(
Location::ADMINISTRATION_OFFICE,
$dateFrom,
$dateTo === null ? $dateTo : date('Y-m-d 23:59:59', strtotime($dateTo)),
$userId,
200
);
$loginCount = [];
$activityCount = [];
/** @var UserActivity $login */ //logins not currently tracked for admin side
foreach ($activityData as $activity) {
$date = $activity->getLoggedAt()->format('Y-m-d');
if ($activity->getAction() !== LoggableListener::ACTION_LOGIN) {
$activityCount[$date] = !isset($activityCount[$date]) ? 1 : $activityCount[$date] + 1;
continue;
}
$loginCount[$date] = !isset($loginCount[$date]) ? 1 : $loginCount[$date] + 1;
$activityCount[$date] = $activityCount[$date] ?? 0;
}
return $this->render('admin/admin_activity.html.twig', [
'loginCount' => $loginCount,
'activityCount' => $activityCount,
'activityData' => $activityData,
]);
}
/**
* @Route("/generate_new_form_change_note/{entityType}/{formId}", name="generate_new_form_change_note", methods={"POST"}, defaults={"formId"=null})
* @param Request $request
* @param int|null $formId
* @param int $entityType
* @param FormService $formService
* @return JsonResponse
*/
public function generateFormChangesNote(Request $request, ?int $formId = null, int $entityType, FormService $formService): JsonResponse
{
$className = EntityTypeEnum::getEntityClassName($entityType);
if ($formId) {
$form = $this->getDoctrine()->getManager()->getRepository($className)->find($formId);
} else {
$form = new $className();
}
$formType = EntityTypeEnum::getTypeName($entityType);
$entityFormType = EntityTypeEnum::getEntityFormTypeClass($entityType);
$oldRelatedForms = $form->getId() ? EntityTypeEnum::getRelatedFormsArray($form) : [];
$oldTags = $form->getId() ? $form->getTags()->toArray() : [];
$oldRegulations = $form->getId() ? $form->getRegulations()->toArray() : [];
$oldLocations = $form->getId() ? $form->getLocations()->toArray() : [];
$allFieldsToDisplay = $form->getId() ? JSONParseUtil::getAllFormFields($form) : [];
$oldFieldsToDisplay = explode(';', $form->getFieldsToDisplay());
$updatedFieldsToDisplay = [];
$requestFormString = EntityTypeEnum::getRequestFormString($entityType);
$formDataArray = $request->request->get($requestFormString);
if (array_key_exists('fieldsToDisplaySelect', $formDataArray)) {
$updatedFieldsToDisplay = $formDataArray['fieldsToDisplaySelect'];
}
$oldFieldsLabels = [];
$updatedFieldsLabels = [];
foreach ($oldFieldsToDisplay as $field) {
$label = JSONParseUtil::findMatchingFieldLabelAndValue($field, $allFieldsToDisplay);
if (!empty($label)) {
$oldFieldsLabels[] = $label[0];
}
}
foreach ($updatedFieldsToDisplay as $field) {
$label = JSONParseUtil::findMatchingFieldLabelAndValue($field, $allFieldsToDisplay);
if (!empty($label)) {
$updatedFieldsLabels[] = $label[0];
}
}
$requestForm = $this->createForm($entityFormType, $form);
$requestForm->handleRequest($request);
try {
$params = [
'entityType' => $entityType,
'oldRelatedForms' => $oldRelatedForms,
'oldTags' => $oldTags,
'oldRegulations' => $oldRegulations,
'oldLocations' => $oldLocations,
'oldFieldsToDisplay' => $oldFieldsLabels,
'updatedFieldsToDisplay' => $updatedFieldsLabels
];
$result = $formService->getFormChangesNotes($form, $formType, $params);
return new JsonResponse($result, Response::HTTP_OK);
} catch (\Exception $exception) {
return new JsonResponse(['error' => $exception->getMessage(),], Response::HTTP_BAD_REQUEST);
}
}
}