refs #512. Added new field 'user'

pull/8/head
Manuel Aranda Rosales 2024-08-01 15:21:14 +02:00
parent b6ade24314
commit d44882c59c
4 changed files with 100 additions and 1 deletions

View File

@ -0,0 +1,35 @@
<?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 Version20240801130155 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 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');
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace App\Doctrine;
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use App\Entity\User;
use App\Entity\View;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bundle\SecurityBundle\Security;
final readonly class UserViewExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
public function __construct(
private Security $security,
)
{
}
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
{
$this->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());
}
}

View File

@ -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;
}
}

View File

@ -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);