<?php
namespace App\Controller;
use App\Entity\Group;
use App\Entity\Register;
use App\Service\DebugLogService;
use App\Service\Home\DataDashboardService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
class HomeController extends AbstractController
{
public function __construct(
private EntityManagerInterface $em,
private RequestStack $requestStack,
private DebugLogService $debugLogService,
private DataDashboardService $dds,
) {
}
#[Route('', name: 'app_')]
public function home()
{
return $this->redirectToRoute('app_login');
}
#[Route(
'/{_locale}/home',
name: 'app_home',
requirements: ['_locale' => '%app.supported_locales%']
)]
public function index(Request $request)
{
/** @var \App\Entity\User $logged_user */
$logged_user = $this->getUser();
$session = $this->requestStack->getSession();
if ($request->request->has('group')) {
// Añadir grupo a session
$group = $this->em->getRepository(Group::class)->find($request->request->get('group'));
$coordinator = $group->getCoordinator();
if ($coordinator != null) {
if ($logged_user->getId() === $coordinator->getId()) {
$session->set('coordinator', 1);
} else {
$session->set('coordinator', 0);
}
} else {
$session->set('coordinator', 0);
}
$session->set('group', $group);
} elseif ($request->request->has('option')) {
$session->remove('group');
$acting_as = $request->request->get('option');
if ($acting_as == "2") {
return $this->redirectToRoute('app_choose_group');
}
}
return $this->render('home/index.html.twig', []);
}
#[Route(
'/{_locale}/home/data',
name: 'app_data',
requirements: ['_locale' => '%app.supported_locales%']
)]
public function homeData(Security $security)
{
$tag = $this->getTag('[/info]');
$start = microtime(true);
// $this->print($tag . 'START');
// $this->debugLogService->mem($tag, 'START-MEM');
$user = $security->getUser();
$group = $this->requestStack->getSession()->get('group');
$result = $this->dds->buildDataDashboard($user, $group);
// $this->debugLogService->mem($tag, 'DONE-MEM');
$this->print($tag . ' DONE - time: ' . round((microtime(true) - $start) * 1000) . ' ms' . PHP_EOL);
return $this->render('data/index.html.twig', $result);
}
#[Route(
'/{_locale}/actAs',
name: 'app_actAs',
requirements: ['_locale' => '%app.supported_locales%'],
methods: ['GET']
)]
public function actAs(Request $request): Response
{
/** @var \App\Entity\User $logged_user */
$logged_user = $this->getUser();
$session = $this->requestStack->getSession();
// $session->clear();
if (
in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles()) ||
in_array('ROLE_OFFICE', $this->getUser()->getRoles()) ||
in_array('ROLE_ENDORSING_OFFICE', $this->getUser()->getRoles())
) {
return $this->redirectToRoute('app_home');
// return $this->render('home/index.html.twig');
}
if ($logged_user->getGroupUsers()->isEmpty()) {
$groups = '0';
} else {
$groups = '1';
}
return $this->render('home/actAs.html.twig', [
'groups' => $groups,
]);
}
#[Route(
'/{_locale}/choose_group',
name: 'app_choose_group',
requirements: ['_locale' => '%app.supported_locales%']
)]
public function chooseGroup(): Response
{
/** @var \App\Entity\User $logged_user */
$logged_user = $this->getUser();
$groupusers = $logged_user->getGroupUsers();
$groups = [];
for ($i = 0; $i < count($groupusers); $i++) {
$group_id = $groupusers[$i]->getGroupId();
$group = $this->em->getRepository(Group::class)->find($group_id);
$groups[] = $group;
}
// dd($groups);
return $this->render('home/choose_group.html.twig', [
'groups' => $groups,
]);
}
/**
* Funcion auxiliar para escribir en "debug.log"
*/
private function print(string $message): void
{
$enable_prints = true; // en producción "false"
if ($enable_prints) {
$this->debugLogService->logDebug($message);
// $this->debugLogService->mem('TEST', $message);
}
}
/**
* Auxiliary function to format TAG
*/
private function getTag(string $str_base)
{
$tag = '[DP]' . $str_base;
/** @var \App\Entity\User $logged_user */
$logged_user = $this->getUser();
$session = $this->requestStack->getSession();
if ($session->has('group')) {
$owner_group = $session->get('group');
$tag = '[G:' . $owner_group->getCode() . ']' . $tag;
// } else {
// $owner_ringer = $logged_user->getRinger();
// $tag = $tag . '[' . $owner_ringer . ']';
}
$tag = '[U:' . $logged_user->getId() . ']' . $tag;
if ($logged_user->getRoles()[0] == "ROLE_OFFICE") {
$tag = $tag . '[OFFICE]';
// } else {
// $tag = $tag . '[USER]: ';
}
return $tag . ': ';
}
}