<?php
namespace App\Controller\Ecommerce\Profile;
use App\Entity\Roles;
use App\Entity\RolesAuthorizedActions;
use App\Entity\UserEstablishment;
use App\Repository\UserEstablishmentRepository;
use App\Repository\UsersRepository;
use App\Repository\RolesRepository;
use App\Repository\UserStatusRepository;
use App\Repository\AuthorizedActionsRepository;
use App\Repository\RolesAuthorizedActionsRepository;
use App\Service\MailerService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use DateTime;
/**
* @Route("/ecommerce/profile/team", name="ecommerce_profile_team_")
*/
class EcommerceTeamController extends AbstractController
{
public function __construct(
usersRepository $usersRepository,
RolesRepository $rolesRepository,
UserEstablishmentRepository $userEstablishmentRepository,
UserStatusRepository $userStatusRepository,
AuthorizedActionsRepository $authorizedActionsRepository,
RolesAuthorizedActionsRepository $rolesAuthorizedActionsRepository,
EntityManagerInterface $entityManager,
MailerService $mailerService
) {
$this->usersRepository = $usersRepository;
$this->rolesRepository = $rolesRepository;
$this->userStatusRepository = $userStatusRepository;
$this->userEstablishmentRepository = $userEstablishmentRepository;
$this->authorizedActionsRepository = $authorizedActionsRepository;
$this->rolesAuthorizedActionsRepository = $rolesAuthorizedActionsRepository;
$this->entityManager = $entityManager;
$this->mailerService = $mailerService;
}
/**
* @Route("/", name="index")
*/
public function index(): Response
{
$roles = $this->rolesRepository->findBy(['establishment' => $this->getUser()->getConnectedAt(), 'deleted' => false]);
$actions = $this->authorizedActionsRepository->findBy(['deleted'=>false]);
return $this->render('ecommerce/profile/team.html.twig', [
'roles' => $roles,
'actions' => $actions
]);
}
/**
* @Route("/list", name="list")
*/
public function list(): Response
{
$team = $this->userEstablishmentRepository->findBy(['deleted' => false, 'establishment' => $this->getUser()->getConnectedAt()]);
$return = $this->renderView('ecommerce/profile/team-list.html.twig', [
'team' => $team ?? null,
]);
return new JsonResponse([
'status' => 200,
'html' => $return
]);
}
/**
* @Route("/roles", name="roles")
*/
public function roles(): Response
{
$roles = $this->rolesRepository->findBy(['establishment' => $this->getUser()->getConnectedAt(), 'deleted' => false]);
$actions = $this->authorizedActionsRepository->findBy(['deleted'=>false]);
return $this->render('ecommerce/profile/team-list-roles.html.twig', [
'roles' => $roles,
'actions' => $actions
]);
}
/**
* @Route("/select-role", name="select_role")
*/
public function selectRole(): Response
{
$roles = $this->rolesRepository->findBy(['establishment' => $this->getUser()->getConnectedAt(), 'deleted' => false]);
return $this->render('ecommerce/profile/select-role.html.twig', [
'roles' => $roles,
]);
}
/**
* @Route("/delete", name="delete")
*/
public function delete(Request $request): Response
{
$userEstablishment = $this->userEstablishmentRepository->find($request->get('userEstablishment'));
$userEstablishment->setDeleted(true);
$this->entityManager->persist($userEstablishment);
$this->entityManager->flush();
return new JsonResponse([
'status' => 200,
'comment' => 'Deletion saved'
]);
}
/**
* @Route("/add", name="add")
*/
public function add(Request $request): Response
{
$role = $this->rolesRepository->find($request->get('role'));
$user = $this->usersRepository->findOneBy(['email' => $request->get('email')]);
$linkExist = $this->userEstablishmentRepository->findOneBy(['deleted' => false, 'establishment' => $this->getUser()->getConnectedAt(), 'user' => $user]);
if(!$linkExist && $user){
$newUserEstablishment = new UserEstablishment();
$newUserEstablishment->setUser($user);
$newUserEstablishment->setEstablishment($this->getUser()->getConnectedAt());
$newUserEstablishment->setRole($role);
$this->entityManager->persist($newUserEstablishment);
$this->entityManager->flush();
$params = [
'establishment' => $this->getUser()->getConnectedAt()->getName(),
'status' => $role->getName()
];
$this->mailerService->load(
$params,
'd-b5de2d1cf2c6498d82a6d0ca8ce684c7',
$user
);
return new JsonResponse([
'status' => 200,
'comment' => 'user add saved'
]);
}
else{
return new JsonResponse([
'status' => 200,
]);
}
}
/**
* @Route("/filter-users", name="filter_users", methods={"GET"})
*/
public function filterResponsible(Request $request): Response
{
$idOrName = strtolower($request->get('idOrName')["term"]);
$users = $this->usersRepository->filterResponsible($idOrName);
json_encode($users, JSON_HEX_QUOT | JSON_HEX_APOS);
return new JsonResponse(['data' => $users]);
}
/**
* @Route("/add-action", name="add_action", methods={"POST"})
*/
public function addAction(Request $request): Response
{
$role = $this->rolesRepository->find($request->get('role'));
$action = $this->authorizedActionsRepository->find($request->get('action'));
$roleAction = $this->rolesAuthorizedActionsRepository->findBy(['authorizedAction' => $action, 'role'=> $role]);
if($roleAction){
return new JsonResponse(['comment' => "action already add", 'data' => true], Response::HTTP_OK);
}
$roleAction = new RolesAuthorizedActions();
$roleAction->setRole($role);
$roleAction->setAuthorizedAction($action);
$this->entityManager->persist($roleAction);
$this->entityManager->flush();
return new JsonResponse(['comment' => "action updated", 'data' => false], Response::HTTP_OK);
}
/**
* @Route("/delete-action", name="delete_action", methods={"POST"})
*/
public function deleteRoleAction(Request $request): JsonResponse
{
$role = $this->rolesAuthorizedActionsRepository->find($request->get('id'));
if (!$role)
return new JsonResponse(["error" => "The role could ne be found"], Response::HTTP_NOT_FOUND);
$role->setDeleted(true);
$this->entityManager->persist($role);
$this->entityManager->flush();
return new JsonResponse(["action deleted" => true], Response::HTTP_OK);
}
/**
* @Route("/delete-role", name="delete_role", methods={"POST"})
*/
public function deleteRole(Request $request): Response
{
$role = $this->rolesRepository->find($request->get('id'));
if (!$role)
return new JsonResponse(["error" => "The role could ne be found"], Response::HTTP_NOT_FOUND);
$role->setDeleted(true);
$this->entityManager->persist($role);
$this->entityManager->flush();
return new JsonResponse(["role deleted" => true], Response::HTTP_OK);
}
/**
* @Route("/create-role", name="create_role", methods={"POST"})
*/
public function createRole(Request $request): Response
{
$role = new Roles();
$role->setName($request->get('name'));
$role->setEstablishment($this->getUser()->getConnectedAt());
$this->entityManager->persist($role);
$actions = json_decode($request->get('actions'));
foreach ($actions as $actionId)
{
$roleAuthorizedAction = new RolesAuthorizedActions();
$roleAuthorizedAction->setRole($role);
$action = $this->authorizedActionsRepository->find($actionId);
$roleAuthorizedAction->setAuthorizedAction($action);
$this->entityManager->persist($roleAuthorizedAction);
}
$this->entityManager->flush();
return new JsonResponse(['role created' => true], Response::HTTP_OK);
}
/**
* @Route("/modify", name="modify", methods={"POST"})
*/
public function modify(Request $request): Response
{
$user = $this->usersRepository->find($request->get('user'));
$role = $this->rolesRepository->find($request->get('role'));
$userEstablishment = $this->userEstablishmentRepository->findOneBy(['deleted' => false, 'user' => $user, 'establishment' =>$this->getUser()->getConnectedAt()]);
if($userEstablishment->getRole() !== $role){
$userEstablishment->setRole($role);
$this->entityManager->persist($userEstablishment);
$this->entityManager->flush();
}
return new JsonResponse(['role updated' => true], Response::HTTP_OK);
}
}