Files
ninedad/src/Controller/GroupController.php

181 lines
7.1 KiB
PHP
Raw Normal View History

2025-09-17 09:00:54 +02:00
<?php
namespace App\Controller;
use App\Entity\Group;
use App\Form\GroupType;
use App\Repository\GroupRepository;
use App\Security\GroupVoter;
use Bnine\FilesBundle\Service\FileService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Attribute\Route;
class GroupController extends AbstractController
{
private FileService $fileService;
public function __construct(FileService $fileService)
{
$this->fileService = $fileService;
}
#[Route('/admin/group', name: 'app_admin_group')]
public function list(GroupRepository $groupRepository): Response
{
$groups = $groupRepository->findAll();
return $this->render('group/list.html.twig', [
'usemenu' => true,
'usesidebar' => true,
'title' => 'Liste des Groupes',
'routesubmit' => 'app_admin_group_submit',
'routeupdate' => 'app_admin_group_update',
'groups' => $groups,
]);
}
#[Route('/admin/group/submit', name: 'app_admin_group_submit')]
#[Route('/user/group/submit', name: 'app_user_group_submit')]
public function submit(Request $request, EntityManagerInterface $em): Response
{
$group = new Group();
$group->addUser($this->getUser());
$group->setStatus(Group::ACTIVE);
$this->denyAccessUnlessGranted(GroupVoter::SUBMIT, $group);
$isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin');
$form = $this->createForm(GroupType::class, $group, ['mode' => 'submit']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($group);
$em->flush();
$this->fileService->init('group', $group->getId());
return $this->redirectToRoute($isAdmin ? 'app_admin_group_update' : 'app_user_group_update', ['id' => $group->getId()]);
}
return $this->render('group/edit.html.twig', [
'usemenu' => true,
'usesidebar' => $isAdmin,
'title' => 'Création Groupe',
'routecancel' => $isAdmin ? 'app_admin_group' : 'app_home',
'routedelete' => $isAdmin ? 'app_admin_group_delete' : 'app_user_group_delete',
'mode' => 'submit',
'form' => $form,
]);
}
#[Route('/admin/group/update/{id}', name: 'app_admin_group_update')]
#[Route('/user/group/update/{id}', name: 'app_user_group_update')]
public function update(int $id, Request $request, GroupRepository $groupRepository, EntityManagerInterface $em): Response
{
$group = $groupRepository->find($id);
if (!$group) {
throw new NotFoundHttpException('La ressource demandée est introuvable.');
}
$this->denyAccessUnlessGranted(GroupVoter::UPDATE, $group);
$isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin');
$form = $this->createForm(GroupType::class, $group, ['mode' => 'update']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->flush();
if ($isAdmin) {
return $this->redirectToRoute('app_admin_group');
} else {
return $this->redirectToRoute('app_user_group_view', ['id' => $group->getId()]);
}
}
return $this->render('group/edit.html.twig', [
'usemenu' => true,
'usesidebar' => $isAdmin,
'title' => 'Modification Groupe = '.$group->getTitle(),
'routecancel' => $isAdmin ? 'app_admin_group' : 'app_home',
'routemove' => $isAdmin ? 'app_admin_group_move' : 'app_user_group_move',
'routedelete' => $isAdmin ? 'app_admin_group_delete' : 'app_user_group_delete',
'routesubmitoption' => $isAdmin ? 'app_admin_option_submit' : 'app_user_option_submit',
'routeupdateoption' => $isAdmin ? 'app_admin_option_update' : 'app_user_option_update',
'mode' => 'update',
'form' => $form,
'group' => $group,
]);
}
#[Route('/admin/group/moveto/{id}/{status}', name: 'app_admin_group_move')]
#[Route('/user/group/moveto/{id}/{status}', name: 'app_user_group_move')]
public function move(int $id, string $status, Request $request, GroupRepository $groupRepository, EntityManagerInterface $em): Response
{
$group = $groupRepository->find($id);
if (!$group) {
throw new NotFoundHttpException('La ressource demandée est introuvable.');
}
2025-09-18 11:40:18 +02:00
$attribute = constant(GroupVoter::class.'::MOVETO'.$status);
2025-09-17 09:00:54 +02:00
$this->denyAccessUnlessGranted($attribute, $group);
$group->setStatus(constant(Group::class.'::'.$status));
$em->flush();
$isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin');
return $this->redirectToRoute($isAdmin ? 'app_admin_group' : 'app_user_group_view', ['id' => $group->getId()]);
}
#[Route('/admin/group/delete/{id}', name: 'app_admin_group_delete')]
#[Route('/user/group/delete/{id}', name: 'app_user_group_delete')]
public function delete(int $id, Request $request, GroupRepository $groupRepository, EntityManagerInterface $em): Response
{
$group = $groupRepository->find($id);
if (!$group) {
throw new NotFoundHttpException('La ressource demandée est introuvable.');
}
$this->denyAccessUnlessGranted(GroupVoter::DELETE, $group);
$isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin');
// Tentative de suppression
try {
$em->remove($group);
$em->flush();
} catch (\Exception $e) {
$this->addflash('error', $e->getMessage());
}
return $this->redirectToRoute($isAdmin ? 'app_admin_group' : 'app_home');
}
#[Route('/user/group/view/{id}', name: 'app_user_group_view')]
public function view(int $id, Request $request, GroupRepository $groupRepository, EntityManagerInterface $em): Response
{
$group = $groupRepository->find($id);
if (!$group) {
throw new NotFoundHttpException('La ressource demandée est introuvable.');
}
$this->denyAccessUnlessGranted(GroupVoter::VIEW, $group);
$isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin');
return $this->render('group/view.html.twig', [
'usemenu' => true,
'usesidebar' => false,
'title' => 'Group = '.$group->getTitle(),
'routeupdate' => $isAdmin ? 'app_admin_group_update' : 'app_user_group_update',
'routecancel' => $isAdmin ? 'app_admin_group' : 'app_home',
'routedelete' => $isAdmin ? 'app_admin_group_delete' : 'app_user_group_delete',
'routemove' => $isAdmin ? 'app_admin_group_move' : 'app_user_group_move',
'group' => $group,
]);
}
}