Skip to content

Commit

Permalink
wip user class delete not working yet
Browse files Browse the repository at this point in the history
  • Loading branch information
vincent-peugnet committed Jan 22, 2021
1 parent a760d58 commit 9da99c1
Show file tree
Hide file tree
Showing 9 changed files with 274 additions and 41 deletions.
33 changes: 33 additions & 0 deletions migrations/mysql/Version20210122203139.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20210122203139 extends AbstractMigration
{
public function getDescription() : string
{
return '';
}

public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE user_class DROP FOREIGN KEY FK_F89E2C7AA23F6C8');
$this->addSql('ALTER TABLE user_class ADD CONSTRAINT FK_F89E2C7AA23F6C8 FOREIGN KEY (next_id) REFERENCES user_class (id) ON DELETE CASCADE');
}

public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE user_class DROP FOREIGN KEY FK_F89E2C7AA23F6C8');
$this->addSql('ALTER TABLE user_class ADD CONSTRAINT FK_F89E2C7AA23F6C8 FOREIGN KEY (next_id) REFERENCES user_class (id)');
}
}
92 changes: 70 additions & 22 deletions src/Controller/UserClassController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
use App\Repository\UserClassRepository;
use App\Security\Voter\UserClassVoter;
use DateTime;
use Doctrine\DBAL\ConnectionException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
Expand All @@ -44,7 +46,7 @@ class UserClassController extends AbstractController
*/
public function index(UserClassRepository $userClassRepository): Response
{
$userClasses = $userClassRepository->findBy([], ['rank' => 'ASC']);
$userClasses = $userClassRepository->findAll();

return $this->render('user_class/index.html.twig', [
'userClass' => new UserClass(),
Expand All @@ -61,27 +63,55 @@ public function show(UserClass $userClass): Response
return $this->render('user_class/show.html.twig', [
'userClass' => $userClass,
]);

}

/**
* @Route("/userclass/{id}/delete", name="userclass_delete", requirements={"id"="\d+"})
*/
public function delete(UserClass $userClass, Request $request): Response
public function delete(UserClass $userClass, Request $request, EntityManagerInterface $em): Response
{
$this->denyAccessUnlessGranted(UserClassVoter::DELETE, $userClass);

$form = $this->createForm(UserClassDeleteType::class, $userClass);

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$userClass = $form->getData();

$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($userClass);
$entityManager->flush();

$this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
if (!$userClass->getSharables()->isEmpty()) {
$sharableTarget = $form->get('target')->getData();
assert($sharableTarget instanceof UserClass);
foreach ($userClass->getSharables() as $sharable) {
$sharable->setVisibleBy($sharableTarget);
$em->persist($sharable);
$em->flush();
}
}
if (!$userClass->getUsers()->isEmpty()) {
$userTarget = is_null($userClass->getPrev()) ? $userClass->getNext() : $userClass->getPrev();
foreach ($userClass->getUsers() as $user) {
$user->setUserClass($userTarget);
$em->persist($user);
$em->flush();
}
}

$em->getConnection()->beginTransaction();
try {
$prev = $userClass->getPrev();
if (!is_null($prev)) {
$prev->setNext(null);
$em->persist($prev);
$em->flush();
$prev->setNext($userClass->getNext());
}
$em->remove($userClass);
$em->flush();
$em->getConnection()->commit();
} catch (ConnectionException $e) {
$em->getConnection()->rollBack();
throw $e;
}

This comment has been minimized.

Copy link
@vincent-peugnet

vincent-peugnet Jan 26, 2021

Author Owner

this shit is'nt working !
Please help me finish this @n-peugnet ! 😭


return $this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
}

return $this->render('user_class/delete.html.twig', [
Expand All @@ -102,13 +132,15 @@ public function edit(UserClass $userClass, Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$userClass = $form->getData();
assert($userClass instanceof UserClass);

$userClass->setLastEditedAt(new DateTime());

$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($userClass);
$entityManager->flush();
$em = $this->getDoctrine()->getManager();
$em->persist($userClass);
$em->flush();

$this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
return $this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
}

return $this->render('user_class/edit.html.twig', [
Expand All @@ -120,8 +152,11 @@ public function edit(UserClass $userClass, Request $request): Response
/**
* @Route("/userclass/new", name="userclass_new")
*/
public function new(Request $request): Response
{
public function new(
Request $request,
UserClassRepository $userClassRepository,
EntityManagerInterface $em
): Response {
$userClass = new UserClass();
$this->denyAccessUnlessGranted(UserClassVoter::CREATE, $userClass);

Expand All @@ -130,12 +165,25 @@ public function new(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$userClass = $form->getData();

$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($userClass);
$entityManager->flush();

$this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
assert($userClass instanceof UserClass);
$replaced = $userClassRepository->findOneBy(['next' => $userClass->getNext()]);
$em->getConnection()->beginTransaction();
try {
if (!is_null($replaced)) {
$replaced->setNext(null);
$em->persist($replaced);
$em->flush();
$replaced->setNext($userClass);
}
$em->persist($userClass);
$em->flush();
$em->getConnection()->commit();
} catch (ConnectionException $e) {
$em->getConnection()->rollBack();
throw $e;
}

return $this->redirectToRoute('userclass_show', ['id' => $userClass->getId()]);
}

return $this->render('user_class/new.html.twig', [
Expand Down
2 changes: 1 addition & 1 deletion src/Entity/Sharable.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public static function interestedOptionsValues()
private $description;

/**
* @ORM\ManyToOne(targetEntity=UserClass::class)
* @ORM\ManyToOne(targetEntity=UserClass::class, inversedBy="sharables")
*/
private $visibleBy;

Expand Down
37 changes: 36 additions & 1 deletion src/Entity/UserClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
use App\Security\Voter\UserVoter;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

/**
* @ORM\Entity(repositoryClass=UserClassRepository::class)
Expand Down Expand Up @@ -135,6 +134,7 @@ class UserClass

/**
* @ORM\OneToOne(targetEntity=UserClass::class, inversedBy="prev", cascade={"persist", "remove"})
* @ORM\JoinColumn(onDelete="cascade")
*/
private $next;

Expand All @@ -143,6 +143,11 @@ class UserClass
*/
private $prev;

/**
* @ORM\OneToMany(targetEntity=Sharable::class, mappedBy="visibleBy")
*/
private $sharables;

public function __construct()
{
$this->users = new ArrayCollection();
Expand Down Expand Up @@ -386,4 +391,34 @@ public function setPrev(?self $prev): self

return $this;
}

/**
* @return Collection|Sharable[]
*/
public function getSharables(): Collection
{
return $this->sharables;
}

public function addSharable(Sharable $sharable): self
{
if (!$this->sharables->contains($sharable)) {
$this->sharables[] = $sharable;
$sharable->setVisibleBy($this);
}

return $this;
}

public function removeSharable(Sharable $sharable): self
{
if ($this->sharables->removeElement($sharable)) {
// set the owning side to null (unless already changed)
if ($sharable->getVisibleBy() === $this) {
$sharable->setVisibleBy(null);
}
}

return $this;
}
}
50 changes: 37 additions & 13 deletions src/Form/UserClassDeleteType.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,29 +27,53 @@
namespace App\Form;

use App\Entity\UserClass;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserClassDeleteType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$choices = [];
$userClass = $builder->getData();
assert($userClass instanceof UserClass);

if (!$userClass->getSharables()->isEmpty()) {
if (!is_null($userClass->getPrev())) {
$choices['previous'] = [$userClass->getPrev()];
$data = $userClass->getPrev();
}
if (!is_null($userClass->getNext())) {
$choices['next'] = [$userClass->getNext()];
$data = $userClass->getNext();
}

$builder
->add('target', EntityType::class, [
'class' => UserClass::class,
'mapped' => false,
'choices' => $choices,
'required' => true,
'label' => 'Target user class for sharables',
'help' => 'Select the new user class for sharables that where accessible by this user class'
])
;
}
$builder
->add('rank')
->add('name')
->add('share')
->add('access')
->add('canInvite')
->add('maxParanoia')
->add('inviteFrequency')
->add('shareScoreReq')
->add('accountAgeReq')
->add('validatedReq')
->add('verifiedReq')
->add('createdAt')
->add('lastEditedAt')
->add('delete', SubmitType::class, [
'label' => 'delete user class',
'attr' => [
'class' => 'btn-danger',
]
])
;
if (isset($data)) {
$builder->get('target')->setData($data);
}
}

public function configureOptions(OptionsResolver $resolver)
Expand Down
26 changes: 26 additions & 0 deletions src/Form/UserClassType.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@
namespace App\Form;

use App\Entity\UserClass;
use App\Repository\UserClassRepository;
use App\Security\Voter\UserVoter;
use App\Validator\Rank;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
Expand All @@ -42,8 +44,30 @@

class UserClassType extends AbstractType
{
private UserClassRepository $userClassRepository;

public function __construct(UserClassRepository $userClassRepository)
{
$this->userClassRepository = $userClassRepository;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$userClass = $builder->getData();
assert($userClass instanceof UserClass);

// If The it's a new user class
if (is_null($userClass->getId())) {
$builder->add('next', EntityType::class, [
'class' => UserClass::class,
'label' => 'Next user class',
'choices' => $this->userClassRepository->findAll(),
'placeholder' => 'none',
'help' => 'Your user class will be placed before the selected one.',
'required' => false,
]);
}

$builder
->add('rank', IntegerType::class, [
'label' => 'Rank',
Expand Down Expand Up @@ -76,6 +100,8 @@ public function buildForm(FormBuilderInterface $builder, array $options)
assert($userClass instanceof UserClass);
$form = $event->getForm();



if ($userClass->getId() === null) {
$form->add('create', SubmitType::class);
} else {
Expand Down

0 comments on commit 9da99c1

Please sign in to comment.