diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index 5cffd8c..3fee068 100644 --- a/README.md +++ b/README.md @@ -93,4 +93,6 @@ Pas de commandes. ### Question 14 ```bash symfony console doctrine:fixtures:load -``` \ No newline at end of file +``` + +### Question 15 \ No newline at end of file diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 8196f0a..d6ee356 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -10,6 +10,7 @@ security: class: App\Entity\User property: email role_hierarchy: + ROLE_ADMINISTRATEUR: [ROLE_INSTRUCTOR, ROLE_APPRENTI, ROLE_USER] ROLE_INSTRUCTOR: ROLE_USER ROLE_APPRENTI: ROLE_USER firewalls: diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 73da5ac..3269b24 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -13,7 +13,7 @@ class SecurityController extends AbstractController public function login(AuthenticationUtils $authenticationUtils): Response { if ($this->getUser()) { - return $this->redirectToRoute('app_atelier_index'); + return $this->redirectToRoute('app_index'); } // get the login error if there is one diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php new file mode 100644 index 0000000..94b2cc8 --- /dev/null +++ b/src/Controller/UserController.php @@ -0,0 +1,80 @@ +render('user/index.html.twig', [ + 'users' => $userRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_user_new', methods: ['GET', 'POST'])] + public function new(Request $request, UserRepository $userRepository): Response + { + $user = new User(); + $form = $this->createForm(UserType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $userRepository->save($user, true); + + return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->renderForm('user/new.html.twig', [ + 'user' => $user, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_user_show', methods: ['GET'])] + public function show(User $user): Response + { + return $this->render('user/show.html.twig', [ + 'user' => $user, + ]); + } + + #[Route('/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, User $user, UserRepository $userRepository): Response + { + $form = $this->createForm(UserType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $userRepository->save($user, true); + + return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->renderForm('user/edit.html.twig', [ + 'user' => $user, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_user_delete', methods: ['POST'])] + public function delete(Request $request, User $user, UserRepository $userRepository): Response + { + if ($this->isCsrfTokenValid('delete' . $user->getId(), $request->request->get('_token'))) { + $userRepository->remove($user, true); + } + + return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php index e56617c..9db0d01 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -83,9 +83,9 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface { $roles = $this->roles; // guarantee every user at least has ROLE_USER - $roles[] = 'ROLE_USER'; - $roles[] = 'ROLE_INSTRUCTOR'; - $roles[] = 'ROLE_APPRENTI'; + if (sizeof($roles) == 0) { + $roles[] = "ROLE_APPRENTI"; + } return array_unique($roles); } diff --git a/src/Form/UserType.php b/src/Form/UserType.php new file mode 100644 index 0000000..49ed12b --- /dev/null +++ b/src/Form/UserType.php @@ -0,0 +1,52 @@ +add('email') + ->add('roles', ChoiceType::class, [ + 'choices' => [ + 'Apprenti' => 'ROLE_APPRENTI', + 'Instructeur' => 'ROLE_INSTRUCTOR', + 'Admin' => 'ROLE_ADMINISTRATEUR' + ], + 'required' => true, + 'multiple' => false, + 'expanded' => false, + ]) + ->add('nom') + ->add('prenom'); + + $builder->get('roles') + ->addModelTransformer(new CallbackTransformer( + function ($rolesArray) { + // transform the array to a string + return count($rolesArray)? $rolesArray[0]: null; + }, + function ($rolesString) { + // transform the string back to an array + return [$rolesString]; + } + )); + + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Security/AppAuthentificatorAuthenticator.php b/src/Security/AppAuthentificatorAuthenticator.php index 946b252..7ca73ed 100644 --- a/src/Security/AppAuthentificatorAuthenticator.php +++ b/src/Security/AppAuthentificatorAuthenticator.php @@ -46,7 +46,7 @@ class AppAuthentificatorAuthenticator extends AbstractLoginFormAuthenticator return new RedirectResponse($targetPath); } - return new RedirectResponse($this->urlGenerator->generate('app_atelier_index')); + return new RedirectResponse($this->urlGenerator->generate('app_index')); } protected function getLoginUrl(Request $request): string diff --git a/templates/components/navbar.html.twig b/templates/components/navbar.html.twig index a590160..b0d18df 100644 --- a/templates/components/navbar.html.twig +++ b/templates/components/navbar.html.twig @@ -13,16 +13,22 @@ - {% if app.user %} + + {% if app.user and is_granted('ROLE_INSTRUCTOR') %} {% endif %} - {% if app.user %} + {% if app.user and is_granted('ROLE_APPRENTI') %} {% endif %} + {% if app.user and is_granted('ROLE_ADMINISTRATEUR') %} + + {% endif %} {% if app.user %} diff --git a/templates/user/_delete_form.html.twig b/templates/user/_delete_form.html.twig new file mode 100644 index 0000000..6d59fa6 --- /dev/null +++ b/templates/user/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/user/_form.html.twig b/templates/user/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/user/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/user/edit.html.twig b/templates/user/edit.html.twig new file mode 100644 index 0000000..141d94a --- /dev/null +++ b/templates/user/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit User{% endblock %} + +{% block body %} +

Edit User

+ + {{ include('user/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('user/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/user/index.html.twig b/templates/user/index.html.twig new file mode 100644 index 0000000..e2e3f7f --- /dev/null +++ b/templates/user/index.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block title %}User index{% endblock %} + +{% block body %} +

User index

+ + + + + + + + + + + + + + {% for user in users %} + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdEmailRolesNomPrenomactions
{{ user.id }}{{ user.email }}{{ user.roles ? user.roles[0] : '' }}{{ user.nom }}{{ user.prenom }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/user/new.html.twig b/templates/user/new.html.twig new file mode 100644 index 0000000..35e728d --- /dev/null +++ b/templates/user/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New User{% endblock %} + +{% block body %} +

Create new User

+ + {{ include('user/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/user/show.html.twig b/templates/user/show.html.twig new file mode 100644 index 0000000..ffc5b61 --- /dev/null +++ b/templates/user/show.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}User{% endblock %} + +{% block body %} +

User

+ + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ user.id }}
Email{{ user.email }}
Roles{{ user.roles ? user.roles[0] : '' }}
Nom{{ user.nom }}
Prenom{{ user.prenom }}
+ + back to list + + edit + + {{ include('user/_delete_form.html.twig') }} +{% endblock %}