Files
cmtracker/src/Controller/AdminController.php
Ryan Prather 4ccbd90bad Removed job parameter from the User class and replaced it with additional "roles"
Replaed nav links with class constant NavLinks for easier updating
Moved listCases method to CaseController
2024-12-02 23:57:25 -05:00

242 lines
8.2 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\Supervision;
use App\Entity\User;
use App\Form\EditUserFormType;
use App\Form\SupervisorFormType;
use App\Form\UserFormType;
use App\Libs\NavList;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\Component\Security\Http\Attribute\IsGranted;
#[IsGranted('ROLE_ADMIN')]
class AdminController extends AbstractController
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly UserPasswordHasherInterface $userPasswordHasher,
private array $navLinks = []
) {
$this->navLinks = NavList::LIST;
}
#[Route('/admin-dashboard', name: 'app_admin_dashboard')]
public function adminDashboard(#[CurrentUser()] User $user): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->navLinks['admin_dashboard'] = 'nav-link text-white active bg-gradient-dark';
return $this->render(
'internal/admin/admin-dashboard.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Admin Dashboard'
],
'notifications' => $user->retrieveUnreadNotifications(),
]
)
);
}
#[Route('/list-users', name: 'app_list_users')]
public function listUsers(#[CurrentUser()] User $user): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
/** @var UserRepository $repo */
$repo = $this->entityManager->getRepository(User::class);
$users = $repo->getCompanyUsers($user->getCompany());
/** @var SupervisionRepository $supRepo */
$supRepo = $this->entityManager->getRepository(Supervision::class);
foreach ($users as $idx => $user) {
$supervisor = $supRepo->getSupervisorByWorker($user);
$users[$idx]->setSupervisor($supervisor);
}
$this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
return $this->render(
'internal/admin/users/list-users.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'User List'
],
'users' => $users,
'notifications' => $user->retrieveUnreadNotifications(),
]
)
);
}
#[Route('/add-user', name: 'app_add_user')]
public function addUser(Request $request, #[CurrentUser()] User $admin): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$user = new User();
$form = $this->createForm(UserFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$plainPassword = $form->get('password')->getData();
$roles = ['ROLE_USER'];
if ($form->get('caseWorker')->getData()) {
$roles[] = 'ROLE_CASE_WORKER';
}
if ($form->get('caseManager')->getData()) {
$roles[] = 'ROLE_CASE_MANAGER';
}
if ($form->get('therapist')->getData()) {
$roles[] = 'ROLE_THERAPIST';
}
if ($form->get('su')->getData()) {
$roles[] = 'ROLE_ADMIN';
}
$user->setUsername($form->get('username')->getData())
->setPassword(
$this->userPasswordHasher->hashPassword(
$user,
$plainPassword
)
)
->setName($form->get('name')->getData())
->setEmail($form->get('email')->getData())
->setRoles($roles)
->setRateType($form->get('rateType')->getData())
->setRate($form->get('rate')->getData())
->setLevel($form->get('level')->getData())
->setCompany($admin->getCompany());
$this->entityManager->persist($user);
$this->entityManager->flush();
return $this->redirectToRoute('app_list_users');
}
$this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
return $this->render(
'internal/admin/users/add-user.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Add User'
],
'form' => $form,
'notifications' => $admin->retrieveUnreadNotifications(),
]
)
);
}
#[Route('/edit-user/{id}', name: 'app_edit_user')]
public function editUser(string $id, Request $request, #[CurrentUser()] User $admin): Response
{
/** @var UserRepository $userRepo */
$userRepo = $this->entityManager->getRepository(User::class);
/** @var User $user */
$user = $userRepo->find($id);
$form = $this->createForm(EditUserFormType::class, $user);
$form->handleRequest($request);
$this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
if ($form->isSubmitted() && $form->isValid()) {
$user->setName($form->get('name')->getData())
->setEmail($form->get('email')->getData())
->setCaseWorker($form->get('caseWorker')->getData())
->setCaseManager($form->get('caseManager')->getData())
->setTherapist($form->get('therapist')->getData())
->setSu($form->get('su')->getData())
->setRateType($form->get('rateType')->getData())
->setRate($form->get('rate')->getData())
->setLevel($form->get('level')->getData());
$this->entityManager->persist($user);
$this->entityManager->flush();
return $this->redirectToRoute('app_list_users');
}
return $this->render(
'internal/admin/users/edit-user.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Edit User'
],
'data' => $user,
'form' => $form,
'notifications' => $admin->retrieveUnreadNotifications(),
]
)
);
}
#[Route('/assign-supervisor/{id}', name: 'app_assign_supervisor')]
public function assignSupervisor(string $id, Request $request, #[CurrentUser()] User $admin): Response
{
/** @var UserRepository $userRepo */
$userRepo = $this->entityManager->getRepository(User::class);
/** @var User $user */
$user = $userRepo->find($id);
$form = $this->createForm(SupervisorFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$supervisor = $form->get('supervisor')->getData();
$sup = new Supervision();
$sup->setSupervisor($supervisor);
$sup->setWorker($user);
$this->entityManager->persist($sup);
$this->entityManager->flush();
return $this->redirectToRoute('app_list_users');
}
return $this->render(
'internal/admin/assign-supervisor.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Assign Supervisor'
],
'data' => $user,
'form' => $form,
'supervisors' => $userRepo->getCaseManagers($admin->getCompany()),
'notifications' => $admin->retrieveUnreadNotifications(),
]
)
);
}
}