diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..1ed453a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,10 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+
+[*.{js,json,yml}]
+charset = utf-8
+indent_style = space
+indent_size = 2
diff --git a/.yarnrc.yml b/.yarnrc.yml
new file mode 100644
index 0000000..c86d7e5
--- /dev/null
+++ b/.yarnrc.yml
@@ -0,0 +1,2 @@
+yarnPath: .yarn/releases/yarn-3.6.3.cjs
+nodeLinker: node-modules
diff --git a/src/Controller/PageController.php b/src/Controller/PageController.php
index 72bef0b..941f283 100644
--- a/src/Controller/PageController.php
+++ b/src/Controller/PageController.php
@@ -10,8 +10,10 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Security\Http\Attribute\IsGranted;
#[Route('/page')]
+#[IsGranted('IS_AUTHENTICATED_FULLY')]
class PageController extends AbstractController
{
#[Route('/', name: 'app_page_index', methods: ['GET'])]
diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php
new file mode 100644
index 0000000..3d56664
--- /dev/null
+++ b/src/Controller/UserController.php
@@ -0,0 +1,81 @@
+render('user/index.html.twig', [
+ 'users' => $userRepository->findAll(),
+ ]);
+ }
+
+ #[Route('/new', name: 'app_user_new', methods: ['GET', 'POST'])]
+ public function new(Request $request, EntityManagerInterface $entityManager): Response
+ {
+ $user = new User();
+ $form = $this->createForm(UserType::class, $user);
+ $form->handleRequest($request);
+
+ if ($form->isSubmitted() && $form->isValid()) {
+ $entityManager->persist($user);
+ $entityManager->flush();
+
+ return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
+ }
+
+ return $this->render('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, EntityManagerInterface $entityManager): Response
+ {
+ $form = $this->createForm(UserType::class, $user);
+ $form->handleRequest($request);
+
+ if ($form->isSubmitted() && $form->isValid()) {
+ $entityManager->flush();
+
+ return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
+ }
+
+ return $this->render('user/edit.html.twig', [
+ 'user' => $user,
+ 'form' => $form,
+ ]);
+ }
+
+ #[Route('/{id}', name: 'app_user_delete', methods: ['POST'])]
+ public function delete(Request $request, User $user, EntityManagerInterface $entityManager): Response
+ {
+ if ($this->isCsrfTokenValid('delete'.$user->getId(), $request->request->get('_token'))) {
+ $entityManager->remove($user);
+ $entityManager->flush();
+ }
+
+ return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
+ }
+}
diff --git a/src/Form/UserType.php b/src/Form/UserType.php
new file mode 100644
index 0000000..e39705c
--- /dev/null
+++ b/src/Form/UserType.php
@@ -0,0 +1,30 @@
+add('email')
+ ->add('displayName')
+ ->add('roles')
+ ->add('password')
+ ->add('createdAt')
+ ->add('updatedAt')
+ ;
+ }
+
+ public function configureOptions(OptionsResolver $resolver): void
+ {
+ $resolver->setDefaults([
+ 'data_class' => User::class,
+ ]);
+ }
+}
diff --git a/templates/base.html.twig b/templates/base.html.twig
index 1ebcc75..503ce96 100644
--- a/templates/base.html.twig
+++ b/templates/base.html.twig
@@ -40,7 +40,7 @@
Pages
-
+
Users
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..3ac79b9
--- /dev/null
+++ b/templates/user/index.html.twig
@@ -0,0 +1,45 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}User index{% endblock %}
+
+{% block body %}
+ User index
+
+
+
+
+ Id |
+ Email |
+ DisplayName |
+ Roles |
+ Password |
+ CreatedAt |
+ UpdatedAt |
+ actions |
+
+
+
+ {% for user in users %}
+
+ {{ user.id }} |
+ {{ user.email }} |
+ {{ user.displayName }} |
+ {{ user.roles ? user.roles|json_encode : '' }} |
+ {{ user.password }} |
+ {{ user.createdAt ? user.createdAt|date('Y-m-d H:i:s') : '' }} |
+ {{ user.updatedAt ? user.updatedAt|date('Y-m-d H:i:s') : '' }} |
+
+ show
+ edit
+ |
+
+ {% else %}
+
+ no records found |
+
+ {% endfor %}
+
+
+
+ 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..0348cdd
--- /dev/null
+++ b/templates/user/show.html.twig
@@ -0,0 +1,46 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}User{% endblock %}
+
+{% block body %}
+ User
+
+
+
+
+ Id |
+ {{ user.id }} |
+
+
+ Email |
+ {{ user.email }} |
+
+
+ DisplayName |
+ {{ user.displayName }} |
+
+
+ Roles |
+ {{ user.roles ? user.roles|json_encode : '' }} |
+
+
+ Password |
+ {{ user.password }} |
+
+
+ CreatedAt |
+ {{ user.createdAt ? user.createdAt|date('Y-m-d H:i:s') : '' }} |
+
+
+ UpdatedAt |
+ {{ user.updatedAt ? user.updatedAt|date('Y-m-d H:i:s') : '' }} |
+
+
+
+
+ back to list
+
+ edit
+
+ {{ include('user/_delete_form.html.twig') }}
+{% endblock %}