refs #1319. Default menu logic
testing/ogcore-api/pipeline/head This commit looks good Details

pull/18/head
Manuel Aranda Rosales 2025-01-07 17:58:43 +01:00
parent 825387d881
commit 59ce82ef43
11 changed files with 149 additions and 75 deletions

View File

@ -0,0 +1,31 @@
<?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 Version20250107121226 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 menu ADD is_default TINYINT(1) NOT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE menu DROP is_default');
}
}

View File

@ -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 Version20250107124654 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 client DROP FOREIGN KEY FK_C7440455CCD7E912');
$this->addSql('ALTER TABLE client ADD CONSTRAINT FK_C7440455CCD7E912 FOREIGN KEY (menu_id) REFERENCES menu (id) ON DELETE SET NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE client DROP FOREIGN KEY FK_C7440455CCD7E912');
$this->addSql('ALTER TABLE client ADD CONSTRAINT FK_C7440455CCD7E912 FOREIGN KEY (menu_id) REFERENCES menu (id)');
}
}

View File

@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace App\Command;
use App\Entity\Menu;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(name: 'opengnsys:load-default-menu', description: 'Load the default menu')]
class LoadDefaultMenuCommand extends Command
{
public function __construct(
private readonly EntityManagerInterface $entityManager
)
{
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$menu = new Menu();
$menu->setName('Default menu');
$menu->setResolution('1920x1080');
$menu->setComments('Default menu comments');
$menu->setPublicUrl('main');
$menu->setDefault(true);
$this->entityManager->persist($menu);
$this->entityManager->flush();
return Command::SUCCESS;
}
}

View File

@ -6,7 +6,9 @@ namespace App\Command\Migration;
use App\Entity\Client; use App\Entity\Client;
use App\Entity\Image; use App\Entity\Image;
use App\Entity\ImageRepository;
use App\Entity\OrganizationalUnit; use App\Entity\OrganizationalUnit;
use App\Model\ImageStatus;
use App\Model\OrganizationalUnitTypes; use App\Model\OrganizationalUnitTypes;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\ORM\Query\ResultSetMapping;
@ -70,18 +72,26 @@ class MigrateImagesCommand extends Command
} }
$imageEntity = $imagesRepository->findOneBy(['migrationId' => $image['idimagen']]); $imageEntity = $imagesRepository->findOneBy(['migrationId' => $image['idimagen']]);
$repository = $this->entityManager->getRepository(ImageRepository::class)->findAll()[0];
if(!$imageEntity) { if(!$imageEntity) {
$imageEntity = new Image(); $imageEntity = new Image();
$imageEntity->setMigrationId((string) $image['idimagen']); $imageEntity->setMigrationId((string) $image['idimagen']);
$imageEntity->setName($image['nombreca']); $imageEntity->setName($image['nombreca']);
$imageEntity->setClient($clientEntity); $imageEntity->setClient($clientEntity);
$imageEntity->setOrganizationalUnit($ouEntity); //$imageEntity->setOrganizationalUnit($ouEntity);
$imageEntity->setRemotePc(false);
$imageEntity->setStatus(ImageStatus::SUCCESS);
$imageEntity->setRepository($repository);
$imageEntity->setRevision((string) $image['revision']); $imageEntity->setRevision((string) $image['revision']);
$imageEntity->setDescription($image['descripcion']); $imageEntity->setDescription($image['descripcion']);
$imageEntity->setComments($image['comentarios']); $imageEntity->setComments($image['comentarios']);
} }
$this->entityManager->persist($imageEntity); $this->entityManager->persist($imageEntity);
$this->entityManager->flush();
} }
$this->entityManager->flush(); $this->entityManager->flush();

View File

@ -33,6 +33,10 @@ final class MenuInput
#[ApiProperty(description: 'The private url of the menu', example: "http://example.com")] #[ApiProperty(description: 'The private url of the menu', example: "http://example.com")]
public ?string $privateUrl = null; public ?string $privateUrl = null;
#[Groups(['menu:write'])]
#[ApiProperty(description: 'The default menu', example: "false")]
public ?bool $isDefault = false;
public function __construct(?Menu $menu = null) public function __construct(?Menu $menu = null)
{ {
if (!$menu) { if (!$menu) {
@ -44,6 +48,7 @@ final class MenuInput
$this->resolution = $menu->getResolution(); $this->resolution = $menu->getResolution();
$this->publicUrl = $menu->getPublicUrl(); $this->publicUrl = $menu->getPublicUrl();
$this->privateUrl = $menu->getPrivateUrl(); $this->privateUrl = $menu->getPrivateUrl();
$this->isDefault = $menu->isDefault();
} }
public function createOrUpdateEntity(?Menu $menu = null): Menu public function createOrUpdateEntity(?Menu $menu = null): Menu
@ -57,6 +62,7 @@ final class MenuInput
$menu->setResolution($this->resolution); $menu->setResolution($this->resolution);
$menu->setPublicUrl($this->publicUrl); $menu->setPublicUrl($this->publicUrl);
$menu->setPrivateUrl($this->privateUrl); $menu->setPrivateUrl($this->privateUrl);
$menu->setDefault($this->isDefault);
return $menu; return $menu;
} }

View File

@ -25,6 +25,9 @@ final class MenuOutput extends AbstractOutput
#[Groups(['menu:read'])] #[Groups(['menu:read'])]
public ?string $privateUrl = null; public ?string $privateUrl = null;
#[Groups(['menu:read'])]
public ?bool $isDefault = false;
#[Groups(['menu:read'])] #[Groups(['menu:read'])]
public \DateTime $createdAt; public \DateTime $createdAt;
@ -40,6 +43,7 @@ public function __construct(Menu $menu)
$this->comments = $menu->getComments(); $this->comments = $menu->getComments();
$this->publicUrl = $menu->getPublicUrl(); $this->publicUrl = $menu->getPublicUrl();
$this->privateUrl = $menu->getPrivateUrl(); $this->privateUrl = $menu->getPrivateUrl();
$this->isDefault = $menu->isDefault();
$this->createdAt = $menu->getCreatedAt(); $this->createdAt = $menu->getCreatedAt();
$this->createdBy = $menu->getCreatedBy(); $this->createdBy = $menu->getCreatedBy();
} }

View File

@ -49,6 +49,7 @@ class Client extends AbstractEntity
private Collection $partitions; private Collection $partitions;
#[ORM\ManyToOne] #[ORM\ManyToOne]
#[ORM\JoinColumn( onDelete: 'SET NULL')]
private ?Menu $menu = null; private ?Menu $menu = null;
#[ORM\ManyToOne] #[ORM\ManyToOne]
@ -63,7 +64,7 @@ class Client extends AbstractEntity
#[ORM\ManyToOne(inversedBy: 'clients')] #[ORM\ManyToOne(inversedBy: 'clients')]
private ?PxeTemplate $template = null; private ?PxeTemplate $template = null;
#[ORM\ManyToOne(inversedBy: 'clients')] #[ORM\ManyToOne()]
private ?ImageRepository $repository = null; private ?ImageRepository $repository = null;
#[ORM\ManyToOne(inversedBy: 'clients')] #[ORM\ManyToOne(inversedBy: 'clients')]

View File

@ -24,16 +24,12 @@ class Menu extends AbstractEntity
#[ORM\Column(length: 255, nullable: true)] #[ORM\Column(length: 255, nullable: true)]
private ?string $privateUrl = null; private ?string $privateUrl = null;
/** #[ORM\Column]
* @var Collection<int, Client> private ?bool $isDefault = null;
*/
#[ORM\OneToMany(mappedBy: 'menu', targetEntity: Client::class)]
private Collection $clients;
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->clients = new ArrayCollection();
} }
public function getResolution(): ?string public function getResolution(): ?string
@ -84,31 +80,14 @@ class Menu extends AbstractEntity
return $this; return $this;
} }
/** public function isDefault(): ?bool
* @return Collection<int, Client>
*/
public function getClients(): Collection
{ {
return $this->clients; return $this->isDefault;
} }
public function addClient(Client $client): static public function setDefault(bool $isDefault): static
{ {
if (!$this->clients->contains($client)) { $this->isDefault = $isDefault;
$this->clients->add($client);
}
return $this;
}
public function removeClient(Client $client): static
{
if ($this->clients->removeElement($client)) {
// set the owning side to null (unless already changed)
if ($client->getMenu() === $this) {
$client->setMenu(null);
}
}
return $this; return $this;
} }

View File

@ -97,12 +97,6 @@ class OrganizationalUnit extends AbstractEntity
#[ORM\Column] #[ORM\Column]
private ?bool $reserved = false; private ?bool $reserved = false;
/**
* @var Collection<int, Image>
*/
#[ORM\OneToMany(mappedBy: 'organizationalUnit', targetEntity: Image::class)]
private Collection $images;
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
@ -110,7 +104,6 @@ class OrganizationalUnit extends AbstractEntity
$this->users = new ArrayCollection(); $this->users = new ArrayCollection();
$this->clients = new ArrayCollection(); $this->clients = new ArrayCollection();
$this->softwareProfiles = new ArrayCollection(); $this->softwareProfiles = new ArrayCollection();
$this->images = new ArrayCollection();
} }
public function getDescription(): ?string public function getDescription(): ?string
@ -436,34 +429,4 @@ class OrganizationalUnit extends AbstractEntity
return $this; return $this;
} }
/**
* @return Collection<int, Image>
*/
public function getImages(): Collection
{
return $this->images;
}
public function addImage(Image $image): static
{
if (!$this->images->contains($image)) {
$this->images->add($image);
$image->setOrganizationalUnit($this);
}
return $this;
}
public function removeImage(Image $image): static
{
if ($this->images->removeElement($image)) {
// set the owning side to null (unless already changed)
if ($image->getOrganizationalUnit() === $this) {
$image->setOrganizationalUnit(null);
}
}
return $this;
}
} }

View File

@ -27,7 +27,7 @@ final readonly class ClientSubscriber implements EventSubscriberInterface
public static function getSubscribedEvents(): array public static function getSubscribedEvents(): array
{ {
return [ return [
KernelEvents::VIEW => ['sendMail', EventPriorities::POST_WRITE], KernelEvents::VIEW => ['updatePxe', EventPriorities::POST_WRITE],
]; ];
} }
@ -37,7 +37,7 @@ final readonly class ClientSubscriber implements EventSubscriberInterface
* @throws RedirectionExceptionInterface * @throws RedirectionExceptionInterface
* @throws ClientExceptionInterface * @throws ClientExceptionInterface
*/ */
public function sendMail(ViewEvent $event): void public function updatePxe(ViewEvent $event): void
{ {
$clientOutput = $event->getControllerResult(); $clientOutput = $event->getControllerResult();
$method = $event->getRequest()->getMethod(); $method = $event->getRequest()->getMethod();

View File

@ -13,12 +13,14 @@ use App\Dto\Input\ClientInput;
use App\Dto\Output\ClientOutput; use App\Dto\Output\ClientOutput;
use App\Dto\Output\UserGroupOutput; use App\Dto\Output\UserGroupOutput;
use App\Repository\ClientRepository; use App\Repository\ClientRepository;
use App\Repository\MenuRepository;
class ClientProcessor implements ProcessorInterface readonly class ClientProcessor implements ProcessorInterface
{ {
public function __construct( public function __construct(
private readonly ClientRepository $clientRepository, private ClientRepository $clientRepository,
private readonly ValidatorInterface $validator private MenuRepository $menuRepository,
private ValidatorInterface $validator
) )
{ {
} }
@ -52,11 +54,18 @@ class ClientProcessor implements ProcessorInterface
$entity = $this->clientRepository->findOneByUuid($uriVariables['uuid']); $entity = $this->clientRepository->findOneByUuid($uriVariables['uuid']);
} }
$userGroup = $data->createOrUpdateEntity($entity); $defaultMenu = $this->menuRepository->findOneBy(['isDefault' => true]);
$this->validator->validate($userGroup);
$this->clientRepository->save($userGroup);
return new ClientOutput($userGroup); $client = $data->createOrUpdateEntity($entity);
if ($defaultMenu) {
$client->setMenu($defaultMenu);
}
$this->validator->validate($client);
$this->clientRepository->save($client);
return new ClientOutput($client);
} }
private function processDelete($data, Operation $operation, array $uriVariables = [], array $context = []): null private function processDelete($data, Operation $operation, array $uriVariables = [], array $context = []): null