Add Unidades organizativas

master
Manuel Aranda Rosales 2024-06-21 10:36:22 +02:00
parent 5569b8c8d9
commit fae474ab79
1 changed files with 424 additions and 0 deletions

@ -0,0 +1,424 @@
# Documentation / Documentación - API Platform with Symfony 3
## Select Language / Seleccionar Idioma
- [English](#english)
- [Español](#español)
---
## English
### Table of Contents
1. [Introduction](#introduction)
2. [Configuration](#configuration)
3. [Resource Definition](#resource-definition)
4. [API Operations](#api-operations)
5. [Entity Properties](#entity-properties)
6. [Organizational Unit Input DTO](#organizational-unit-input-dto)
### Introduction
This documentation describes the configuration of API Platform in a Symfony 3 project. It details the resources, operations, and entity properties exposed through the API.
### Configuration
API configuration is done in Symfony configuration files, usually in `config/packages/api_platform.yaml` or a similar file.
```yaml
resources:
App\Entity\OrganizationalUnit:
processor: App\State\Processor\OrganizationalUnitProcessor
output: App\Dto\Output\OrganizationalUnitOutput
input: App\Dto\Input\OrganizationalUnitInput
normalizationContext:
groups: ['default', 'organizational-unit:read']
denormalization_context:
groups: ['organizational-unit:write']
operations:
ApiPlatform\Metadata\GetCollection:
provider: App\State\Provider\OrganizationalUnitProvider
filters:
- 'api_platform.filter.organizational_unit.order'
- 'api_platform.filter.organizational_unit.search'
ApiPlatform\Metadata\Get:
security: 'is_granted("ORGANIZATIONAL_UNIT_VIEW", object)'
provider: App\State\Provider\OrganizationalUnitProvider
securityMessage: 'Sorry, but you are not allowed to access this resource.'
ApiPlatform\Metadata\Put:
provider: App\State\Provider\OrganizationalUnitProvider
ApiPlatform\Metadata\Patch:
provider: App\State\Provider\OrganizationalUnitProvider
validationContext:
groups: ['organizational-unit:patch']
ApiPlatform\Metadata\Post: ~
ApiPlatform\Metadata\Delete: ~
properties:
App\Entity\OrganizationalUnit:
id:
identifier: false
uuid:
identifier: true
```
### Resource Definition
#### App\Entity\OrganizationalUnit
- **Processor**: `App\State\Processor\OrganizationalUnitProcessor`
- **Output**: `App\Dto\Output\OrganizationalUnitOutput`
- **Input**: `App\Dto\Input\OrganizationalUnitInput`
- **Normalization Context**: `['default', 'organizational-unit:read']`
- **Denormalization Context**: `['organizational-unit:write']`
### API Operations
#### Organizational Unit Operations
##### Get Organizational Unit Collection (GetCollection)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
- **Filters**:
- Order organizational units: `api_platform.filter.organizational_unit.order`
- Search organizational units: `api_platform.filter.organizational_unit.search`
##### Get Organizational Unit (Get)
- **Security**: Only accessible by users granted `ORGANIZATIONAL_UNIT_VIEW` permission on the object.
- **Security Message**: `Sorry, but you are not allowed to access this resource.`
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
##### Update Organizational Unit (Put)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
##### Partially Update Organizational Unit (Patch)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
- **Validation Context**: `['organizational-unit:patch']`
##### Create Organizational Unit (Post)
- **Default Operation**: ~
##### Delete Organizational Unit (Delete)
- **Default Operation**: ~
### Entity Properties
#### App\Entity\OrganizationalUnit
- **id**:
- **Identifier**: `false`
- **uuid**:
- **Identifier**: `true`
### Organizational Unit Input DTO
```php
<?php
namespace App\Dto\Input;
use ApiPlatform\Metadata\ApiProperty;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\OrganizationalUnit;
use App\Validator\Constraints\OrganizationalUnitMulticastMode;
use App\Validator\Constraints\OrganizationalUnitMulticastPort;
use App\Validator\Constraints\OrganizationalUnitP2PMode;
use App\Validator\Constraints\OrganizationalUnitType;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
class OrganizationalUnitInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Groups(['organizational-unit:write'])]
public ?OrganizationalUnitOutput $parent = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $location = null;
#[Groups(['organizational-unit:write'])]
public ?bool $projector = null;
#[Groups(['organizational-unit:write'])]
public ?bool $board = null;
#[Assert\GreaterThan(0)]
#[Groups(['organizational-unit:write'])]
public ?int $capacity = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
#[Groups(['organizational-unit:write'])]
#[OrganizationalUnitType]
public ?string $type = null;
#[Groups(['organizational-unit:write'])]
#[Assert\Valid()]
public ?NetworkSettingsInput $networkSettings = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
return;
}
$this->name = $organizationalUnit->getName();
if ($organizationalUnit->getParent()) {
$this->parent = new OrganizationalUnitOutput($organizationalUnit->getParent());
}
$this->description = $organizationalUnit->getDescription();
$this->location = $organizationalUnit->getLocation();
$this->projector = $organizationalUnit->isProjector();
$this->board = $organizationalUnit->isBoard();
$this->capacity = $organizationalUnit->getCapacity();
$this->comments = $organizationalUnit->getComments();
$this->type = $organizationalUnit->getType();
if ($organizationalUnit->getNetworkSettings()) {
$this->networkSettings = new NetworkSettingsInput($organizationalUnit->getNetworkSettings());
}
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
{
if (!$organizationalUnit) {
$organizationalUnit = new OrganizationalUnit();
}
$organizationalUnit->setName($this->name);
if ($this->parent) {
$organizationalUnit->setParent($this->parent->getEntity());
}
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setLocation($this->location);
$organizationalUnit->setProjector($this->projector);
$organizationalUnit->setBoard($this->board);
$organizationalUnit->setCapacity($this->capacity);
$organizationalUnit->setComments($this->comments);
$organizationalUnit->setType($this->type);
if ($this->networkSettings) {
$organizationalUnit->setNetworkSettings($this->networkSettings->createOrUpdateEntity($organizationalUnit->getNetworkSettings()));
}
return $organizationalUnit;
}
}
```
---
## Español
### Tabla de Contenidos
1. [Introducción](#introduction)
2. [Configuración](#configuration)
3. [Definición de Recursos](#resource-definition)
4. [Operaciones de API](#api-operations)
5. [Propiedades de la Entidad](#entity-properties)
6. [DTO de Entrada de Unidad Organizativa](#organizational-unit-input-dto)
### Introducción
Esta documentación describe la configuración de API Platform en un proyecto Symfony 3, detallando los recursos, operaciones y propiedades de entidad expuestos a través de la API.
### Configuración
La configuración de API se realiza en archivos de configuración Symfony, generalmente en `config/packages/api_platform.yaml` o un archivo similar.
```yaml
resources:
App\Entity\OrganizationalUnit:
processor: App\State\Processor\OrganizationalUnitProcessor
output: App\Dto\Output\OrganizationalUnitOutput
input: App\Dto\Input\OrganizationalUnitInput
normalizationContext:
groups: ['default', 'organizational-unit:read']
denormalization_context:
groups: ['organizational-unit:write']
operations:
ApiPlatform\Metadata\GetCollection:
provider: App\State\Provider\OrganizationalUnitProvider
filters:
- 'api_platform.filter.organizational_unit.order'
- 'api_platform.filter.organizational_unit.search'
ApiPlatform\Metadata\Get:
security: 'is_granted("ORGANIZATIONAL_UNIT_VIEW", object)'
provider: App\State\Provider\OrganizationalUnitProvider
securityMessage: 'Sorry, but you are not allowed to access this resource.'
ApiPlatform\Metadata\Put:
provider: App\State\Provider\OrganizationalUnitProvider
ApiPlatform\Metadata\Patch:
provider: App\State\Provider\OrganizationalUnitProvider
validationContext:
groups: ['organizational-unit:patch']
ApiPlatform\Metadata\Post: ~
ApiPlatform\Metadata\Delete: ~
properties:
App\Entity\OrganizationalUnit:
id:
identifier: false
uuid:
identifier: true
```
### Definición de Recursos
#### App\Entity\OrganizationalUnit
- **Processor**: `App\State\Processor\OrganizationalUnitProcessor`
- **Output**: `App\Dto\Output\OrganizationalUnitOutput`
- **Input**: `App\Dto\Input\OrganizationalUnitInput`
- **Normalization Context**: `['default', 'organizational-unit:read']`
- **Denormalization Context**: `['organizational-unit:write']`
### Operaciones de API
#### Operaciones de Unidad Organizativa
##### Obtener Colección de Unidades Organizativas (GetCollection)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
- **Filtros**:
- Ordenar unidades organizativas: `api_platform.filter.organizational_unit.order`
- Buscar unidades organizativas: `api_platform.filter.organizational_unit.search`
##### Obtener Unidad Organizativa (Get)
- **Security**: Solo accesible por usuarios con el permiso `ORGANIZATIONAL_UNIT_VIEW` sobre el objeto.
- **Mensaje de Seguridad**: `Sorry, but you are not allowed to access this resource.`
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
##### Actualizar Unidad Organizativa (Put)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
##### Actualización Parcial de Unidad Organizativa (Patch)
- **Provider**: `App\State\Provider\OrganizationalUnitProvider`
- **Validation Context**: `['organizational-unit:patch']`
##### Crear Unidad Organizativa (Post)
- **Operación Predeterminada**: ~
##### Eliminar Unidad Organizativa (Delete)
- **Operación Predeterminada**: ~
### Propiedades de la Entidad
#### App\Entity\OrganizationalUnit
- **id**:
- **Identifier**: `false`
- **uuid**:
- **Identifier**: `true`
### DTO de Entrada de Unidad Organizativa
```php
<?php
namespace App\Dto\Input;
use ApiPlatform\Metadata\ApiProperty;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\OrganizationalUnit;
use App\Validator\Constraints\OrganizationalUnitMulticastMode;
use App\Validator\Constraints\OrganizationalUnitMulticastPort;
use App\Validator\Constraints\OrganizationalUnitP2PMode;
use App\Validator\Constraints\OrganizationalUnitType;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
class OrganizationalUnitInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Groups(['organizational-unit:write'])]
public ?OrganizationalUnitOutput $parent = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $location = null;
#[Groups(['organizational-unit:write'])]
public ?bool $projector = null;
#[Groups(['organizational-unit:write'])]
public ?bool $board = null;
#[Assert\GreaterThan(0)]
#[Groups(['organizational-unit:write'])]
public ?int $capacity = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
#[Groups(['organizational-unit:write'])]
#[OrganizationalUnitType]
public ?string $type = null;
#[Groups(['organizational-unit:write'])]
#[Assert\Valid()]
public ?NetworkSettingsInput $networkSettings = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
return;
}
$this->name = $organizationalUnit->getName();
if ($organizationalUnit->getParent()) {
$this->parent = new OrganizationalUnitOutput($organizationalUnit->getParent());
}
$this->description = $organizationalUnit->getDescription();
$this->location = $organizationalUnit->getLocation();
$this->projector = $organizationalUnit->isProjector();
$this->board = $organizationalUnit->isBoard();
$this->capacity = $organizationalUnit->getCapacity();
$this->comments = $organizationalUnit->getComments();
$this->type = $organizationalUnit->getType();
if ($organizationalUnit->getNetworkSettings()) {
$this->networkSettings = new NetworkSettingsInput($organizationalUnit->getNetworkSettings());
}
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
{
if (!$organizationalUnit) {
$organizationalUnit = new OrganizationalUnit();
}
$organizationalUnit->setName($this->name);
if ($this->parent) {
$organizationalUnit->setParent($this->parent->getEntity());
}
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setLocation($this->location);
$organizationalUnit->setProjector($this->projector);
$organizationalUnit->setBoard($this->board);
$organizationalUnit->setCapacity($this->capacity);
$organizationalUnit->setComments($this->comments);
$organizationalUnit->setType($this->type);
if ($this->networkSettings) {
$organizationalUnit->setNetworkSettings($this->networkSettings->createOrUpdateEntity($organizationalUnit->getNetworkSettings()));
}
return $organizationalUnit;
}
}
```