Files
vision/src/Controller/DirectoryController.php
2022-04-29 14:30:04 +00:00

301 lines
11 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\Directory;
use App\Form\DirectoryType;
use App\Form\SearchBarType;
use App\Repository\DocumentRepository;
use App\Repository\DirectoryRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\CertificateRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
#[Route('/directory', name: 'directory_')]
class DirectoryController extends AbstractController
{
#[Route('/', name: 'list')]
#[Route('/wanted', name: 'list_wanted')]
#[Route('/dead', name: 'list_dead')]
public function list(
PaginatorInterface $paginator,
Request $request,
DirectoryRepository $DirectoryRepository
): Response {
$searchForm = $this->createForm(SearchBarType::class);
$searchForm->handleRequest($request);
$req = $DirectoryRepository
->list()
->order(['createdAt' => 'DESC'])
->search(
(
$searchForm->isSubmitted()
&& $searchForm->isValid()
&& $searchForm->getData()['subject'] !== null
) ? $searchForm->getData()['subject'] : null
);
if ($request->attributes->get('_route') == 'directory_list_wanted') {
$req->wanted();
}
if ($request->attributes->get('_route') == 'directory_list_dead') {
$req->dead();
} else {
$req->notDead();
}
$pagination = $paginator->paginate(
$req->getResult(),
$request->query->getInt('page', 1)
);
return $this->render('directory/list.html.twig', [
'controller_name' => 'DirectoryController',
'pagination' => $pagination,
'searchForm' => $searchForm->createView(),
'wanted' => ($request->attributes->get('_route') == 'directory_list_wanted'),
'dead' => ($request->attributes->get('_route') == 'directory_list_dead')
]);
}
#[Route('/view/{id}', name: 'view')]
public function view(Directory $Directory): Response
{
$entityManager = $this->getDoctrine()->getManager();
$DocumentList = [
'Certificate',
'Complaint',
'Licencewithdrawal',
'Infringement',
'Jail',
'Bracelet',
'Criminal',
'Stolenvehicle',
'Medical'
];
$RenderArray = [
'controller_name' => 'DirectoryController',
'directory' => $Directory,
];
foreach ($DocumentList as $key => $dType) {
/**
* Use Certificate as example for IDE
* @var CertificateRepository $repo
*/
$repo = $entityManager->getRepository('App\Entity\\' . $dType);
$RenderArray[$dType] = $repo->listForUser($this->getUser())
->limitDirectory($Directory)
->order(['createdAt' => 'DESC'])
->limit(4)
->getResult();
}
return $this->render('directory/view.html.twig', $RenderArray);
}
#[Route('/create', name: 'create')]
public function create(Request $request): Response
{
$Directory = new Directory();
if (!$this->IsGranted('create', $Directory)) {
throw new AccessDeniedHttpException('granted_not_allowed_creating_directory');
}
$form = $this->createForm(DirectoryType::class, $Directory);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($Directory);
try {
$entityManager->flush();
} catch (\Throwable $th) {
if ($_ENV['APP_ENV'] === 'dev') {
throw $th; //DEBUG
}
$this->addFlash('danger', 'alert_error_creating_directory');
return $this->redirectToRoute($request->getRequestUri());
}
$this->addFlash('success', 'alert_success_creating_directory');
return $this->redirectToRoute('directory_view', ['id' => $Directory->getId()]);
}
return $this->render('directory/create.html.twig', [
'controller_name' => 'DirectoryController',
'directory' => $Directory,
'form' => $form->createView()
]);
}
#[Route('/edit/{id}', name: 'edit')]
#[IsGranted('edit', subject: 'Directory', message: 'granted_not_allowed_editing_directory')]
public function edit(Request $request, Directory $Directory): Response
{
$form = $this->createForm(DirectoryType::class, $Directory);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($Directory);
try {
$entityManager->flush();
} catch (\Throwable $th) {
if ($_ENV['APP_ENV'] === 'dev') {
throw $th; //DEBUG
}
$this->addFlash('danger', 'alert_error_editing_directory');
return $this->redirectToRoute($request->getRequestUri());
}
$this->addFlash('success', 'alert_success_editing_directory');
return $this->redirectToRoute('directory_view', ['id' => $Directory->getId()]);
}
return $this->render('directory/edit.html.twig', [
'controller_name' => 'DirectoryController',
'directory' => $Directory,
'form' => $form->createView()
]);
}
#[Route('/delete/{id}', name: 'delete')]
#[IsGranted('delete', subject: 'Directory', message: 'granted_not_allowed_deleting_directory')]
public function delete(Directory $Directory): Response
{
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($Directory);
try {
$entityManager->flush();
} catch (\Throwable $th) {
if ($_ENV['APP_ENV'] === 'dev') {
throw $th; //DEBUG
}
$this->addFlash('warning', 'alert_error_deleting_directory');
return $this->redirectToRoute('directory_view', ['id' => $Directory->getId()]);
}
$this->addFlash('success', 'alert_success_deleting_directory');
return $this->redirectToRoute('directory_list');
}
#[Route('/merge/router', name: 'merge_router')]
public function directoryMergeRouter(Request $Request): Response
{
if (empty($Request->request->get('directory-main')) || is_null($Request->request->get('directory-main'))) {
return $this->redirectToRoute('directory_list'); //id not found = redirect to list
}
if (empty($Request->request->get('directory-child')) || is_null($Request->request->get('directory-child'))) {
return $this->redirectToRoute('directory_list'); //id not found = redirect to list
}
return $this->redirectToRoute(
'directory_merge',
[
'keeped' => $Request->request->get('directory-main'),
'deleted' => $Request->request->get('directory-child')
]
);
}
#[Route('/merge/{deleted}/{keeped}', name: 'merge')]
#[IsGranted('delete', subject: 'keeped', message: 'granted_not_allowed_merging_directory')]
public function merge(
Directory $deleted,
Directory $keeped,
Request $Request,
EntityManagerInterface $EntityManagerInterface
): Response {
$base = clone $keeped;
// 1 : merge info before validation for display
$classMetadata = $EntityManagerInterface->getClassMetadata(Directory::class);
foreach ($classMetadata->getFieldNames() as $key => $f) {
if (
is_null($classMetadata->getFieldValue($keeped, $f))
&& !is_null($classMetadata->getFieldValue($deleted, $f))
) {
$classMetadata->setFieldValue($keeped, $f, $classMetadata->getFieldValue($deleted, $f));
}
}
if (null != ($Request->request->get('validatemerge')) && !empty($Request->request->get('validatemerge'))) {
//after validation
// 2 : check foreing keys
$entityManager = $this->getDoctrine()->getManager();
foreach ($classMetadata->getAssociationMappings() as $key => $associationMapping) {
//get mappings of deleted entity
$mappings = $classMetadata->getFieldValue($deleted, $associationMapping['fieldName']);
if (is_a($mappings, 'Doctrine\ORM\PersistentCollection')) {
//if mapping is a Collection
foreach ($mappings as $mapping) {
if (is_object($mapping) && method_exists($mapping, 'setDirectory')) {
$mapping->setDirectory($keeped);
}
}
} else {
$entityManager->initializeObject($mappings);
if (is_object($mappings) && method_exists($mappings, 'addDirectory')) {
$mappings->addDirectory($keeped);
}
}
}
$entityManager->persist($keeped);
try {
$entityManager->flush();
} catch (\Throwable $th) {
if ($_ENV['APP_ENV'] === 'dev') {
throw $th; //DEBUG
}
$this->addFlash('danger', 'alert_error_merging_directory');
return $this->redirectToRoute('directory_view', ['id' => $deleted->getId()]);
}
$entityManager->refresh($deleted); //refresh entity after flushing, to avoid deleting mappings
$deletedId = $deleted->getId();
$entityManager->remove($deleted);
//dd($deleted);
try {
$entityManager->flush();
} catch (\Throwable $th) {
if ($_ENV['APP_ENV'] === 'dev') {
throw $th; //DEBUG
}
$this->addFlash('danger', 'alert_error_merging_directory');
return $this->redirectToRoute('directory_view', ['id' => $deletedId]);
}
$this->addFlash('success', 'alert_success_merging_directory');
return $this->redirectToRoute('directory_view', ['id' => $keeped->getId()]);
}
return $this->render('directory/merge.html.twig', [
'controller_name' => 'DirectoryController',
'baseDirectory' => $base,
'keepedDirectory' => $keeped,
'deletedDirectory' => $deleted
]);
}
}