From d44882c59c235e6b36e0c961918af0ec8fc763b5 Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Thu, 1 Aug 2024 15:21:14 +0200 Subject: [PATCH] refs #512. Added new field 'user' --- migrations/Version20240801130155.php | 35 ++++++++++++++++++++ src/Doctrine/UserViewExtension.php | 46 +++++++++++++++++++++++++++ src/Entity/View.php | 15 +++++++++ src/State/Processor/ViewProcessor.php | 5 ++- 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 migrations/Version20240801130155.php create mode 100644 src/Doctrine/UserViewExtension.php diff --git a/migrations/Version20240801130155.php b/migrations/Version20240801130155.php new file mode 100644 index 0000000..5c389bf --- /dev/null +++ b/migrations/Version20240801130155.php @@ -0,0 +1,35 @@ +addSql('ALTER TABLE view ADD user_id INT DEFAULT NULL'); + $this->addSql('ALTER TABLE view ADD CONSTRAINT FK_FEFDAB8EA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)'); + $this->addSql('CREATE INDEX IDX_FEFDAB8EA76ED395 ON view (user_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE view DROP FOREIGN KEY FK_FEFDAB8EA76ED395'); + $this->addSql('DROP INDEX IDX_FEFDAB8EA76ED395 ON view'); + $this->addSql('ALTER TABLE view DROP user_id'); + } +} diff --git a/src/Doctrine/UserViewExtension.php b/src/Doctrine/UserViewExtension.php new file mode 100644 index 0000000..f5f8938 --- /dev/null +++ b/src/Doctrine/UserViewExtension.php @@ -0,0 +1,46 @@ +addWhere($queryBuilder, $resourceClass); + + } + + public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?Operation $operation = null, array $context = []): void + { + $this->addWhere($queryBuilder, $resourceClass); + } + + private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void + { + if (View::class !== $resourceClass ) { + return; + } + + /** @var User $user */ + $user = $this->security->getUser(); + + $rootAlias = $queryBuilder->getRootAliases()[0]; + $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias)); + $queryBuilder->setParameter('current_user', $user->getId()); + } +} \ No newline at end of file diff --git a/src/Entity/View.php b/src/Entity/View.php index 4df348a..db4608f 100644 --- a/src/Entity/View.php +++ b/src/Entity/View.php @@ -17,6 +17,9 @@ class View extends \App\Entity\AbstractEntity #[ORM\Column(type: Types::JSON, nullable: true)] private ?array $filters = []; + #[ORM\ManyToOne] + private ?User $user = null; + public function setName(string $name): static { $this->name = $name; @@ -47,4 +50,16 @@ class View extends \App\Entity\AbstractEntity return $this; } + + public function getUser(): ?User + { + return $this->user; + } + + public function setUser(?User $user): static + { + $this->user = $user; + + return $this; + } } diff --git a/src/State/Processor/ViewProcessor.php b/src/State/Processor/ViewProcessor.php index a9914d5..3e03780 100644 --- a/src/State/Processor/ViewProcessor.php +++ b/src/State/Processor/ViewProcessor.php @@ -12,12 +12,14 @@ use ApiPlatform\Validator\ValidatorInterface; use App\Dto\Input\ViewInput; use App\Dto\Output\ViewOutput; use App\Repository\ViewRepository; +use Symfony\Component\Security\Core\Security; readonly class ViewProcessor implements ProcessorInterface { public function __construct( private ViewRepository $viewRepository, - private ValidatorInterface $validator + private ValidatorInterface $validator, + private Security $security ) { } @@ -52,6 +54,7 @@ readonly class ViewProcessor implements ProcessorInterface } $view = $data->createOrUpdateEntity($entity); + $view->setUser($this->security->getUser()); $this->validator->validate($view); $this->viewRepository->save($view);