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\Image;
use App\Entity\ImageRepository;
use App\Entity\OrganizationalUnit;
use App\Model\ImageStatus;
use App\Model\OrganizationalUnitTypes;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;
@ -70,18 +72,26 @@ class MigrateImagesCommand extends Command
}
$imageEntity = $imagesRepository->findOneBy(['migrationId' => $image['idimagen']]);
$repository = $this->entityManager->getRepository(ImageRepository::class)->findAll()[0];
if(!$imageEntity) {
$imageEntity = new Image();
$imageEntity->setMigrationId((string) $image['idimagen']);
$imageEntity->setName($image['nombreca']);
$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->setDescription($image['descripcion']);
$imageEntity->setComments($image['comentarios']);
}
$this->entityManager->persist($imageEntity);
$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")]
public ?string $privateUrl = null;
#[Groups(['menu:write'])]
#[ApiProperty(description: 'The default menu', example: "false")]
public ?bool $isDefault = false;
public function __construct(?Menu $menu = null)
{
if (!$menu) {
@ -44,6 +48,7 @@ final class MenuInput
$this->resolution = $menu->getResolution();
$this->publicUrl = $menu->getPublicUrl();
$this->privateUrl = $menu->getPrivateUrl();
$this->isDefault = $menu->isDefault();
}
public function createOrUpdateEntity(?Menu $menu = null): Menu
@ -57,6 +62,7 @@ final class MenuInput
$menu->setResolution($this->resolution);
$menu->setPublicUrl($this->publicUrl);
$menu->setPrivateUrl($this->privateUrl);
$menu->setDefault($this->isDefault);
return $menu;
}

View File

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

View File

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

View File

@ -24,16 +24,12 @@ class Menu extends AbstractEntity
#[ORM\Column(length: 255, nullable: true)]
private ?string $privateUrl = null;
/**
* @var Collection<int, Client>
*/
#[ORM\OneToMany(mappedBy: 'menu', targetEntity: Client::class)]
private Collection $clients;
#[ORM\Column]
private ?bool $isDefault = null;
public function __construct()
{
parent::__construct();
$this->clients = new ArrayCollection();
}
public function getResolution(): ?string
@ -84,31 +80,14 @@ class Menu extends AbstractEntity
return $this;
}
/**
* @return Collection<int, Client>
*/
public function getClients(): Collection
public function isDefault(): ?bool
{
return $this->clients;
return $this->isDefault;
}
public function addClient(Client $client): static
public function setDefault(bool $isDefault): static
{
if (!$this->clients->contains($client)) {
$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);
}
}
$this->isDefault = $isDefault;
return $this;
}

View File

@ -97,12 +97,6 @@ class OrganizationalUnit extends AbstractEntity
#[ORM\Column]
private ?bool $reserved = false;
/**
* @var Collection<int, Image>
*/
#[ORM\OneToMany(mappedBy: 'organizationalUnit', targetEntity: Image::class)]
private Collection $images;
public function __construct()
{
parent::__construct();
@ -110,7 +104,6 @@ class OrganizationalUnit extends AbstractEntity
$this->users = new ArrayCollection();
$this->clients = new ArrayCollection();
$this->softwareProfiles = new ArrayCollection();
$this->images = new ArrayCollection();
}
public function getDescription(): ?string
@ -436,34 +429,4 @@ class OrganizationalUnit extends AbstractEntity
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
{
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 ClientExceptionInterface
*/
public function sendMail(ViewEvent $event): void
public function updatePxe(ViewEvent $event): void
{
$clientOutput = $event->getControllerResult();
$method = $event->getRequest()->getMethod();

View File

@ -13,12 +13,14 @@ use App\Dto\Input\ClientInput;
use App\Dto\Output\ClientOutput;
use App\Dto\Output\UserGroupOutput;
use App\Repository\ClientRepository;
use App\Repository\MenuRepository;
class ClientProcessor implements ProcessorInterface
readonly class ClientProcessor implements ProcessorInterface
{
public function __construct(
private readonly ClientRepository $clientRepository,
private readonly ValidatorInterface $validator
private ClientRepository $clientRepository,
private MenuRepository $menuRepository,
private ValidatorInterface $validator
)
{
}
@ -52,11 +54,18 @@ class ClientProcessor implements ProcessorInterface
$entity = $this->clientRepository->findOneByUuid($uriVariables['uuid']);
}
$userGroup = $data->createOrUpdateEntity($entity);
$this->validator->validate($userGroup);
$this->clientRepository->save($userGroup);
$defaultMenu = $this->menuRepository->findOneBy(['isDefault' => true]);
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