refs #425. Client and ORganizationalUnit classroom validation

pull/7/head
Manuel Aranda Rosales 2024-06-13 10:59:19 +02:00
parent 1da36b96ac
commit 6be6e67797
11 changed files with 214 additions and 0 deletions

View File

@ -109,6 +109,7 @@ docker exec ogcore-php php bin/console doctrine:database:create
## Migraciones de datos
Para poder migrar los datos desde la base de datos "antigua", previamente necesitamos poder tener un esquema de base de datos con un dump de OpenGnsys. Es decir:
- Creamos una base de datos temporal simulando una insancia de OpenGnsys 1.1. La solicitaremos al equipo de desarrollo de las universidades
- Necesitaremos un dump de la base de datos de OpenGnsys 1.1.

View File

@ -33,6 +33,7 @@ final class ClientInput
public ?string $mac = null;
#[Groups(['client:write'])]
#[Assert\Ip]
#[ApiProperty(description: 'The IP address of the client', example: "127.0.0.1")]
public ?string $ip = null;

View File

@ -6,6 +6,9 @@ use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\NetworkSettings;
use App\Entity\OrganizationalUnit;
use App\Model\OrganizationalUnitTypes;
use App\Validator\Constraints\OrganizationalUnitClassroomMulticastMode;
use App\Validator\Constraints\OrganizationalUnitClassroomMulticastPort;
use App\Validator\Constraints\OrganizationalUnitClassroomP2pMode;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
@ -40,6 +43,7 @@ final class OrganizationalUnitClassroomInput extends OrganizationalUnitInput
public ?string $ntp = null;
#[Groups(['organizational-unit:write'])]
#[OrganizationalUnitClassroomP2pMode]
public ?string $p2pMode = null;
#[Groups(['organizational-unit:write'])]
@ -53,9 +57,11 @@ final class OrganizationalUnitClassroomInput extends OrganizationalUnitInput
public ?int $mcastSpeed = null;
#[Groups(['organizational-unit:write'])]
#[OrganizationalUnitClassroomMulticastPort]
public ?int $mcastPort = null;
#[Groups(['organizational-unit:write'])]
#[OrganizationalUnitClassroomMulticastMode]
public ?string $mcastMode = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)

View File

@ -0,0 +1,29 @@
<?php
namespace App\Model;
final class OrganizationalUnitClassroomMulticastModes
{
public const string HALF_DUPLEX = 'half_duplex';
public const string FULL_DUPLEX = 'full_duplex';
private const array MCAST_MODES = [
self::HALF_DUPLEX => 'Half Duplex',
self::FULL_DUPLEX => 'Full Duplex',
];
public static function getMcastModeNames(): array
{
return self::MCAST_MODES;
}
public static function getMcastType(string $mcastMode): ?string
{
return self::MCAST_MODES[$mcastMode] ?? null;
}
public static function getMcastModes(): array
{
return array_keys(self::MCAST_MODES);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Model;
final class OrganizationalUnitClassroomP2pModes
{
public const string P2P_MODE_LEECHER = 'p2p_mode_leecher';
public const string P2P_MODE_PEER = 'p2p_mode_peer';
public const string P2P_MODE_SEEDER = 'p2p_mode_seeder';
private const array P2P_MODE_NAMES = [
self::P2P_MODE_LEECHER => 'El cliente no comparte mientras descarga la imagen',
self::P2P_MODE_PEER => 'El cliente, mientras descarga la imagen, comparte los datos que ya tenga descargados',
self::P2P_MODE_SEEDER => 'Modo de trabajo en modo distribuido',
];
public static function getP2pModeNames(): array
{
return self::P2P_MODE_NAMES;
}
public static function getP2pModeName(string $p2pMode): ?string
{
return self::P2P_MODE_NAMES[$p2pMode] ?? null;
}
public static function getP2pModes(): array
{
return array_keys(self::P2P_MODE_NAMES);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Validator\Constraints;
use App\Model\OrganizationalUnitClassroomMulticastModes;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
#[\Attribute]
class OrganizationalUnitClassroomMulticastMode extends Constraint
{
private array $modes;
public string $message;
public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);
$this->modes = OrganizationalUnitClassroomMulticastModes::getMcastModes();
$this->message = sprintf(
'The multicast mode is not valid. Please use one of the following: %s',
implode(', ', $this->modes)
);
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Validator\Constraints;
use App\Model\OrganizationalUnitClassroomMulticastModes;
use App\Model\OrganizationalUnitClassroomP2pModes;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class OrganizationalUnitClassroomMulticastModeValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint): void
{
if (null === $value) {
return;
}
if (!in_array($value, OrganizationalUnitClassroomMulticastModes::getMcastModes())) {
$this->context->buildViolation($constraint->message)->addViolation();
}
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Validator\Constraints;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
#[\Attribute]
class OrganizationalUnitClassroomMulticastPort extends Constraint
{
public string $message;
public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);
$this->message = 'The multicast port is not valid. Please use a number between 9000 and 9050';
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Validator\Constraints;
use App\Model\OrganizationalUnitClassroomP2pModes;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class OrganizationalUnitClassroomMulticastPortValidator extends ConstraintValidator
{
CONST int minPort = 9000;
CONST int maxPort = 9050;
public function validate($value, Constraint $constraint): void
{
if (null === $value) {
return;
}
if (!(self::minPort <= $value) && ($value <= self::maxPort)) {
$this->context->buildViolation($constraint->message)->addViolation();
return;
}
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Validator\Constraints;
use App\Model\OrganizationalUnitClassroomP2pModes;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
#[\Attribute]
class OrganizationalUnitClassroomP2pMode extends Constraint
{
private array $modes;
public string $message;
public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);
$this->modes = OrganizationalUnitClassroomP2pModes::getP2pModes();
$this->message = sprintf(
'The p2p mode is not valid. Please use one of the following: %s',
implode(', ', $this->modes)
);
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Validator\Constraints;
use App\Model\OrganizationalUnitClassroomP2pModes;
use App\Model\UserGroupPermissions;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class OrganizationalUnitClassroomP2pModeValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint): void
{
if (null === $value) {
return;
}
if (!in_array($value, OrganizationalUnitClassroomP2pModes::getP2pModes())) {
$this->context->buildViolation($constraint->message)->addViolation();
}
}
}