<?php
namespace App\Controller\Manager;
use App\Constants;
use App\Entity\Itinerary;
use App\Entity\Sound;
use App\Entity\User;
use App\Form\BatchType;
use App\Form\Model\ChangePassword;
use App\Form\SoundType;
use App\Form\UserPasswordType;
use App\Form\UserType;
use App\Repository\UserRepository;
use App\Security\ItineraryVoter;
use App\Service\UploaderService;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class UserController
* @package App\Controller\Manager
* @Route("/{_locale}")
*/
class UserController extends AbstractManagerController
{
/**
* @Route("/account", name="manager_user_account")
* @param Request $request
* @param UserPasswordEncoderInterface $passwordEncoder
* @return Response
*/
public function account(Request $request, UserPasswordEncoderInterface $passwordEncoder, UserRepository $userRepository): Response
{
$user = $this->getUser();
$users = $this->isGranted(Constants::ROLE_ALLOWED_TO_SWITCH, $user) ? $userRepository->findAll() : [];
$changePasswordModel = new ChangePassword();
$form = $this->createForm(UserPasswordType::class, $changePasswordModel, []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$user->setPassword(
$passwordEncoder->encodePassword(
$user,
$form->get('newPassword')->getData()
)
);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash(Constants::FLASH_SUCCESS, 'user.password.changed');
return $this->redirectToRoute('manager_user_account');
}
return $this->render('manager/manager_user_account.html.twig', [
'user' => $user,
'users' => $users,
'form' => $form->createView(),
]);
}
/**
* @Route("/login", name="manager_user_login")
* @param AuthenticationUtils $authenticationUtils
* @return Response
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('manager/manager_user_login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* @Route("/logout", name="manager_user_logout")
*/
public function logout()
{
return $this->redirectToRoute('manager_user_login');
}
/**
* @Route("/users", name="manager_user_index")
*
* @IsGranted("ROLE_ADMINISTRATOR")
*
* @param Request $request
* @return Response
*/
public function userIndex(UserRepository $userRepository): Response
{
$users = $userRepository->findAll();
return $this->render('manager/manager_user_index.html.twig', [
'users' => $users,
]);
}
/**
* @Route("/users}/create", name="manager_user_create")
*
* @IsGranted("ROLE_ADMINISTRATOR")
*
* @param Request $request
* @return Response
*/
public function userCreate(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
{
$password = md5(random_bytes(10));
$user = new User();
$user->setRoles(['ROLE_USER']);
$user->setPassword($passwordEncoder->encodePassword($user, $password));
$form = $this->createForm(UserType::class, $user, ['isUpdate' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->handleSaveRequest([$user]);
$this->addFlash('success', sprintf('Password: %s', $password));
return $this->redirectToRoute('manager_user_detail', [
'id' => $user->getId(),
]);
}
return $this->render('manager/manager_user_form.html.twig', [
'form' => $form->createView(),
'user' => $user,
]);
}
/**
* @Route("/users/{id}", name="manager_user_detail")
*
* @ParamConverter("user")
*
* @param Request $request
* @param User $user
* @return Response
*/
public function userDetail(Request $request, User $user, TranslatorInterface $translator): Response
{
$form = $this->createForm(UserType::class, $user, ['isUpdate' => true]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get(Constants::FORM_DELETE)->isClicked()) {
if(!$user->getPermissions()->isEmpty()) {
$message = $translator->trans('user.permissions.not.empty', ['%count%' => $user->getPermissions()->count()]);
$this->addFlash('warning', $message);
return $this->redirectToRoute('manager_user_detail', ['id' => $user->getId()]);
}
if(!$user->getItineraries()->isEmpty()) {
$message = $translator->trans('user.itineraries.not.empty', ['%count%' => $user->getItineraries()->count()]);
$this->addFlash('warning', $message);
return $this->redirectToRoute('manager_user_detail', ['id' => $user->getId()]);
}
$this->handleHardDeleteRequest([$user]);
return $this->redirectToRoute('manager_user_index');
}
$this->handleSaveRequest([$user]);
return $this->redirectToRoute('manager_user_detail', [
'id' => $user->getId(),
]);
}
return $this->render('manager/manager_user_form.html.twig', [
'form' => $form->createView(),
'user' => $user,
]);
}
}