adding users now works

This commit is contained in:
overflowerror 2021-01-18 00:17:08 +01:00
parent 012889d531
commit 4b3189d0b1
8 changed files with 138 additions and 4 deletions

View file

@ -5,6 +5,7 @@ namespace App\Controller;
use App\Entity\User; use App\Entity\User;
use App\Form\UserType;
use App\Mapper\CustomUuidMapper; use App\Mapper\CustomUuidMapper;
use App\Service\UserService; use App\Service\UserService;
use Doctrine\DBAL\Types\ConversionException; use Doctrine\DBAL\Types\ConversionException;
@ -121,4 +122,34 @@ class UserController extends AbstractController
return $this->redirectToRoute("app_user_list"); return $this->redirectToRoute("app_user_list");
} }
/**
* @Route("/admin/users/new", name="app_user_add")
*/
public function userAdd(Request $request): Response
{
if (!$this->isGranted(User::ROLE_ADMIN)) {
throw new AccessDeniedHttpException();
}
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
if ($user->isSuperAdmin()) {
throw new BadRequestHttpException();
}
$this->userService->add($user);
return $this->redirectToRoute("app_user_list");
}
return $this->render("user/user-new.html.twig", [
"form" => $form->createView()
]);
}
} }

View file

@ -24,6 +24,7 @@ class UserFixtures extends Fixture
$admin = new User(); $admin = new User();
$admin->setEmail("admin@mytube"); $admin->setEmail("admin@mytube");
$admin->setName("Administrator"); $admin->setName("Administrator");
$admin->setCreated();
$admin->setPassword($this->passwordEncoder->encodePassword($admin, "password")); $admin->setPassword($this->passwordEncoder->encodePassword($admin, "password"));
$admin->setRoles([User::ROLE_SUPER_ADMIN, User::ROLE_ADMIN, User::ROLE_USER]); $admin->setRoles([User::ROLE_SUPER_ADMIN, User::ROLE_ADMIN, User::ROLE_USER]);
$manager->persist($admin); $manager->persist($admin);

View file

@ -3,6 +3,7 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\UserRepository; use App\Repository\UserRepository;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
@ -15,7 +16,7 @@ use Symfony\Component\Security\Core\User\UserInterface;
*/ */
class User implements UserInterface class User implements UserInterface
{ {
public const ROLE_SUPER_ADMIN = "ROLE_SUPER_ADMIN"; public const ROLE_SUPER_ADMIN = "ROLE_SUPER";
public const ROLE_ADMIN = "ROLE_ADMIN"; public const ROLE_ADMIN = "ROLE_ADMIN";
public const ROLE_USER = "ROLE_USER"; public const ROLE_USER = "ROLE_USER";
@ -54,6 +55,16 @@ class User implements UserInterface
*/ */
private $videos; private $videos;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $creator;
/**
* @ORM\Column(type="datetime_immutable")
*/
private $created;
public function __construct() public function __construct()
{ {
$this->videos = new ArrayCollection(); $this->videos = new ArrayCollection();
@ -205,4 +216,27 @@ class User implements UserInterface
{ {
return in_array(self::ROLE_SUPER_ADMIN, $this->getRoles()); return in_array(self::ROLE_SUPER_ADMIN, $this->getRoles());
} }
public function getCreator(): ?self
{
return $this->creator;
}
public function setCreator(?self $creator): self
{
$this->creator = $creator;
return $this;
}
public function getCreated(): ?DateTimeImmutable
{
return $this->created;
}
public function setCreated(): self
{
$this->created = new DateTimeImmutable();
return $this;
}
} }

44
src/Form/UserType.php Normal file
View file

@ -0,0 +1,44 @@
<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, $options): void
{
$builder
->add("name", TextType::class)
->add("email", EmailType::class)
->add("roles", ChoiceType::class, [
"choices" => [
"Admin" => User::ROLE_ADMIN
],
"multiple" => true,
"expanded" => true,
])
->add("password", PasswordType::class, [
"always_empty" => true
])
->add("submit", SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
"data_class" => User::class
]);
}
}

View file

@ -67,4 +67,10 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader
$this->_em->remove($user); $this->_em->remove($user);
$this->_em->flush(); $this->_em->flush();
} }
public function save(User $user)
{
$this->_em->persist($user);
$this->_em->flush();
}
} }

View file

@ -50,4 +50,12 @@ class UserService
{ {
return $this->userRepository->findOneById($userId); return $this->userRepository->findOneById($userId);
} }
public function add(User $user)
{
$user->setCreated();
$user->setCreator($this->getLoggedInUser());
$this->userRepository->save($user);
}
} }

View file

@ -0,0 +1,10 @@
{% extends 'base.html.twig' %}
{% block title %}Users{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset("css/admin.css") }}">
{% endblock %}
{% block body %}
{{ form(form) }}
{% endblock %}

View file

@ -1,6 +1,6 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block title %}Links{% endblock %} {% block title %}Users{% endblock %}
{% block stylesheets %} {% block stylesheets %}
<link rel="stylesheet" href="{{ asset("css/admin.css") }}"> <link rel="stylesheet" href="{{ asset("css/admin.css") }}">
{% endblock %} {% endblock %}
@ -88,8 +88,8 @@
</table> </table>
</div> </div>
<div class="addButton"> <div class="addButton">
<button type="button" class="btn btn-primary btn-floating"> <a type="button" class="btn btn-primary btn-floating" href="{{ path("app_user_add") }}">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</button> </a>
</div> </div>
{% endblock %} {% endblock %}