From 9db9d61129d248fc2cf47e701a0fa143fd7f53a6 Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Thu, 9 Oct 2025 10:53:32 +0200 Subject: [PATCH] Updated ogCore wieh new docu --- CHANGELOG.md | 6 + README.md | 1854 ++++++++++++- config/packages/api_platform.yaml | 2 +- ogCore_Documentacion_Tecnica.html | 2451 +++++++++++++++++ ogCore_Documentacion_Tecnica.pdf | Bin 0 -> 328369 bytes .../OgBoot/PxeBootFile/PostAction.php | 4 - src/Dto/Input/BackupImageInput.php | 17 +- src/Dto/Input/BootClientsInput.php | 10 +- src/Dto/Input/CancelMultipleTracesInput.php | 5 + .../Input/ChangeOrganizationalUnitInput.php | 10 +- src/Dto/Input/CheckPartitionSizesInput.php | 6 +- src/Dto/Input/ClientInput.php | 16 +- src/Dto/Input/CommandExecuteInput.php | 14 +- .../Input/CommandGroupAddCommandsInput.php | 5 + src/Dto/Input/CommandGroupExecuteInput.php | 5 + src/Dto/Input/CommandTaskScheduleInput.php | 26 +- src/Dto/Input/CommandTaskScriptInput.php | 23 +- src/Dto/Input/ConvertImageToVirtualInput.php | 7 +- .../ExportImportImageRepositoryInput.php | 6 +- src/Dto/Input/GetPartitionScriptDataInput.php | 7 +- src/Dto/Input/MultipleClientsInput.php | 9 + src/Dto/Input/NetworkSettingsInput.php | 77 +- src/Dto/Input/OperativeSystemInput.php | 5 + src/Dto/Input/OrganizationalUnitInput.php | 53 +- src/Dto/Input/PartitionInput.php | 4 - src/Dto/Input/SubnetAddHostInput.php | 7 +- src/Dto/Input/TransferGlobalImageInput.php | 6 +- src/Dto/Input/UserGroupInput.php | 13 + src/Dto/Input/UserInput.php | 42 +- src/Dto/Input/WoLInput.php | 5 +- src/Dto/Output/ClientOutput.php | 88 +- src/Dto/Output/CommandGroupOutput.php | 17 + src/Dto/Output/CommandOutput.php | 33 + src/Dto/Output/CommandTaskOutput.php | 37 + src/Dto/Output/CommandTaskScheduleOutput.php | 21 + src/Dto/Output/CommandTaskScriptOutput.php | 21 + src/Dto/Output/GitRepositoryOutput.php | 29 + src/Dto/Output/HardwareOutput.php | 21 +- src/Dto/Output/HardwareProfileOutput.php | 24 + src/Dto/Output/HardwareTypeOutput.php | 17 + src/Dto/Output/ImageImageRepositoryOutput.php | 45 + src/Dto/Output/ImageOutput.php | 42 + src/Dto/Output/ImageRepositoryOutput.php | 29 + src/Dto/Output/MenuOutput.php | 33 + src/Dto/Output/NetworkSettingsOutput.php | 89 + src/Dto/Output/OgLiveOutput.php | 60 + src/Dto/Output/OperativeSystemOutput.php | 13 + src/Dto/Output/OrganizationalUnitOutput.php | 74 +- src/Dto/Output/PartitionOutput.php | 37 + src/Dto/Output/PxeTemplateOutput.php | 28 + src/Dto/Output/RemoteCalendarOutput.php | 13 + src/Dto/Output/RemoteCalendarRuleOutput.php | 29 + src/Dto/Output/SoftwareOutput.php | 20 + src/Dto/Output/SoftwareProfileOutput.php | 28 + src/Dto/Output/SubnetOutput.php | 44 + src/Dto/Output/TraceOutput.php | 45 + src/Dto/Output/UserGroupOutput.php | 21 + src/Dto/Output/UserOutput.php | 36 + src/Dto/Output/ViewOutput.php | 13 + src/Factory/ClientFactory.php | 2 + src/Factory/HardwareProfileFactory.php | 2 +- tests/Functional/ClientTest.php | 18 +- tests/Functional/HardwareProfileTest.php | 11 +- tests/Functional/ImageRepositoryTest.php | 10 - tests/Functional/MenuTest.php | 8 - tests/Functional/OgLiveTest.php | 4 - tests/Functional/PartitionTest.php | 14 - tests/Functional/ViewTest.php | 5 - 68 files changed, 5565 insertions(+), 211 deletions(-) create mode 100644 ogCore_Documentacion_Tecnica.html create mode 100644 ogCore_Documentacion_Tecnica.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e080a0..d60ed6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # Changelog +## [0.26.0] - 2025-10-09 +### Added +- Se han añadido nueva documentacion en swagger para facilitar la integracion de ogCore +- Se ha añadido y completado el README y la documentacion funcional + +--- ## [0.25.1] - 2025-10-01 ### Fixed - Se han corregido varios errores con respecto a las tareas programadas. diff --git a/README.md b/README.md index 31e23ec..1a52c11 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,1828 @@ -# ogCore project +# ogCore - Documentación Técnica y Funcional -## Descripción +## Tabla de Contenidos -ogCore es el servicio central de OpenGnsys, diseñado para proporcionar funcionalidades a través de una API RESTful. Esta herramienta utiliza tecnología PHP, aprovechando el framework Symfony y el ORM Doctrine para gestionar la base de datos. -A continuación, se detallan los pasos necesarios para desplegar el proyecto en un entorno de desarrollo. +1. [Introducción](#1-introducción) +2. [Descripción del Proyecto](#2-descripción-del-proyecto) +3. [Arquitectura del Sistema](#3-arquitectura-del-sistema) +4. [Tecnologías Utilizadas](#4-tecnologías-utilizadas) +5. [Requisitos del Sistema](#5-requisitos-del-sistema) +6. [Instalación y Configuración](#6-instalación-y-configuración) +7. [Modelo de Datos](#7-modelo-de-datos) +8. [Componentes del Sistema](#8-componentes-del-sistema) +9. [API RESTful](#9-api-restful) +10. [Seguridad y Autenticación](#10-seguridad-y-autenticación) +11. [Servicios Principales](#11-servicios-principales) +12. [Comandos de Consola](#12-comandos-de-consola) +13. [Migraciones de Datos](#13-migraciones-de-datos) +14. [Testing](#14-testing) +15. [Despliegue](#15-despliegue) +16. [Mantenimiento y Operaciones](#16-mantenimiento-y-operaciones) +17. [Integración con Otros Servicios](#17-integración-con-otros-servicios) +18. [Roadmap y Changelog](#18-roadmap-y-changelog) +19. [Contribución](#19-contribución) +20. [Soporte y Contacto](#20-soporte-y-contacto) -## Versiones y tecnologías utilizadas +--- -- PHP 8.3 -- Symfony 6.4 -- Doctrine 2.19 -- API Platform 3.2 -- MariaDB 10.11 +## 1. Introducción -## Requisitos +**ogCore** es el servicio central de **OpenGnsys**, una plataforma de código abierto diseñada para la gestión centralizada de aulas de informática, laboratorios y entornos educativos. Este servicio proporciona una API RESTful robusta que permite administrar de manera eficiente clientes (equipos), imágenes de sistemas operativos, perfiles de hardware y software, tareas programadas, y mucho más. -Antes de comenzar, asegúrate de tener los siguientes requisitos: +### 1.1 Propósito del Sistema -- Docker -- Docker compose +El propósito principal de ogCore es: -## Instalación +- **Centralizar la gestión** de equipos informáticos en entornos educativos y corporativos +- **Automatizar el despliegue** de sistemas operativos e imágenes +- **Gestionar inventarios** de hardware y software +- **Programar y ejecutar tareas** de manera automática +- **Proporcionar trazabilidad** de todas las operaciones realizadas +- **Facilitar la migración** desde versiones anteriores de OpenGnsys -### Desplegar contenedores +### 1.2 Alcance -Para que no haya conflictos entre los puertos, asegúrate de que no tienes ningún servicio corriendo en los puertos 8080 y 3306. +ogCore gestiona: +- Clientes (equipos físicos) +- Imágenes de sistemas operativos +- Repositorios de imágenes +- Perfiles de hardware y software +- Unidades organizativas (aulas, grupos) +- Redes y subredes +- Plantillas PXE +- Menús de arranque +- Comandos y tareas programadas +- Trazas de ejecución +- Calendarios remotos +- Integración con sistemas externos (UDS, ogRepository, ogDhcp, ogBoot) -```sh +--- + +## 2. Descripción del Proyecto + +### 2.1 ¿Qué es ogCore? + +ogCore es el núcleo central de OpenGnsys desarrollado con tecnologías modernas de PHP. Actúa como backend que expone una API RESTful completa, permitiendo la gestión de todos los aspectos relacionados con la administración de aulas informáticas. + +### 2.2 Características Principales + +- **API RESTful completa** con documentación Swagger/OpenAPI +- **Autenticación JWT** con refresh tokens +- **Arquitectura basada en eventos** con notificaciones en tiempo real (Mercure) +- **Sistema de colas** para la ejecución de tareas programadas +- **Integración con múltiples servicios** externos +- **Migraciones automatizadas** desde OpenGnsys 1.1 +- **Versionado de imágenes** con integración Git +- **Sistema de trazabilidad** completo +- **Gestión de hardware** con inventario automático +- **Despliegues masivos** de imágenes (unicast, multicast, torrent, p2p) +- **Gestión de particiones** automática +- **Sistema de validación** robusto + +### 2.3 Versión Actual + +- **Versión**: 0.5.0 +- **Estado**: En desarrollo activo +- **Última actualización**: Octubre 2025 + +--- + +## 3. Arquitectura del Sistema + +### 3.1 Arquitectura General + +ogCore sigue una arquitectura de **microservicios** basada en el patrón **API-First**: + +``` ++-------------------------------------------------------------+ +| Frontend (Web UI) | ++---------------------------+----------------------------------+ + | + | HTTP/REST + | ++---------------------------v---------------------------------+ +| ogCore API (Symfony) | +| +------------------------------------------------------+ | +| | Controllers | States | DTOs | Validators | Filters | | +| +------------------------------------------------------+ | +| +------------------------------------------------------+ | +| | Business Logic (Services) | | +| +------------------------------------------------------+ | +| +------------------------------------------------------+ | +| | Entities | Repositories | Doctrine ORM | | +| +------------------------------------------------------+ | ++---------------------------+----------------+----------------+ + | | + +------------------v--+ +--------v--------+ + | MariaDB | | Mercure | + | Database | | (WebSocket) | + +---------------------+ +-----------------+ + ++-------------------------------------------------------------+ +| Servicios Externos Integrados | ++--------------+--------------+--------------+----------------+ +| ogRepository | ogDhcp | ogBoot | UDS/Git | ++--------------+--------------+--------------+----------------+ +``` + +### 3.2 Capas de la Aplicación + +#### 3.2.1 Capa de Presentación (API) +- **API Platform**: Framework para crear APIs REST +- **Controllers**: Controladores personalizados (102 controladores) +- **DTOs (Data Transfer Objects)**: 93 objetos de transferencia de datos +- **OpenAPI/Swagger**: Documentación automática de la API + +#### 3.2.2 Capa de Negocio +- **Services**: Lógica de negocio (13 servicios principales) +- **Handlers**: Manejadores de eventos (2 handlers) +- **EventSubscribers**: Suscriptores de eventos (8 suscriptores) +- **Validators**: Validadores personalizados (18 validadores) + +#### 3.2.3 Capa de Datos +- **Entities**: 35 entidades del modelo de datos +- **Repositories**: 32 repositorios personalizados +- **Doctrine ORM**: Mapeo objeto-relacional +- **Migrations**: 85 migraciones de base de datos + +#### 3.2.4 Capa de Infraestructura +- **Docker**: Contenedorización de servicios +- **Nginx**: Servidor web reverse proxy +- **PHP-FPM**: Procesador de PHP +- **MariaDB**: Sistema de gestión de base de datos +- **Mercure**: Sistema de notificaciones en tiempo real + +### 3.3 Patrones de Diseño Utilizados + +1. **Repository Pattern**: Para abstracción de acceso a datos +2. **DTO Pattern**: Para transferencia de datos entre capas +3. **Factory Pattern**: Para creación de entidades complejas +4. **Event-Driven Architecture**: Para notificaciones y reactividad +5. **State Pattern**: Para gestión de estados de procesamiento +6. **Service Layer**: Para encapsulación de lógica de negocio + +--- + +## 4. Tecnologías Utilizadas + +### 4.1 Backend + +| Tecnología | Versión | Propósito | +|------------|---------|-----------| +| **PHP** | 8.3 | Lenguaje de programación principal | +| **Symfony** | 6.4 | Framework web principal | +| **Doctrine ORM** | 2.19 | Mapeo objeto-relacional | +| **API Platform** | 3.2 | Creación de APIs REST | +| **Lexik JWT** | 3.0 | Autenticación JWT | +| **Gesdinet JWT Refresh Token** | 1.3 | Refresh tokens | +| **Stof Doctrine Extensions** | 1.10 | Extensiones de Doctrine (timestampable, etc.) | +| **Ramsey UUID** | 2.0 | Generación de UUIDs | + +### 4.2 Base de Datos + +| Tecnología | Versión | Propósito | +|------------|---------|-----------| +| **MariaDB** | 10.11 | Sistema de gestión de base de datos | +| **Doctrine DBAL** | 3.x | Capa de abstracción de base de datos | +| **Doctrine Migrations** | 3.3 | Gestión de migraciones | + +### 4.3 Infraestructura + +| Tecnología | Versión | Propósito | +|------------|---------|-----------| +| **Docker** | Latest | Contenedorización | +| **Docker Compose** | Latest | Orquestación de contenedores | +| **Nginx** | Latest | Servidor web / Reverse proxy | +| **PHP-FPM** | 8.3 | Procesador FastCGI | +| **Mercure** | 0.3.9 | Hub de notificaciones en tiempo real | + +### 4.4 Testing + +| Tecnología | Versión | Propósito | +|------------|---------|-----------| +| **PHPUnit** | 9.5 | Framework de testing | +| **Symfony PHPUnit Bridge** | 7.0 | Integración con Symfony | +| **DAMA Doctrine Test Bundle** | 8.1 | Transacciones de prueba | +| **Zenstruck Foundry** | 1.37 | Factories para testing | + +### 4.5 Desarrollo + +| Tecnología | Versión | Propósito | +|------------|---------|-----------| +| **Symfony Maker Bundle** | 1.59 | Generación de código | +| **Symfony Web Profiler** | 6.4 | Debugging y profiling | +| **Monolog** | 3.x | Logging | +| **PHPStan** | Latest | Análisis estático | + +--- + +## 5. Requisitos del Sistema + +### 5.1 Requisitos de Hardware (Producción) + +- **CPU**: Mínimo 4 cores, recomendado 8+ cores +- **RAM**: Mínimo 8GB, recomendado 16GB+ +- **Disco**: + - Sistema: 20GB SSD + - Base de datos: 50GB+ SSD + - Logs: 10GB +- **Red**: 1Gbps mínimo + +### 5.2 Requisitos de Software + +- **Sistema Operativo**: Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+) +- **Docker**: >= 20.10 +- **Docker Compose**: >= 2.0 +- **Git**: >= 2.25 (para gestión de código) + +### 5.3 Puertos Requeridos + +| Puerto | Servicio | Propósito | +|--------|----------|-----------| +| 8080 | Nginx/HTTP | API y documentación | +| 3306 | MariaDB | Base de datos | +| 9000 | PHP-FPM | Procesador PHP | +| 3000 | Mercure | WebSocket/SSE | + +--- + +## 6. Instalación y Configuración + +### 6.1 Instalación con Docker (Recomendado) + +#### 6.1.1 Clonar el Repositorio + +```bash +git clone ogcore +cd ogcore +``` + +#### 6.1.2 Verificar Puertos Disponibles + +Asegúrate de que los puertos 8080 y 3306 no estén en uso: + +```bash +sudo lsof -i :8080 +sudo lsof -i :3306 +``` + +#### 6.1.3 Desplegar Contenedores + +```bash docker compose up --build -d ``` -Comprobamos que se han levantado correctamente bien los 3 contenedores de la aplicación: +#### 6.1.4 Verificar Contenedores -```sh +```bash docker ps ``` -Y deberiamos ver algo parecido a : +Deberías ver tres contenedores activos: +- `ogcore-nginx` +- `ogcore-php` +- `ogcore-database` -- ogcore-nginx -- ogcore-php -- ogcore-database +#### 6.1.5 Instalar Dependencias - -### Instalamos dependencias - -```sh +```bash docker exec ogcore-php composer install +``` + +#### 6.1.6 Generar Claves JWT + +```bash docker exec ogcore-php php bin/console lexik:jwt:generate-keypair --overwrite ``` -Comprobamos, que el contenedor de Nginx, tiene el puerto 8080 levantado correctamente, asi que tan solo tendremos que -acceder a la siguiente URL: +#### 6.1.7 Inicializar Base de Datos -```sh -http://127.0.0.1:8080/docs -``` -Si todo ha ido bien, deberiamos ver la documentación de la API de ogCore. - -Para poder actualizar la base de datos: - -Para inicializar la base de datos: - -```sh +```bash +# Ejecutar migraciones docker exec ogcore-php php bin/console doctrine:migrations:migrate --no-interaction -``` -```sh +# Cargar datos iniciales (fixtures) docker exec ogcore-php php bin/console doctrine:fixtures:load --no-interaction -docker exec ogcore-php php bin/console app:load-default-user-groups #cargamos los grupos por defecto -docker exec ogcore-php php bin/console app:load-default-commands #cargamos los commands por defecto + +# Cargar grupos de usuarios por defecto +docker exec ogcore-php php bin/console app:load-default-user-groups + +# Cargar comandos por defecto +docker exec ogcore-php php bin/console app:load-default-commands ``` -## UX Api Platform +#### 6.1.8 Acceder a la Aplicación -Api Platform proporciona una interfaz de usuario para interactuar con la API de ogCore. Para acceder a la interfaz de usuario, accede a la siguiente URL: +Abre tu navegador y accede a: -```sh +``` http://127.0.0.1:8080/docs ``` -Para poder autenticarte, necesitas un token JWT. Para obtenerlo, accedemos al endpoint de autenticación "auth/login": +Deberías ver la documentación Swagger de la API de ogCore. -![img.png](swagger-assets/img.png) -![img.png](swagger-assets/img2.png) -Obtenemos el token y lo introducimos en la interfaz de usuario de Api Platform de la siguiente manera: +### 6.2 Configuración -![img.png](swagger-assets/img3.png) +#### 6.2.1 Variables de Entorno -Ahora, ya podemos interactuar con la API de ogCore. Para comprobar que todo está correcto, podemos fijarnos en los headers de las llamadas Curl, y ver que el token JWT se ha introducido correctamente. +El archivo `.env` contiene las variables de configuración principales: -## Test +```bash +# Entorno +APP_ENV=dev +APP_SECRET= -Para ejecutar los test, ejecutamos el siguiente comando: +# Base de datos +DATABASE_URL="mysql://user:password@ogcore-database:3306/ogcore" -```sh -docker compose exec php bin/phpunit +# JWT +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE= + +# Mercure +MERCURE_URL=http://mercure:3000/.well-known/mercure +MERCURE_PUBLIC_URL=http://127.0.0.1:8080/.well-known/mercure +MERCURE_JWT_SECRET= + +# Servicios externos +REMOTE_PC_URL= +REMOTE_PC_AUTH_LOGIN= +REMOTE_PC_AUTH_USERNAME= +REMOTE_PC_AUTH_PASSWORD= + +# SSL/TLS +SSL_ENABLED=false ``` -## Reiniciar base de datos +#### 6.2.2 Configuración de CORS -Es posible que en momentos de desarrollo, sea necesario volver a cargar la base de datos y actualizar los esquemas de la misma, para ello, ejecutamos el siguiente comando: +Edita `config/packages/nelmio_cors.yaml` para configurar CORS según tus necesidades. -```sh -docker exec ogcore-php php bin/console doctrine:database:drop --force -docker exec ogcore-php php bin/console doctrine:database:create +#### 6.2.3 Configuración de API Platform + +La configuración de API Platform se encuentra en `config/packages/api_platform.yaml`. + +### 6.3 Instalación en Producción + +Para entornos de producción, utiliza el archivo `docker-compose-deploy.yml`: + +```bash +docker compose -f docker-compose-deploy.yml up -d ``` -## Migraciones de datos +Asegúrate de: +- Cambiar todas las contraseñas por defecto +- Configurar SSL/TLS +- Configurar backups automáticos de base de datos +- Configurar monitoreo y alertas +- Revisar los límites de recursos de Docker -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. +## 7. Modelo de Datos -Mediante doctrine, creamos la base de datos temporal: +### 7.1 Diagrama de Entidades -```sh +El sistema cuenta con 35 entidades principales agrupadas en los siguientes dominios: + +### 7.2 Entidades Principales + +#### 7.2.1 Client (Cliente) + +Representa un equipo físico en el sistema. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del cliente +- `serialNumber`: Número de serie +- `mac`: Dirección MAC (única) +- `ip`: Dirección IP (única) +- `status`: Estado del cliente (active, inactive, busy, windows, linux, etc.) +- `netiface`: Interfaz de red +- `netDriver`: Driver de red +- `validation`: Estado de validación +- `maintenance`: Modo mantenimiento +- `position`: Posición en el aula (x, y) +- `firmwareType`: Tipo de firmware (BIOS/UEFI) +- `agentJobId`: ID del trabajo del agente en ejecución +- `pxeSync`: Sincronización PXE +- `token`: Token de autenticación del cliente + +**Relaciones:** +- `organizationalUnit`: Pertenece a una unidad organizativa (aula/grupo) +- `partitions`: Tiene múltiples particiones +- `menu`: Menú de arranque asignado +- `hardwareProfile`: Perfil de hardware asociado +- `template`: Plantilla PXE asignada +- `repository`: Repositorio de imágenes +- `subnet`: Subred a la que pertenece +- `ogLive`: Imagen Live asignada + +#### 7.2.2 OrganizationalUnit (Unidad Organizativa) + +Representa aulas o grupos de equipos. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre de la unidad +- `description`: Descripción +- `type`: Tipo (aula, grupo, etc.) + +**Relaciones:** +- `parent`: Unidad organizativa padre (jerarquía) +- `children`: Unidades hijas +- `clients`: Clientes pertenecientes +- `networkSettings`: Configuración de red heredable +- `remoteCalendar`: Calendario remoto asociado + +#### 7.2.3 Image (Imagen) + +Representa una imagen de sistema operativo. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre de la imagen +- `description`: Descripción +- `type`: Tipo de imagen +- `size`: Tamaño en bytes +- `partition`: Partición de origen +- `status`: Estado (creating, success, failed, etc.) +- `isGlobal`: Imagen global compartida +- `isVirtual`: Imagen virtual +- `version`: Versión de la imagen + +**Relaciones:** +- `operativeSystem`: Sistema operativo +- `softwareProfile`: Perfil de software +- `repositories`: Repositorios que contienen la imagen +- `originClient`: Cliente origen de la imagen + +#### 7.2.4 Command (Comando) + +Comandos ejecutables en el sistema. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del comando +- `description`: Descripción +- `script`: Script a ejecutar + +**Relaciones:** +- `commandGroups`: Grupos de comandos a los que pertenece + +#### 7.2.5 CommandTask (Tarea de Comando) + +Tarea programada para ejecutar comandos. + +**Campos principales:** +- `id`: UUID único +- `datetime`: Fecha y hora de ejecución +- `parameters`: Parámetros de ejecución +- `status`: Estado de la tarea + +**Relaciones:** +- `commands`: Comandos a ejecutar +- `commandGroups`: Grupos de comandos +- `clients`: Clientes objetivo +- `schedule`: Programación recurrente + +#### 7.2.6 Trace (Traza) + +Registro de ejecución de comandos. + +**Campos principales:** +- `id`: UUID único +- `command`: Nombre del comando ejecutado +- `input`: Parámetros de entrada +- `output`: Resultado de ejecución +- `status`: Estado (pending, processing, success, failed, cancelled) +- `executedAt`: Fecha de ejecución +- `finishedAt`: Fecha de finalización +- `cancelled`: Indica si fue cancelada +- `jobId`: ID del trabajo en el agente + +**Relaciones:** +- `client`: Cliente donde se ejecutó + +#### 7.2.7 HardwareProfile (Perfil de Hardware) + +Inventario de hardware de un cliente. + +**Campos principales:** +- `id`: UUID único +- `cpu`: Información de CPU +- `ram`: Memoria RAM +- `storage`: Almacenamiento +- `networkCards`: Tarjetas de red + +**Relaciones:** +- `client`: Cliente asociado +- `hardwareTypes`: Tipos de hardware detectados + +#### 7.2.8 SoftwareProfile (Perfil de Software) + +Software instalado en una imagen. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del perfil + +**Relaciones:** +- `software`: Software incluido +- `images`: Imágenes que usan este perfil + +#### 7.2.9 ImageRepository (Repositorio de Imágenes) + +Servidor de almacenamiento de imágenes. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del repositorio (único) +- `ip`: Dirección IP o DNS (único) +- `port`: Puerto +- `sshPort`: Puerto SSH +- `sshUser`: Usuario SSH +- `apiKey`: Clave API +- `status`: Estado del repositorio + +**Relaciones:** +- `images`: Imágenes almacenadas + +#### 7.2.10 Subnet (Subred) + +Configuración de red. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre de la subred +- `cidr`: Notación CIDR +- `gateway`: Puerta de enlace +- `dns`: Servidores DNS +- `dhcpStart`: Inicio rango DHCP +- `dhcpEnd`: Fin rango DHCP + +**Relaciones:** +- `clients`: Clientes en la subred + +#### 7.2.11 Partition (Partición) + +Partición de disco de un cliente. + +**Campos principales:** +- `id`: UUID único +- `partitionNumber`: Número de partición +- `partitionType`: Tipo de partición +- `partitionSize`: Tamaño +- `partitionCode`: Código de partición +- `usedSize`: Tamaño usado +- `filesystem`: Sistema de archivos + +**Relaciones:** +- `client`: Cliente propietario +- `image`: Imagen desplegada +- `operativeSystem`: Sistema operativo instalado + +#### 7.2.12 PxeTemplate (Plantilla PXE) + +Plantilla de arranque PXE. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre de la plantilla +- `content`: Contenido de la plantilla +- `default`: Plantilla por defecto + +**Relaciones:** +- `clients`: Clientes que usan la plantilla + +#### 7.2.13 RemoteCalendar (Calendario Remoto) + +Integración con sistemas de reservas remotas. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del calendario +- `url`: URL del servicio +- `available`: Disponibilidad + +**Relaciones:** +- `organizationalUnits`: Unidades organizativas asociadas +- `rules`: Reglas del calendario + +#### 7.2.14 User (Usuario) + +Usuario del sistema. + +**Campos principales:** +- `id`: UUID único +- `username`: Nombre de usuario (único) +- `password`: Contraseña (hasheada) +- `email`: Correo electrónico +- `roles`: Roles del usuario + +**Relaciones:** +- `userGroups`: Grupos de usuarios +- `view`: Vista preferida + +#### 7.2.15 GitRepository (Repositorio Git) + +Repositorio Git para versionado de imágenes. + +**Campos principales:** +- `id`: UUID único +- `name`: Nombre del repositorio +- `url`: URL del repositorio +- `branch`: Rama +- `credentials`: Credenciales de acceso + +### 7.3 Índices y Optimizaciones + +La base de datos está optimizada con índices en: +- Campos de búsqueda frecuente (status, updatedAt) +- Campos únicos (IP, MAC, username) +- Claves foráneas +- Índices compuestos para consultas complejas + +--- + +## 8. Componentes del Sistema + +### 8.1 Controllers (Controladores) + +El sistema cuenta con **102 controladores** organizados por dominio: + +#### Controladores principales: +- **ClientController**: Gestión de clientes +- **ImageController**: Gestión de imágenes +- **OrganizationalUnitController**: Gestión de unidades organizativas +- **CommandController**: Gestión de comandos +- **TraceController**: Gestión de trazas +- **UserController**: Gestión de usuarios +- **SubnetController**: Gestión de subredes +- **RepositoryController**: Gestión de repositorios + +### 8.2 States (Procesadores de Estado) + +Los States implementan el patrón State de API Platform: + +#### States principales (55 procesadores): +- **Providers**: Obtención de datos +- **Processors**: Procesamiento de escritura +- **Custom States**: Lógica personalizada + +### 8.3 DTOs (Data Transfer Objects) + +**93 DTOs** para transferencia de datos: + +#### Tipos de DTOs: +- **Input DTOs**: Para recepción de datos +- **Output DTOs**: Para envío de datos +- **Transformation DTOs**: Para transformaciones + +### 8.4 Validators (Validadores) + +**18 validadores personalizados** para: +- Validación de IPs y MACs +- Validación de rangos DHCP +- Validación de particiones +- Validación de imágenes +- Validación de comandos +- Validación de usuarios + +### 8.5 EventSubscribers (Suscriptores de Eventos) + +**8 suscriptores** para: +- Publicación en Mercure al cambiar estados +- Limpieza de recursos +- Validaciones pre/post persistencia +- Logging de eventos + +### 8.6 Factories (Fábricas) + +**24 factories** para testing con Foundry: +- Creación de entidades para tests +- Datos de prueba realistas +- Estados predefinidos + +--- + +## 9. API RESTful + +### 9.1 Documentación + +La API está completamente documentada con **OpenAPI 3.0** y accesible en: + +``` +http://127.0.0.1:8080/docs +``` + +### 9.2 Formato de Respuestas + +#### Formato estándar (JSON-LD): + +```json +{ + "@context": "/contexts/Client", + "@id": "/clients/123e4567-e89b-12d3-a456-426614174000", + "@type": "Client", + "id": "123e4567-e89b-12d3-a456-426614174000", + "name": "PC-01", + "mac": "00:11:22:33:44:55", + "ip": "192.168.1.100", + "status": "active" +} +``` + +#### Formato alternativo (JSON): + +```json +{ + "id": "123e4567-e89b-12d3-a456-426614174000", + "name": "PC-01", + "mac": "00:11:22:33:44:55", + "ip": "192.168.1.100", + "status": "active" +} +``` + +### 9.3 Paginación + +Todas las colecciones soportan paginación: + +``` +GET /clients?page=1&itemsPerPage=30 +``` + +Respuesta: + +```json +{ + "@context": "/contexts/Client", + "@id": "/clients", + "@type": "hydra:Collection", + "hydra:member": [...], + "hydra:totalItems": 150, + "hydra:view": { + "@id": "/clients?page=1", + "@type": "hydra:PartialCollectionView", + "hydra:first": "/clients?page=1", + "hydra:last": "/clients?page=5", + "hydra:next": "/clients?page=2" + } +} +``` + +### 9.4 Filtrado + +Soporta filtros avanzados: + +``` +GET /clients?status=active +GET /clients?organizationalUnit.name=Aula1 +GET /traces?client.id=123&status=pending +``` + +### 9.5 Ordenamiento + +``` +GET /clients?order[name]=asc +GET /traces?order[createdAt]=desc +``` + +### 9.6 Endpoints Principales + +#### 9.6.1 Autenticación + +``` +POST /auth/login +POST /auth/refresh +``` + +#### 9.6.2 Clientes + +``` +GET /clients +POST /clients +GET /clients/{id} +PUT /clients/{id} +PATCH /clients/{id} +DELETE /clients/{id} +POST /clients/batch +POST /clients/{id}/power-on +POST /clients/{id}/power-off +POST /clients/{id}/reboot +``` + +#### 9.6.3 Imágenes + +``` +GET /images +POST /images +GET /images/{id} +PUT /images/{id} +DELETE /images/{id} +POST /images/{id}/deploy +POST /images/{id}/create +POST /images/{id}/backup +``` + +#### 9.6.4 Comandos y Tareas + +``` +GET /commands +POST /commands +GET /command-tasks +POST /command-tasks +PUT /command-tasks/{id} +DELETE /command-tasks/{id} +``` + +#### 9.6.5 Trazas + +``` +GET /traces +GET /traces/{id} +PUT /traces/{id} +PATCH /traces/{id}/complete +PATCH /traces/{id}/cancel +``` + +### 9.7 Códigos de Estado HTTP + +| Código | Significado | +|--------|-------------| +| 200 | OK - Operación exitosa | +| 201 | Created - Recurso creado | +| 204 | No Content - Eliminación exitosa | +| 400 | Bad Request - Datos inválidos | +| 401 | Unauthorized - No autenticado | +| 403 | Forbidden - Sin permisos | +| 404 | Not Found - Recurso no encontrado | +| 409 | Conflict - Conflicto (cliente ocupado, constraint violation) | +| 422 | Unprocessable Entity - Validación fallida | +| 500 | Internal Server Error - Error del servidor | + +--- + +## 10. Seguridad y Autenticación + +### 10.1 Sistema de Autenticación JWT + +ogCore utiliza **JSON Web Tokens (JWT)** para autenticación: + +#### 10.1.1 Obtener Token + +```bash +POST /auth/login +Content-Type: application/json + +{ + "username": "admin", + "password": "password" +} +``` + +Respuesta: + +```json +{ + "token": "eyJ0eXAiOiJKV1QiLCJhbGc...", + "refresh_token": "def50200a54b7b..." +} +``` + +#### 10.1.2 Usar Token + +Incluir el token en el header `Authorization`: + +```bash +GET /clients +Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc... +``` + +#### 10.1.3 Refresh Token + +```bash +POST /auth/refresh +Content-Type: application/json + +{ + "refresh_token": "def50200a54b7b..." +} +``` + +### 10.2 Control de Acceso + +#### Rutas Públicas: +- `/auth/login` +- `/auth/refresh` +- `/docs` +- `/opengnsys/rest/*` (webhooks) +- `/og-repository/webhook` +- `/menu-browser` + +#### Rutas Protegidas: +- Todo lo demás requiere `IS_AUTHENTICATED_FULLY` + +### 10.3 Roles de Usuario + +Los roles se gestionan en la entidad `User`: + +```php +$user->setRoles(['ROLE_USER']); +$user->setRoles(['ROLE_ADMIN']); +``` + +### 10.4 Seguridad de Contraseñas + +- Hashing con **bcrypt** automático +- Validación de fortaleza +- Cambio de contraseña seguro + +### 10.5 CORS (Cross-Origin Resource Sharing) + +Configurado en `nelmio_cors.yaml` para permitir acceso desde frontend. + +### 10.6 SSL/TLS + +Para producción, habilitar SSL: + +```bash +SSL_ENABLED=true +``` + +Configurar certificados en `/certs/`. + +--- + +## 11. Servicios Principales + +### 11.1 CreatePartitionService + +**Propósito**: Crear y actualizar particiones de clientes. + +**Funcionalidad**: +- Recibe información de particiones del agente +- Crea/actualiza particiones en base de datos +- Detecta tipo de firmware (BIOS/UEFI) +- Calcula códigos de partición + +### 11.2 CreateTraceService + +**Propósito**: Crear trazas de ejecución para tareas programadas. + +**Funcionalidad**: +- Genera trazas para cada combinación cliente-comando +- Gestiona comandos agrupados +- Establece estado inicial y fecha de ejecución + +### 11.3 ChangeClientNetworkSettingsService + +**Propósito**: Cambiar configuración de red de clientes. + +**Funcionalidad**: +- Actualiza subnet, IP, configuración de red +- Sincroniza con servicios externos (DHCP) + +### 11.4 ExternalGitRepositoryService + +**Propósito**: Gestión de repositorios Git para imágenes. + +**Funcionalidad**: +- Backup de imágenes a Git +- Versionado de imágenes +- Sincronización con repositorios remotos + +### 11.5 StatusService (OgBoot/OgDhcp/OgRepository) + +**Propósito**: Verificar estado de servicios externos. + +**Funcionalidad**: +- Health checks de servicios +- Manejo de errores de conexión +- Logging de estado + +### 11.6 UDSClient + +**Propósito**: Integración con UDS (Universal Desktop Services). + +**Funcionalidad**: +- Autenticación con UDS +- Obtención de service pools +- Cálculo de asientos disponibles +- Gestión de calendarios remotos + +### 11.7 Trace/CreateService + +**Propósito**: Servicio especializado para creación de trazas. + +**Funcionalidad**: +- Validación de parámetros de entrada +- Creación de trazas individuales o masivas + +### 11.8 Utils/GetPartitionCodeService + +**Propósito**: Obtener código de partición según tipo y filesystem. + +### 11.9 Utils/SimplifyOgLiveFilenameService + +**Propósito**: Simplificar nombres de archivos OgLive para mostrar al usuario. + +### 11.10 Utils/GetIpAddressAndNetmaskFromCIDRService + +**Propósito**: Convertir notación CIDR a IP y máscara de red. + +--- + +## 12. Comandos de Consola + +ogCore incluye **18 comandos de consola** para tareas administrativas: + +### 12.1 Comandos de Inicialización + +#### 12.1.1 Cargar Grupos de Usuario por Defecto + +```bash +php bin/console app:load-default-user-groups +``` + +Crea los grupos de usuarios predeterminados del sistema. + +#### 12.1.2 Cargar Comandos por Defecto + +```bash +php bin/console app:load-default-commands +``` + +Carga los comandos básicos del sistema. + +#### 12.1.3 Cargar Usuario Admin + +```bash +php bin/console app:load-default-user-admin +``` + +Crea el usuario administrador por defecto. + +#### 12.1.4 Cargar Menú por Defecto + +```bash +php bin/console app:load-default-menu +``` + +Carga menús de arranque predeterminados. + +#### 12.1.5 Cargar Tipos de Hardware + +```bash +php bin/console app:load-hardware-types +``` + +Inicializa la tabla de tipos de hardware. + +#### 12.1.6 Cargar Unidad Organizativa por Defecto + +```bash +php bin/console app:load-organizational-unit-default +``` + +Crea la unidad organizativa raíz. + +### 12.2 Comandos de Operación + +#### 12.2.1 Verificar Disponibilidad de Clientes + +```bash +php bin/console app:check-client-availability +``` + +**Ejecución**: Cada 1 minuto (cron) + +Verifica el estado de conectividad de los clientes y actualiza su estado si no responden en un tiempo determinado. + +#### 12.2.2 Ejecutar Trazas Pendientes + +```bash +php bin/console app:execute-pending-traces +``` + +**Ejecución**: Cada 1 minuto (cron) + +Procesa las trazas en estado `PENDING` y las ejecuta en los clientes correspondientes. + +#### 12.2.3 Ejecutar Tareas Programadas + +```bash +php bin/console app:run-scheduled-command-tasks +``` + +**Ejecución**: Cada 1 minuto (cron) + +Ejecuta tareas programadas que han llegado a su hora de ejecución. + +### 12.3 Comandos de Migración + +Comandos para migrar datos desde OpenGnsys 1.1: + +#### 12.3.1 Migrar Unidades Organizativas + +```bash +php bin/console opengnsys:migration:organizational-unit +``` + +#### 12.3.2 Migrar Perfiles de Hardware + +```bash +php bin/console opengnsys:migration:hardware-profile +``` + +#### 12.3.3 Migrar Clientes + +```bash +php bin/console opengnsys:migration:clients +``` + +#### 12.3.4 Migrar Sistemas Operativos + +```bash +php bin/console opengnsys:migration:os +``` + +#### 12.3.5 Migrar Imágenes + +```bash +php bin/console opengnsys:migration:image +``` + +#### 12.3.6 Migrar Perfiles de Software + +```bash +php bin/console opengnsys:migration:software-profile +``` + +#### 12.3.7 Migrar Particiones de Clientes + +```bash +php bin/console opengnsys:migration:partition-client +``` + +### 12.4 Comandos de Desarrollo + +#### 12.4.1 Crear Repositorios de Imágenes + +```bash +php bin/console app:create-image-repositories +``` + +Crea repositorios de imágenes para desarrollo/testing. + +#### 12.4.2 Cargar Trazas de Ejemplo + +```bash +php bin/console app:charge-example-trace +``` + +Carga trazas de ejemplo para testing. + +### 12.5 Configuración de Cron + +Agregar al crontab: + +```bash +* * * * * docker exec ogcore-php php bin/console app:check-client-availability +* * * * * docker exec ogcore-php php bin/console app:execute-pending-traces +* * * * * docker exec ogcore-php php bin/console app:run-scheduled-command-tasks +``` + +--- + +## 13. Migraciones de Datos + +### 13.1 Sistema de Migraciones de Doctrine + +ogCore utiliza Doctrine Migrations para gestionar cambios en el esquema de base de datos. + +#### 13.1.1 Crear una Migración + +```bash +docker exec ogcore-php php bin/console make:migration +``` + +#### 13.1.2 Ejecutar Migraciones + +```bash +docker exec ogcore-php php bin/console doctrine:migrations:migrate +``` + +#### 13.1.3 Ver Estado de Migraciones + +```bash +docker exec ogcore-php php bin/console doctrine:migrations:status +``` + +#### 13.1.4 Revertir Migración + +```bash +docker exec ogcore-php php bin/console doctrine:migrations:migrate prev +``` + +### 13.2 Migración desde OpenGnsys 1.1 + +Para migrar datos desde una instalación de OpenGnsys 1.1: + +#### 13.2.1 Crear Base de Datos Temporal + +```bash docker exec ogcore-php php bin/console doctrine:database:create --connection=og_1 ``` -![img.png](swagger-assets/img_bbdd.png) +#### 13.2.2 Cargar Dump de OpenGnsys 1.1 -Aqui podemos ver como tenemos las 2 bases de datos. OgCore es la actual, donde estamos desarrollando, y ogcore_old_og es la base de datos temporal que acabamos de crear. - -Aqui vendria el paso de cargar el dump en dicha base de datos, ya que contiene informacion sensible, no se aloja en el repositorio, por eso tendremos que solicitarla al equipo correspondiente. -Una vez tengamos la base de datos cargada, podremos ejecutar las migraciones de datos: - -```sh ---- Migraciones de OpenGnsys. --- -docker exec ogcore-php php bin/console opengnsys:migration:organizational-unit #cargamos las unidades organizativas -docker exec ogcore-php php bin/console opengnsys:migration:hardware-profile #cargamos los perfiles de hardware -docker exec ogcore-php php bin/console opengnsys:migration:clients #cargamos los clientes -docker exec ogcore-php php bin/console opengnsys:migration:os #cargamos los sistemas operativos -docker exec ogcore-php php bin/console opengnsys:migration:image #cargamos las imagenes -docker exec ogcore-php php bin/console opengnsys:migration:software-profile #cargamos los software profiles +```bash +docker exec -i ogcore-database mysql -u user -p ogcore_old_og < dump_og_1.1.sql ``` -## Objetos de interés +#### 13.2.3 Ejecutar Migraciones -Se ha incluido un .zip con las colecciones de de API de ogCore para poder trabajar, hacer pruebas, y demás en Postman. Para importarlos, tan solo tendremos que ir a la pestaña de importar, y seleccionar el archivo .zip. +Ejecutar los comandos de migración en orden: -Visualizar [coleccion Postman](swagger-assets/ogCore.postman_collection.zip) +```bash +docker exec ogcore-php php bin/console opengnsys:migration:organizational-unit +docker exec ogcore-php php bin/console opengnsys:migration:hardware-profile +docker exec ogcore-php php bin/console opengnsys:migration:clients +docker exec ogcore-php php bin/console opengnsys:migration:os +docker exec ogcore-php php bin/console opengnsys:migration:image +docker exec ogcore-php php bin/console opengnsys:migration:software-profile +``` + +### 13.3 Backup y Restauración + +#### 13.3.1 Backup de Base de Datos + +```bash +docker exec ogcore-database mysqldump -u user -p ogcore > backup_$(date +%Y%m%d).sql +``` + +#### 13.3.2 Restaurar Base de Datos + +```bash +docker exec -i ogcore-database mysql -u user -p ogcore < backup_20251008.sql +``` + +--- + +## 14. Testing + +### 14.1 Framework de Testing + +ogCore utiliza **PHPUnit** con integración de Symfony y Doctrine. + +### 14.2 Ejecutar Tests + +#### 14.2.1 Todos los Tests + +```bash +docker compose exec php bin/phpunit +``` + +#### 14.2.2 Tests Específicos + +```bash +docker compose exec php bin/phpunit tests/Functional/ClientTest.php +``` + +#### 14.2.3 Tests con Coverage + +```bash +docker compose exec php bin/phpunit --coverage-html coverage/ +``` + +### 14.3 Tipos de Tests + +#### 14.3.1 Tests Funcionales + +Ubicación: `tests/Functional/` + +20 archivos de tests funcionales que prueban: +- Endpoints de API +- Flujos completos +- Integraciones + +Ejemplo: + +```php +public function testCreateClient(): void +{ + $client = static::createClient(); + $client->request('POST', '/clients', [ + 'json' => [ + 'name' => 'Test Client', + 'mac' => '00:11:22:33:44:55', + 'ip' => '192.168.1.100' + ] + ]); + + $this->assertResponseStatusCodeSame(201); +} +``` + +### 14.4 Factories para Testing + +Se utilizan **Zenstruck Foundry** factories (24 factories) para crear datos de prueba: + +```php +ClientFactory::createOne([ + 'name' => 'Test PC', + 'status' => 'active' +]); +``` + +### 14.5 Base de Datos de Testing + +Los tests utilizan **DAMA Doctrine Test Bundle** para: +- Ejecutar cada test en una transacción +- Rollback automático después de cada test +- Aislamiento completo entre tests + +--- + +## 15. Despliegue + +### 15.1 Despliegue con Docker Compose + +#### 15.1.1 Desarrollo + +```bash +docker compose up -d +``` + +#### 15.1.2 Producción + +```bash +docker compose -f docker-compose-deploy.yml up -d +``` + +### 15.2 Despliegue con Jenkins + +El proyecto incluye **Jenkinsfile** para CI/CD. + +#### Pipeline stages: +1. **Checkout**: Clonar repositorio +2. **Build**: Construir imagen Docker +3. **Test**: Ejecutar tests +4. **Package**: Crear paquete Debian +5. **Deploy**: Desplegar en servidor + +### 15.3 Paquete Debian + +El proyecto puede empaquetarse como `.deb`: + +```bash +./package.sh +``` + +Estructura del paquete en `debian/`: +- Control files +- Postinst/preinst scripts +- Systemd service file +- Configuración + +### 15.4 Configuración de Producción + +#### 15.4.1 Variables de Entorno + +Crear `.env.local` con configuración de producción: + +```bash +APP_ENV=prod +APP_DEBUG=0 +DATABASE_URL="mysql://user:pass@localhost:3306/ogcore" +# ... más configuración +``` + +#### 15.4.2 Optimizaciones + +```bash +# Limpiar caché +docker exec ogcore-php php bin/console cache:clear --env=prod + +# Calentar caché +docker exec ogcore-php php bin/console cache:warmup --env=prod + +# Optimizar autoloader +docker exec ogcore-php composer dump-autoload --optimize --classmap-authoritative +``` + +### 15.5 Monitoreo + +#### 15.5.1 Logs + +Logs ubicados en `var/log/`: +- `dev.log` / `prod.log`: Logs de aplicación +- `nginx/access.log`: Accesos a nginx +- `nginx/error.log`: Errores de nginx + +#### 15.5.2 Syslog + +Los logs también se envían a syslog para centralización. + +### 15.6 Escalabilidad + +Para escalar horizontalmente: + +1. **Base de datos**: Usar MariaDB con replicación master-slave +2. **PHP**: Aumentar réplicas de contenedor PHP +3. **Load Balancer**: Usar nginx como balanceador de carga +4. **Caché**: Implementar Redis para sesiones y caché +5. **Mercure**: Escalar hub de Mercure + +--- + +## 16. Mantenimiento y Operaciones + +### 16.1 Reiniciar Base de Datos + +```bash +docker exec ogcore-php php bin/console doctrine:database:drop --force +docker exec ogcore-php php bin/console doctrine:database:create +docker exec ogcore-php php bin/console doctrine:migrations:migrate --no-interaction +docker exec ogcore-php php bin/console doctrine:fixtures:load --no-interaction +``` + +### 16.2 Limpiar Caché + +```bash +docker exec ogcore-php php bin/console cache:clear +docker exec ogcore-php php bin/console cache:warmup +``` + +### 16.3 Actualizar Dependencias + +```bash +docker exec ogcore-php composer update +``` + +### 16.4 Regenerar Claves JWT + +```bash +docker exec ogcore-php php bin/console lexik:jwt:generate-keypair --overwrite +``` + +### 16.5 Backups Automáticos + +Script ejemplo para backup automático: + +```bash +#!/bin/bash +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/backups" + +# Backup de base de datos +docker exec ogcore-database mysqldump -u user -p password ogcore > $BACKUP_DIR/db_$DATE.sql + +# Backup de archivos +tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www/html/ogcore/var + +# Limpiar backups antiguos (>30 días) +find $BACKUP_DIR -name "*.sql" -mtime +30 -delete +find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete +``` + +### 16.6 Monitoreo de Salud + +#### Health Check Endpoint + +```bash +GET /health +``` + +#### Verificar Estado de Servicios + +```bash +# PHP +docker exec ogcore-php php -v + +# Nginx +docker exec ogcore-nginx nginx -t + +# MariaDB +docker exec ogcore-database mysqladmin -u user -p status +``` + +### 16.7 Rotación de Logs + +Configurar logrotate: + +```bash +/var/www/html/ogcore/var/log/*.log { + daily + rotate 14 + compress + delaycompress + notifempty + create 0640 www-data www-data + sharedscripts +} +``` + +--- + +## 17. Integración con Otros Servicios + +### 17.1 ogRepository + +**Propósito**: Gestión de repositorios de imágenes. + +**Endpoints integrados**: +- Crear imagen +- Desplegar imagen +- Backup imagen +- Eliminar imagen +- Convertir a imagen virtual +- Importar imagen externa +- Verificar integridad +- Imagen global + +**Webhook**: `/og-repository/webhook` + +### 17.2 ogDhcp + +**Propósito**: Gestión de DHCP dinámico. + +**Funcionalidades**: +- Agregar clientes a DHCP +- Eliminar clientes de DHCP +- Actualizar configuración +- Gestión de subredes + +### 17.3 ogBoot + +**Propósito**: Gestión de archivos de arranque PXE. + +**Funcionalidades**: +- Crear archivos de arranque +- Actualizar plantillas PXE +- Eliminar configuraciones +- Sincronización de menús + +### 17.4 ogAgent + +**Propósito**: Agente instalado en clientes para ejecutar comandos. + +**Operaciones**: +- Power on/off/reboot +- Crear/desplegar imágenes +- Particionar discos +- Ejecutar scripts +- Obtener inventario hardware +- Verificar tamaño de particiones +- Kill jobs + +### 17.5 UDS (Universal Desktop Services) + +**Propósito**: Integración con sistema de escritorios remotos. + +**Funcionalidades**: +- Autenticación +- Obtener service pools +- Calcular disponibilidad +- Gestión de reservas + +### 17.6 Git (Versionado de Imágenes) + +**Propósito**: Versionado de imágenes con Git. + +**Funcionalidades**: +- Backup a repositorio Git +- Versionado automático +- Recuperación de versiones +- Sincronización + +### 17.7 Mercure (Notificaciones en Tiempo Real) + +**Propósito**: Notificaciones push en tiempo real. + +**Eventos publicados**: +- Cambio de estado de clientes +- Actualización de trazas +- Cambios en comandos +- Alertas y notificaciones + +**Suscripción del cliente**: + +```javascript +const eventSource = new EventSource('http://localhost:8080/.well-known/mercure?topic=/clients/{id}'); +eventSource.onmessage = event => { + const data = JSON.parse(event.data); + console.log('Client updated:', data); +}; +``` + +--- + +## 18. Roadmap y Changelog + +### 18.1 Versión Actual: 0.5.0 + +### 18.2 Últimas Características (v0.25.1 - Octubre 2025) + +- **Tareas programadas**: Sistema completo de colas y scheduling +- **Inventario hardware**: Obtención automática de inventario +- **Clonado de imágenes**: Mejoras en el servicio de clonado +- **Repositorios Git**: Backup y gestión de repositorios +- **Particionado**: Integración con agente para scripts de particionado +- **Gestión de trazas**: Marcar como completadas, cancelación +- **Estados de cliente**: Nuevo estado "enviado" para Windows/Linux +- **Validación de particiones**: Comprobación de tamaños +- **Imagen versionada**: Sistema de versionado de imágenes +- **Calendario remoto**: Integración con UDS +- **Mercure**: Notificaciones en tiempo real +- **Despliegue multicast**: Modos torrent y UDPCAST + +### 18.3 Próximas Características (Roadmap) + +#### v0.6.0 (Q4 2025) +- [ ] Dashboard de administración mejorado +- [ ] Reportes y estadísticas avanzadas +- [ ] API GraphQL complementaria +- [ ] Mejoras en rendimiento de queries + +#### v0.7.0 (Q1 2026) +- [ ] Soporte para múltiples lenguajes (i18n completo) +- [ ] Sistema de plugins +- [ ] Mejoras en clustering +- [ ] API de webhooks salientes + +#### v1.0.0 (Q2 2026) +- [ ] Versión estable de producción +- [ ] Documentación completa de API +- [ ] Guías de migración finalizadas +- [ ] Certificación de seguridad + +### 18.4 Changelog Resumido + +Ver `CHANGELOG.md` para el historial completo de cambios. + +**Versiones destacadas**: + +- **0.25.1** (2025-10-01): Correcciones en tareas programadas +- **0.25.0** (2025-09-23): Inventario hardware +- **0.24.0** (2025-09-09): Servicio de eliminación de repositorios Git +- **0.23.0** (2025-09-08): Backups a repositorios Git +- **0.20.0** (2025-08-25): Sistema de colas y tareas +- **0.15.0** (2025-06-26): Integración ogGit y sistema de cola +- **0.14.0** (2025-06-02): Mover equipos, imagen cache, inicio sesión +- **0.13.0** (2025-05-20): Comunicación TLS con agente +- **0.12.0** (2025-05-13): Tareas programadas, integración ogGit +- **0.11.0** (2025-04-11): Versionado de imágenes, ejecución de scripts +- **0.10.0** (2025-03-25): Imagen virtual, importar imágenes +- **0.9.0** (2025-03-04): Mercure, notificaciones en tiempo real +- **0.8.0** (2025-01-10): Imagen global, jerarquía de aulas +- **0.7.3** (2025-01-03): Multiselección, import/export, torrent/udpcast + +--- + +## 19. Contribución + +### 19.1 Guía de Contribución + +Para contribuir al proyecto: + +1. **Fork** el repositorio +2. Crea una **rama** para tu feature: `git checkout -b feature/nueva-funcionalidad` +3. **Commit** tus cambios: `git commit -am 'Añade nueva funcionalidad'` +4. **Push** a la rama: `git push origin feature/nueva-funcionalidad` +5. Crea un **Pull Request** + +### 19.2 Estándares de Código + +- Seguir **PSR-12** para PHP +- Usar **Type Hints** en PHP 8.3 +- Documentar con **PHPDoc** +- Tests para nuevas funcionalidades +- Commits descriptivos en español + +### 19.3 Proceso de Revisión + +1. CI/CD ejecuta tests automáticamente +2. Revisión de código por maintainers +3. Aprobación requerida antes de merge +4. Merge a rama develop +5. Release periódicos a main + +### 19.4 Reportar Bugs + +Usar el sistema de Issues del repositorio: + +**Template de Bug**: +``` +**Descripción del bug** +Descripción clara y concisa del bug. + +**Pasos para reproducir** +1. Ir a '...' +2. Hacer clic en '...' +3. Ver error + +**Comportamiento esperado** +Lo que esperabas que sucediera. + +**Screenshots** +Si aplica, añadir screenshots. + +**Entorno** +- OS: [ej. Ubuntu 22.04] +- Versión: [ej. 0.5.0] +- Browser: [ej. Firefox 118] +``` + +--- + +## 20. Soporte y Contacto + +### 20.1 Documentación Adicional + +- **API Docs**: http://localhost:8080/docs +- **Postman Collection**: `swagger-assets/ogCore.postman_collection.zip` +- **Diagramas**: `swagger-assets/img_bbdd.png` + +### 20.2 Recursos + +- **Repositorio**: [URL del repositorio] +- **Wiki**: [URL de la wiki] +- **Issues**: [URL de issues] + +### 20.3 Equipo de Desarrollo + +Proyecto desarrollado por el equipo de OpenGnsys en colaboración con universidades participantes. + +### 20.4 Licencia + +Proyecto propietario. Ver archivo `LICENSE` para más información. + +--- + +## Apéndices + +### Apéndice A: Glosario de Términos + +- **Cliente**: Equipo físico gestionado por el sistema +- **Imagen**: Copia bit a bit de una partición de disco +- **Traza**: Registro de ejecución de un comando +- **Unidad Organizativa**: Agrupación lógica de clientes (aula, grupo) +- **PXE**: Preboot Execution Environment, arranque por red +- **ogLive**: Imagen Live de arranque de OpenGnsys +- **Partición**: División lógica de un disco duro +- **Repositorio**: Servidor de almacenamiento de imágenes + +### Apéndice B: Puertos y Servicios + +| Puerto | Servicio | Protocolo | Descripción | +|--------|----------|-----------|-------------| +| 8080 | nginx | HTTP | API y docs | +| 3306 | MariaDB | MySQL | Base de datos | +| 9000 | PHP-FPM | FastCGI | Procesador PHP | +| 3000 | Mercure | HTTP/SSE | Notificaciones | + +### Apéndice C: Estructura de Directorios + +``` +ogcore/ +|-- bin/ # Ejecutables (console, phpunit) +|-- config/ # Configuración de Symfony +| |-- api_platform/ # Configuración de entidades API +| |-- packages/ # Configuración de bundles +| +-- routes/ # Rutas +|-- migrations/ # Migraciones de base de datos +|-- public/ # Punto de entrada web +|-- src/ # Código fuente +| |-- Command/ # Comandos de consola +| |-- Controller/ # Controladores +| |-- Dto/ # Data Transfer Objects +| |-- Entity/ # Entidades Doctrine +| |-- EventListener/# Event Listeners +| |-- EventSubscriber/ # Event Subscribers +| |-- Factory/ # Factories para testing +| |-- Filter/ # Filtros de API Platform +| |-- Repository/ # Repositorios Doctrine +| |-- Security/ # Seguridad y autenticación +| |-- Service/ # Servicios de negocio +| |-- State/ # States de API Platform +| +-- Validator/ # Validadores personalizados +|-- tests/ # Tests +|-- translations/ # Traducciones +|-- var/ # Archivos variables (cache, logs) ++-- vendor/ # Dependencias + +``` + +### Apéndice D: Variables de Entorno Completas + +Ver archivo `.env` para todas las variables de entorno disponibles. + +--- + +**Fecha de actualización**: Octubre 2025 +**Versión del documento**: 1.0 +**Mantenedor**: Equipo OpenGnsys diff --git a/config/packages/api_platform.yaml b/config/packages/api_platform.yaml index b957e6a..c86b079 100644 --- a/config/packages/api_platform.yaml +++ b/config/packages/api_platform.yaml @@ -1,7 +1,7 @@ api_platform: title: 'OgCore Api' description: 'Api Documentation for OgCore' - version: 0.5.0 + version: 1.0.0 path_segment_name_generator: api_platform.path_segment_name_generator.dash defaults: pagination_client_items_per_page: true diff --git a/ogCore_Documentacion_Tecnica.html b/ogCore_Documentacion_Tecnica.html new file mode 100644 index 0000000..6ccf54d --- /dev/null +++ b/ogCore_Documentacion_Tecnica.html @@ -0,0 +1,2451 @@ + + + + + + + + ogCore - Documentación Técnica y Funcional + + + + +
+

ogCore - Documentación Técnica y Funcional

+

Equipo OpenGnsys

+

Octubre 2025

+
+ +

1 ogCore - Documentación Técnica y +Funcional

+

1.1 Tabla de Contenidos

+
    +
  1. Introducción
  2. +
  3. Descripción del +Proyecto
  4. +
  5. Arquitectura del +Sistema
  6. +
  7. Tecnologías Utilizadas
  8. +
  9. Requisitos del Sistema
  10. +
  11. Instalación y +Configuración
  12. +
  13. Modelo de Datos
  14. +
  15. Componentes del +Sistema
  16. +
  17. API RESTful
  18. +
  19. Seguridad y +Autenticación
  20. +
  21. Servicios Principales
  22. +
  23. Comandos de Consola
  24. +
  25. Migraciones de Datos
  26. +
  27. Testing
  28. +
  29. Despliegue
  30. +
  31. Mantenimiento y +Operaciones
  32. +
  33. Integración con Otros +Servicios
  34. +
  35. Roadmap y Changelog
  36. +
  37. Contribución
  38. +
  39. Soporte y Contacto
  40. +
+
+

1.2 1. Introducción

+

ogCore es el servicio central de +OpenGnsys, una plataforma de código abierto diseñada +para la gestión centralizada de aulas de informática, laboratorios y +entornos educativos. Este servicio proporciona una API RESTful robusta +que permite administrar de manera eficiente clientes (equipos), imágenes +de sistemas operativos, perfiles de hardware y software, tareas +programadas, y mucho más.

+

1.2.1 1.1 Propósito del +Sistema

+

El propósito principal de ogCore es:

+
    +
  • Centralizar la gestión de equipos informáticos en +entornos educativos y corporativos
  • +
  • Automatizar el despliegue de sistemas operativos e +imágenes
  • +
  • Gestionar inventarios de hardware y software
  • +
  • Programar y ejecutar tareas de manera +automática
  • +
  • Proporcionar trazabilidad de todas las operaciones +realizadas
  • +
  • Facilitar la migración desde versiones anteriores +de OpenGnsys
  • +
+

1.2.2 1.2 Alcance

+

ogCore gestiona: - Clientes (equipos físicos) - Imágenes de sistemas +operativos - Repositorios de imágenes - Perfiles de hardware y software +- Unidades organizativas (aulas, grupos) - Redes y subredes - Plantillas +PXE - Menús de arranque - Comandos y tareas programadas - Trazas de +ejecución - Calendarios remotos - Integración con sistemas externos +(UDS, ogRepository, ogDhcp, ogBoot)

+
+

1.3 2. Descripción del +Proyecto

+

1.3.1 2.1 ¿Qué es ogCore?

+

ogCore es el núcleo central de OpenGnsys desarrollado con tecnologías +modernas de PHP. Actúa como backend que expone una API RESTful completa, +permitiendo la gestión de todos los aspectos relacionados con la +administración de aulas informáticas.

+

1.3.2 2.2 Características +Principales

+
    +
  • API RESTful completa con documentación +Swagger/OpenAPI
  • +
  • Autenticación JWT con refresh tokens
  • +
  • Arquitectura basada en eventos con notificaciones +en tiempo real (Mercure)
  • +
  • Sistema de colas para la ejecución de tareas +programadas
  • +
  • Integración con múltiples servicios externos
  • +
  • Migraciones automatizadas desde OpenGnsys 1.1
  • +
  • Versionado de imágenes con integración Git
  • +
  • Sistema de trazabilidad completo
  • +
  • Gestión de hardware con inventario automático
  • +
  • Despliegues masivos de imágenes (unicast, +multicast, torrent, p2p)
  • +
  • Gestión de particiones automática
  • +
  • Sistema de validación robusto
  • +
+

1.3.3 2.3 Versión Actual

+
    +
  • Versión: 0.5.0
  • +
  • Estado: En desarrollo activo
  • +
  • Última actualización: Octubre 2025
  • +
+
+

1.4 3. Arquitectura del +Sistema

+

1.4.1 3.1 Arquitectura General

+

ogCore sigue una arquitectura de microservicios +basada en el patrón API-First:

+
┌─────────────────────────────────────────────────────────────┐
+│                      Frontend (Web UI)                       │
+└────────────────────────┬────────────────────────────────────┘
+                         │
+                         │ HTTP/REST
+                         │
+┌────────────────────────▼────────────────────────────────────┐
+│                     ogCore API (Symfony)                     │
+│  ┌──────────────────────────────────────────────────────┐   │
+│  │  Controllers │ States │ DTOs │ Validators │ Filters  │   │
+│  └──────────────────────────────────────────────────────┘   │
+│  ┌──────────────────────────────────────────────────────┐   │
+│  │              Business Logic (Services)                │   │
+│  └──────────────────────────────────────────────────────┘   │
+│  ┌──────────────────────────────────────────────────────┐   │
+│  │        Entities │ Repositories │ Doctrine ORM         │   │
+│  └──────────────────────────────────────────────────────┘   │
+└────────────────────┬───────────────┬───────────────────────┘
+                     │               │
+         ┌───────────▼──┐    ┌──────▼──────┐
+         │   MariaDB    │    │   Mercure   │
+         │   Database   │    │  (WebSocket)│
+         └──────────────┘    └─────────────┘
+
+┌─────────────────────────────────────────────────────────────┐
+│              Servicios Externos Integrados                   │
+├──────────────┬──────────────┬──────────────┬────────────────┤
+│  ogRepository│   ogDhcp     │   ogBoot     │   UDS/Git      │
+└──────────────┴──────────────┴──────────────┴────────────────┘
+

1.4.2 3.2 Capas de la +Aplicación

+

1.4.2.1 3.2.1 Capa de Presentación +(API)

+
    +
  • API Platform: Framework para crear APIs REST
  • +
  • Controllers: Controladores personalizados (102 +controladores)
  • +
  • DTOs (Data Transfer Objects): 93 objetos de +transferencia de datos
  • +
  • OpenAPI/Swagger: Documentación automática de la +API
  • +
+

1.4.2.2 3.2.2 Capa de Negocio

+
    +
  • Services: Lógica de negocio (13 servicios +principales)
  • +
  • Handlers: Manejadores de eventos (2 handlers)
  • +
  • EventSubscribers: Suscriptores de eventos (8 +suscriptores)
  • +
  • Validators: Validadores personalizados (18 +validadores)
  • +
+

1.4.2.3 3.2.3 Capa de Datos

+
    +
  • Entities: 35 entidades del modelo de datos
  • +
  • Repositories: 32 repositorios personalizados
  • +
  • Doctrine ORM: Mapeo objeto-relacional
  • +
  • Migrations: 85 migraciones de base de datos
  • +
+

1.4.2.4 3.2.4 Capa de +Infraestructura

+
    +
  • Docker: Contenedorización de servicios
  • +
  • Nginx: Servidor web reverse proxy
  • +
  • PHP-FPM: Procesador de PHP
  • +
  • MariaDB: Sistema de gestión de base de datos
  • +
  • Mercure: Sistema de notificaciones en tiempo +real
  • +
+

1.4.3 3.3 Patrones de Diseño +Utilizados

+
    +
  1. Repository Pattern: Para abstracción de acceso a +datos
  2. +
  3. DTO Pattern: Para transferencia de datos entre +capas
  4. +
  5. Factory Pattern: Para creación de entidades +complejas
  6. +
  7. Event-Driven Architecture: Para notificaciones y +reactividad
  8. +
  9. State Pattern: Para gestión de estados de +procesamiento
  10. +
  11. Service Layer: Para encapsulación de lógica de +negocio
  12. +
+
+

1.5 4. Tecnologías Utilizadas

+

1.5.1 4.1 Backend

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TecnologíaVersiónPropósito
PHP8.3Lenguaje de programación principal
Symfony6.4Framework web principal
Doctrine ORM2.19Mapeo objeto-relacional
API Platform3.2Creación de APIs REST
Lexik JWT3.0Autenticación JWT
Gesdinet JWT Refresh Token1.3Refresh tokens
Stof Doctrine Extensions1.10Extensiones de Doctrine (timestampable, etc.)
Ramsey UUID2.0Generación de UUIDs
+

1.5.2 4.2 Base de Datos

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TecnologíaVersiónPropósito
MariaDB10.11Sistema de gestión de base de datos
Doctrine DBAL3.xCapa de abstracción de base de datos
Doctrine Migrations3.3Gestión de migraciones
+

1.5.3 4.3 Infraestructura

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TecnologíaVersiónPropósito
DockerLatestContenedorización
Docker ComposeLatestOrquestación de contenedores
NginxLatestServidor web / Reverse proxy
PHP-FPM8.3Procesador FastCGI
Mercure0.3.9Hub de notificaciones en tiempo real
+

1.5.4 4.4 Testing

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TecnologíaVersiónPropósito
PHPUnit9.5Framework de testing
Symfony PHPUnit Bridge7.0Integración con Symfony
DAMA Doctrine Test Bundle8.1Transacciones de prueba
Zenstruck Foundry1.37Factories para testing
+

1.5.5 4.5 Desarrollo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TecnologíaVersiónPropósito
Symfony Maker Bundle1.59Generación de código
Symfony Web Profiler6.4Debugging y profiling
Monolog3.xLogging
PHPStanLatestAnálisis estático
+
+

1.6 5. Requisitos del Sistema

+

1.6.1 5.1 Requisitos de Hardware +(Producción)

+
    +
  • CPU: Mínimo 4 cores, recomendado 8+ cores
  • +
  • RAM: Mínimo 8GB, recomendado 16GB+
  • +
  • Disco: +
      +
    • Sistema: 20GB SSD
    • +
    • Base de datos: 50GB+ SSD
    • +
    • Logs: 10GB
    • +
  • +
  • Red: 1Gbps mínimo
  • +
+

1.6.2 5.2 Requisitos de +Software

+
    +
  • Sistema Operativo: Linux (Ubuntu 20.04+, Debian +11+, CentOS 8+)
  • +
  • Docker: >= 20.10
  • +
  • Docker Compose: >= 2.0
  • +
  • Git: >= 2.25 (para gestión de código)
  • +
+

1.6.3 5.3 Puertos Requeridos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PuertoServicioPropósito
8080Nginx/HTTPAPI y documentación
3306MariaDBBase de datos
9000PHP-FPMProcesador PHP
3000MercureWebSocket/SSE
+
+

1.7 6. Instalación y +Configuración

+

1.7.1 6.1 Instalación con Docker +(Recomendado)

+

1.7.1.1 6.1.1 Clonar el +Repositorio

+
git clone <url-del-repositorio> ogcore
+cd ogcore
+

1.7.1.2 6.1.2 Verificar Puertos +Disponibles

+

Asegúrate de que los puertos 8080 y 3306 no estén en uso:

+
sudo lsof -i :8080
+sudo lsof -i :3306
+

1.7.1.3 6.1.3 Desplegar +Contenedores

+
docker compose up --build -d
+

1.7.1.4 6.1.4 Verificar +Contenedores

+
docker ps
+

Deberías ver tres contenedores activos: - ogcore-nginx - +ogcore-php - ogcore-database

+

1.7.1.5 6.1.5 Instalar +Dependencias

+
docker exec ogcore-php composer install
+

1.7.1.6 6.1.6 Generar Claves +JWT

+
docker exec ogcore-php php bin/console lexik:jwt:generate-keypair --overwrite
+

1.7.1.7 6.1.7 Inicializar Base de +Datos

+
# Ejecutar migraciones
+docker exec ogcore-php php bin/console doctrine:migrations:migrate --no-interaction
+
+# Cargar datos iniciales (fixtures)
+docker exec ogcore-php php bin/console doctrine:fixtures:load --no-interaction
+
+# Cargar grupos de usuarios por defecto
+docker exec ogcore-php php bin/console app:load-default-user-groups
+
+# Cargar comandos por defecto
+docker exec ogcore-php php bin/console app:load-default-commands
+

1.7.1.8 6.1.8 Acceder a la +Aplicación

+

Abre tu navegador y accede a:

+
http://127.0.0.1:8080/docs
+

Deberías ver la documentación Swagger de la API de ogCore.

+

1.7.2 6.2 Configuración

+

1.7.2.1 6.2.1 Variables de +Entorno

+

El archivo .env contiene las variables de configuración +principales:

+
# Entorno
+APP_ENV=dev
+APP_SECRET=<tu-secreto>
+
+# Base de datos
+DATABASE_URL="mysql://user:password@ogcore-database:3306/ogcore"
+
+# JWT
+JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
+JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
+JWT_PASSPHRASE=<tu-passphrase>
+
+# Mercure
+MERCURE_URL=http://mercure:3000/.well-known/mercure
+MERCURE_PUBLIC_URL=http://127.0.0.1:8080/.well-known/mercure
+MERCURE_JWT_SECRET=<tu-secreto-mercure>
+
+# Servicios externos
+REMOTE_PC_URL=<url-uds>
+REMOTE_PC_AUTH_LOGIN=<login>
+REMOTE_PC_AUTH_USERNAME=<username>
+REMOTE_PC_AUTH_PASSWORD=<password>
+
+# SSL/TLS
+SSL_ENABLED=false
+

1.7.2.2 6.2.2 Configuración de +CORS

+

Edita config/packages/nelmio_cors.yaml para configurar +CORS según tus necesidades.

+

1.7.2.3 6.2.3 Configuración de API +Platform

+

La configuración de API Platform se encuentra en +config/packages/api_platform.yaml.

+

1.7.3 6.3 Instalación en +Producción

+

Para entornos de producción, utiliza el archivo +docker-compose-deploy.yml:

+
docker compose -f docker-compose-deploy.yml up -d
+

Asegúrate de: - Cambiar todas las contraseñas por defecto - +Configurar SSL/TLS - Configurar backups automáticos de base de datos - +Configurar monitoreo y alertas - Revisar los límites de recursos de +Docker

+
+

1.8 7. Modelo de Datos

+

1.8.1 7.1 Diagrama de +Entidades

+

El sistema cuenta con 35 entidades principales agrupadas en los +siguientes dominios:

+

1.8.2 7.2 Entidades +Principales

+

1.8.2.1 7.2.1 Client (Cliente)

+

Representa un equipo físico en el sistema.

+

Campos principales: - id: UUID único - +name: Nombre del cliente - serialNumber: +Número de serie - mac: Dirección MAC (única) - +ip: Dirección IP (única) - status: Estado del +cliente (active, inactive, busy, windows, linux, etc.) - +netiface: Interfaz de red - netDriver: Driver +de red - validation: Estado de validación - +maintenance: Modo mantenimiento - position: +Posición en el aula (x, y) - firmwareType: Tipo de firmware +(BIOS/UEFI) - agentJobId: ID del trabajo del agente en +ejecución - pxeSync: Sincronización PXE - +token: Token de autenticación del cliente

+

Relaciones: - organizationalUnit: +Pertenece a una unidad organizativa (aula/grupo) - +partitions: Tiene múltiples particiones - +menu: Menú de arranque asignado - +hardwareProfile: Perfil de hardware asociado - +template: Plantilla PXE asignada - repository: +Repositorio de imágenes - subnet: Subred a la que pertenece +- ogLive: Imagen Live asignada

+

1.8.2.2 7.2.2 OrganizationalUnit +(Unidad Organizativa)

+

Representa aulas o grupos de equipos.

+

Campos principales: - id: UUID único - +name: Nombre de la unidad - description: +Descripción - type: Tipo (aula, grupo, etc.)

+

Relaciones: - parent: Unidad +organizativa padre (jerarquía) - children: Unidades hijas - +clients: Clientes pertenecientes - +networkSettings: Configuración de red heredable - +remoteCalendar: Calendario remoto asociado

+

1.8.2.3 7.2.3 Image (Imagen)

+

Representa una imagen de sistema operativo.

+

Campos principales: - id: UUID único - +name: Nombre de la imagen - description: +Descripción - type: Tipo de imagen - size: +Tamaño en bytes - partition: Partición de origen - +status: Estado (creating, success, failed, etc.) - +isGlobal: Imagen global compartida - +isVirtual: Imagen virtual - version: Versión +de la imagen

+

Relaciones: - operativeSystem: Sistema +operativo - softwareProfile: Perfil de software - +repositories: Repositorios que contienen la imagen - +originClient: Cliente origen de la imagen

+

1.8.2.4 7.2.4 Command +(Comando)

+

Comandos ejecutables en el sistema.

+

Campos principales: - id: UUID único - +name: Nombre del comando - description: +Descripción - script: Script a ejecutar

+

Relaciones: - commandGroups: Grupos de +comandos a los que pertenece

+

1.8.2.5 7.2.5 CommandTask (Tarea de +Comando)

+

Tarea programada para ejecutar comandos.

+

Campos principales: - id: UUID único - +datetime: Fecha y hora de ejecución - +parameters: Parámetros de ejecución - status: +Estado de la tarea

+

Relaciones: - commands: Comandos a +ejecutar - commandGroups: Grupos de comandos - +clients: Clientes objetivo - schedule: +Programación recurrente

+

1.8.2.6 7.2.6 Trace (Traza)

+

Registro de ejecución de comandos.

+

Campos principales: - id: UUID único - +command: Nombre del comando ejecutado - input: +Parámetros de entrada - output: Resultado de ejecución - +status: Estado (pending, processing, success, failed, +cancelled) - executedAt: Fecha de ejecución - +finishedAt: Fecha de finalización - cancelled: +Indica si fue cancelada - jobId: ID del trabajo en el +agente

+

Relaciones: - client: Cliente donde se +ejecutó

+

1.8.2.7 7.2.7 HardwareProfile +(Perfil de Hardware)

+

Inventario de hardware de un cliente.

+

Campos principales: - id: UUID único - +cpu: Información de CPU - ram: Memoria RAM - +storage: Almacenamiento - networkCards: +Tarjetas de red

+

Relaciones: - client: Cliente asociado +- hardwareTypes: Tipos de hardware detectados

+

1.8.2.8 7.2.8 SoftwareProfile +(Perfil de Software)

+

Software instalado en una imagen.

+

Campos principales: - id: UUID único - +name: Nombre del perfil

+

Relaciones: - software: Software +incluido - images: Imágenes que usan este perfil

+

1.8.2.9 7.2.9 ImageRepository +(Repositorio de Imágenes)

+

Servidor de almacenamiento de imágenes.

+

Campos principales: - id: UUID único - +name: Nombre del repositorio (único) - ip: +Dirección IP o DNS (único) - port: Puerto - +sshPort: Puerto SSH - sshUser: Usuario SSH - +apiKey: Clave API - status: Estado del +repositorio

+

Relaciones: - images: Imágenes +almacenadas

+

1.8.2.10 7.2.10 Subnet +(Subred)

+

Configuración de red.

+

Campos principales: - id: UUID único - +name: Nombre de la subred - cidr: Notación +CIDR - gateway: Puerta de enlace - dns: +Servidores DNS - dhcpStart: Inicio rango DHCP - +dhcpEnd: Fin rango DHCP

+

Relaciones: - clients: Clientes en la +subred

+

1.8.2.11 7.2.11 Partition +(Partición)

+

Partición de disco de un cliente.

+

Campos principales: - id: UUID único - +partitionNumber: Número de partición - +partitionType: Tipo de partición - +partitionSize: Tamaño - partitionCode: Código +de partición - usedSize: Tamaño usado - +filesystem: Sistema de archivos

+

Relaciones: - client: Cliente +propietario - image: Imagen desplegada - +operativeSystem: Sistema operativo instalado

+

1.8.2.12 7.2.12 PxeTemplate +(Plantilla PXE)

+

Plantilla de arranque PXE.

+

Campos principales: - id: UUID único - +name: Nombre de la plantilla - content: +Contenido de la plantilla - default: Plantilla por +defecto

+

Relaciones: - clients: Clientes que +usan la plantilla

+

1.8.2.13 7.2.13 RemoteCalendar +(Calendario Remoto)

+

Integración con sistemas de reservas remotas.

+

Campos principales: - id: UUID único - +name: Nombre del calendario - url: URL del +servicio - available: Disponibilidad

+

Relaciones: - organizationalUnits: +Unidades organizativas asociadas - rules: Reglas del +calendario

+

1.8.2.14 7.2.14 User (Usuario)

+

Usuario del sistema.

+

Campos principales: - id: UUID único - +username: Nombre de usuario (único) - +password: Contraseña (hasheada) - email: +Correo electrónico - roles: Roles del usuario

+

Relaciones: - userGroups: Grupos de +usuarios - view: Vista preferida

+

1.8.2.15 7.2.15 GitRepository +(Repositorio Git)

+

Repositorio Git para versionado de imágenes.

+

Campos principales: - id: UUID único - +name: Nombre del repositorio - url: URL del +repositorio - branch: Rama - credentials: +Credenciales de acceso

+

1.8.3 7.3 Índices y +Optimizaciones

+

La base de datos está optimizada con índices en: - Campos de búsqueda +frecuente (status, updatedAt) - Campos únicos (IP, MAC, username) - +Claves foráneas - Índices compuestos para consultas complejas

+
+

1.9 8. Componentes del Sistema

+

1.9.1 8.1 Controllers +(Controladores)

+

El sistema cuenta con 102 controladores organizados +por dominio:

+

1.9.1.1 Controladores +principales:

+
    +
  • ClientController: Gestión de clientes
  • +
  • ImageController: Gestión de imágenes
  • +
  • OrganizationalUnitController: Gestión de unidades +organizativas
  • +
  • CommandController: Gestión de comandos
  • +
  • TraceController: Gestión de trazas
  • +
  • UserController: Gestión de usuarios
  • +
  • SubnetController: Gestión de subredes
  • +
  • RepositoryController: Gestión de repositorios
  • +
+

1.9.2 8.2 States (Procesadores de +Estado)

+

Los States implementan el patrón State de API Platform:

+

1.9.2.1 States principales (55 +procesadores):

+
    +
  • Providers: Obtención de datos
  • +
  • Processors: Procesamiento de escritura
  • +
  • Custom States: Lógica personalizada
  • +
+

1.9.3 8.3 DTOs (Data Transfer +Objects)

+

93 DTOs para transferencia de datos:

+

1.9.3.1 Tipos de DTOs:

+
    +
  • Input DTOs: Para recepción de datos
  • +
  • Output DTOs: Para envío de datos
  • +
  • Transformation DTOs: Para transformaciones
  • +
+

1.9.4 8.4 Validators +(Validadores)

+

18 validadores personalizados para: - Validación de +IPs y MACs - Validación de rangos DHCP - Validación de particiones - +Validación de imágenes - Validación de comandos - Validación de +usuarios

+

1.9.5 8.5 EventSubscribers +(Suscriptores de Eventos)

+

8 suscriptores para: - Publicación en Mercure al +cambiar estados - Limpieza de recursos - Validaciones pre/post +persistencia - Logging de eventos

+

1.9.6 8.6 Factories (Fábricas)

+

24 factories para testing con Foundry: - Creación de +entidades para tests - Datos de prueba realistas - Estados +predefinidos

+
+

1.10 9. API RESTful

+

1.10.1 9.1 Documentación

+

La API está completamente documentada con OpenAPI +3.0 y accesible en:

+
http://127.0.0.1:8080/docs
+

1.10.2 9.2 Formato de +Respuestas

+

1.10.2.1 Formato estándar +(JSON-LD):

+
{
+  "@context": "/contexts/Client",
+  "@id": "/clients/123e4567-e89b-12d3-a456-426614174000",
+  "@type": "Client",
+  "id": "123e4567-e89b-12d3-a456-426614174000",
+  "name": "PC-01",
+  "mac": "00:11:22:33:44:55",
+  "ip": "192.168.1.100",
+  "status": "active"
+}
+

1.10.2.2 Formato alternativo +(JSON):

+
{
+  "id": "123e4567-e89b-12d3-a456-426614174000",
+  "name": "PC-01",
+  "mac": "00:11:22:33:44:55",
+  "ip": "192.168.1.100",
+  "status": "active"
+}
+

1.10.3 9.3 Paginación

+

Todas las colecciones soportan paginación:

+
GET /clients?page=1&itemsPerPage=30
+

Respuesta:

+
{
+  "@context": "/contexts/Client",
+  "@id": "/clients",
+  "@type": "hydra:Collection",
+  "hydra:member": [...],
+  "hydra:totalItems": 150,
+  "hydra:view": {
+    "@id": "/clients?page=1",
+    "@type": "hydra:PartialCollectionView",
+    "hydra:first": "/clients?page=1",
+    "hydra:last": "/clients?page=5",
+    "hydra:next": "/clients?page=2"
+  }
+}
+

1.10.4 9.4 Filtrado

+

Soporta filtros avanzados:

+
GET /clients?status=active
+GET /clients?organizationalUnit.name=Aula1
+GET /traces?client.id=123&status=pending
+

1.10.5 9.5 Ordenamiento

+
GET /clients?order[name]=asc
+GET /traces?order[createdAt]=desc
+

1.10.6 9.6 Endpoints +Principales

+

1.10.6.1 9.6.1 Autenticación

+
POST /auth/login
+POST /auth/refresh
+

1.10.6.2 9.6.2 Clientes

+
GET    /clients
+POST   /clients
+GET    /clients/{id}
+PUT    /clients/{id}
+PATCH  /clients/{id}
+DELETE /clients/{id}
+POST   /clients/batch
+POST   /clients/{id}/power-on
+POST   /clients/{id}/power-off
+POST   /clients/{id}/reboot
+

1.10.6.3 9.6.3 Imágenes

+
GET    /images
+POST   /images
+GET    /images/{id}
+PUT    /images/{id}
+DELETE /images/{id}
+POST   /images/{id}/deploy
+POST   /images/{id}/create
+POST   /images/{id}/backup
+

1.10.6.4 9.6.4 Comandos y +Tareas

+
GET    /commands
+POST   /commands
+GET    /command-tasks
+POST   /command-tasks
+PUT    /command-tasks/{id}
+DELETE /command-tasks/{id}
+

1.10.6.5 9.6.5 Trazas

+
GET    /traces
+GET    /traces/{id}
+PUT    /traces/{id}
+PATCH  /traces/{id}/complete
+PATCH  /traces/{id}/cancel
+

1.10.7 9.7 Códigos de Estado +HTTP

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoSignificado
200OK - Operación exitosa
201Created - Recurso creado
204No Content - Eliminación exitosa
400Bad Request - Datos inválidos
401Unauthorized - No autenticado
403Forbidden - Sin permisos
404Not Found - Recurso no encontrado
409Conflict - Conflicto (cliente ocupado, constraint violation)
422Unprocessable Entity - Validación fallida
500Internal Server Error - Error del servidor
+
+

1.11 10. Seguridad y +Autenticación

+

1.11.1 10.1 Sistema de +Autenticación JWT

+

ogCore utiliza JSON Web Tokens (JWT) para +autenticación:

+

1.11.1.1 10.1.1 Obtener Token

+
POST /auth/login
+Content-Type: application/json
+
+{
+  "username": "admin",
+  "password": "password"
+}
+

Respuesta:

+
{
+  "token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
+  "refresh_token": "def50200a54b7b..."
+}
+

1.11.1.2 10.1.2 Usar Token

+

Incluir el token en el header Authorization:

+
GET /clients
+Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
+

1.11.1.3 10.1.3 Refresh Token

+
POST /auth/refresh
+Content-Type: application/json
+
+{
+  "refresh_token": "def50200a54b7b..."
+}
+

1.11.2 10.2 Control de Acceso

+

1.11.2.1 Rutas Públicas:

+
    +
  • /auth/login
  • +
  • /auth/refresh
  • +
  • /docs
  • +
  • /opengnsys/rest/* (webhooks)
  • +
  • /og-repository/webhook
  • +
  • /menu-browser
  • +
+

1.11.2.2 Rutas Protegidas:

+
    +
  • Todo lo demás requiere IS_AUTHENTICATED_FULLY
  • +
+

1.11.3 10.3 Roles de Usuario

+

Los roles se gestionan en la entidad User:

+
$user->setRoles(['ROLE_USER']);
+$user->setRoles(['ROLE_ADMIN']);
+

1.11.4 10.4 Seguridad de +Contraseñas

+
    +
  • Hashing con bcrypt automático
  • +
  • Validación de fortaleza
  • +
  • Cambio de contraseña seguro
  • +
+

1.11.5 10.5 CORS (Cross-Origin +Resource Sharing)

+

Configurado en nelmio_cors.yaml para permitir acceso +desde frontend.

+

1.11.6 10.6 SSL/TLS

+

Para producción, habilitar SSL:

+
SSL_ENABLED=true
+

Configurar certificados en /certs/.

+
+

1.12 11. Servicios Principales

+

1.12.1 11.1 +CreatePartitionService

+

Propósito: Crear y actualizar particiones de +clientes.

+

Funcionalidad: - Recibe información de particiones +del agente - Crea/actualiza particiones en base de datos - Detecta tipo +de firmware (BIOS/UEFI) - Calcula códigos de partición

+

1.12.2 11.2 CreateTraceService

+

Propósito: Crear trazas de ejecución para tareas +programadas.

+

Funcionalidad: - Genera trazas para cada combinación +cliente-comando - Gestiona comandos agrupados - Establece estado inicial +y fecha de ejecución

+

1.12.3 11.3 +ChangeClientNetworkSettingsService

+

Propósito: Cambiar configuración de red de +clientes.

+

Funcionalidad: - Actualiza subnet, IP, configuración +de red - Sincroniza con servicios externos (DHCP)

+

1.12.4 11.4 +ExternalGitRepositoryService

+

Propósito: Gestión de repositorios Git para +imágenes.

+

Funcionalidad: - Backup de imágenes a Git - +Versionado de imágenes - Sincronización con repositorios remotos

+

1.12.5 11.5 StatusService +(OgBoot/OgDhcp/OgRepository)

+

Propósito: Verificar estado de servicios +externos.

+

Funcionalidad: - Health checks de servicios - Manejo +de errores de conexión - Logging de estado

+

1.12.6 11.6 UDSClient

+

Propósito: Integración con UDS (Universal Desktop +Services).

+

Funcionalidad: - Autenticación con UDS - Obtención +de service pools - Cálculo de asientos disponibles - Gestión de +calendarios remotos

+

1.12.7 11.7 +Trace/CreateService

+

Propósito: Servicio especializado para creación de +trazas.

+

Funcionalidad: - Validación de parámetros de entrada +- Creación de trazas individuales o masivas

+

1.12.8 11.8 +Utils/GetPartitionCodeService

+

Propósito: Obtener código de partición según tipo y +filesystem.

+

1.12.9 11.9 +Utils/SimplifyOgLiveFilenameService

+

Propósito: Simplificar nombres de archivos OgLive +para mostrar al usuario.

+

1.12.10 11.10 +Utils/GetIpAddressAndNetmaskFromCIDRService

+

Propósito: Convertir notación CIDR a IP y máscara de +red.

+
+

1.13 12. Comandos de Consola

+

ogCore incluye 18 comandos de consola para tareas +administrativas:

+

1.13.1 12.1 Comandos de +Inicialización

+

1.13.1.1 12.1.1 Cargar Grupos de +Usuario por Defecto

+
php bin/console app:load-default-user-groups
+

Crea los grupos de usuarios predeterminados del sistema.

+

1.13.1.2 12.1.2 Cargar Comandos por +Defecto

+
php bin/console app:load-default-commands
+

Carga los comandos básicos del sistema.

+

1.13.1.3 12.1.3 Cargar Usuario +Admin

+
php bin/console app:load-default-user-admin
+

Crea el usuario administrador por defecto.

+

1.13.1.4 12.1.4 Cargar Menú por +Defecto

+
php bin/console app:load-default-menu
+

Carga menús de arranque predeterminados.

+

1.13.1.5 12.1.5 Cargar Tipos de +Hardware

+
php bin/console app:load-hardware-types
+

Inicializa la tabla de tipos de hardware.

+

1.13.1.6 12.1.6 Cargar Unidad +Organizativa por Defecto

+
php bin/console app:load-organizational-unit-default
+

Crea la unidad organizativa raíz.

+

1.13.2 12.2 Comandos de +Operación

+

1.13.2.1 12.2.1 Verificar +Disponibilidad de Clientes

+
php bin/console app:check-client-availability
+

Ejecución: Cada 1 minuto (cron)

+

Verifica el estado de conectividad de los clientes y actualiza su +estado si no responden en un tiempo determinado.

+

1.13.2.2 12.2.2 Ejecutar Trazas +Pendientes

+
php bin/console app:execute-pending-traces
+

Ejecución: Cada 1 minuto (cron)

+

Procesa las trazas en estado PENDING y las ejecuta en +los clientes correspondientes.

+

1.13.2.3 12.2.3 Ejecutar Tareas +Programadas

+
php bin/console app:run-scheduled-command-tasks
+

Ejecución: Cada 1 minuto (cron)

+

Ejecuta tareas programadas que han llegado a su hora de +ejecución.

+

1.13.3 12.3 Comandos de +Migración

+

Comandos para migrar datos desde OpenGnsys 1.1:

+

1.13.3.1 12.3.1 Migrar Unidades +Organizativas

+
php bin/console opengnsys:migration:organizational-unit
+

1.13.3.2 12.3.2 Migrar Perfiles de +Hardware

+
php bin/console opengnsys:migration:hardware-profile
+

1.13.3.3 12.3.3 Migrar +Clientes

+
php bin/console opengnsys:migration:clients
+

1.13.3.4 12.3.4 Migrar Sistemas +Operativos

+
php bin/console opengnsys:migration:os
+

1.13.3.5 12.3.5 Migrar +Imágenes

+
php bin/console opengnsys:migration:image
+

1.13.3.6 12.3.6 Migrar Perfiles de +Software

+
php bin/console opengnsys:migration:software-profile
+

1.13.3.7 12.3.7 Migrar Particiones +de Clientes

+
php bin/console opengnsys:migration:partition-client
+

1.13.4 12.4 Comandos de +Desarrollo

+

1.13.4.1 12.4.1 Crear Repositorios +de Imágenes

+
php bin/console app:create-image-repositories
+

Crea repositorios de imágenes para desarrollo/testing.

+

1.13.4.2 12.4.2 Cargar Trazas de +Ejemplo

+
php bin/console app:charge-example-trace
+

Carga trazas de ejemplo para testing.

+

1.13.5 12.5 Configuración de +Cron

+

Agregar al crontab:

+
* * * * * docker exec ogcore-php php bin/console app:check-client-availability
+* * * * * docker exec ogcore-php php bin/console app:execute-pending-traces
+* * * * * docker exec ogcore-php php bin/console app:run-scheduled-command-tasks
+
+

1.14 13. Migraciones de Datos

+

1.14.1 13.1 Sistema de Migraciones +de Doctrine

+

ogCore utiliza Doctrine Migrations para gestionar cambios en el +esquema de base de datos.

+

1.14.1.1 13.1.1 Crear una +Migración

+
docker exec ogcore-php php bin/console make:migration
+

1.14.1.2 13.1.2 Ejecutar +Migraciones

+
docker exec ogcore-php php bin/console doctrine:migrations:migrate
+

1.14.1.3 13.1.3 Ver Estado de +Migraciones

+
docker exec ogcore-php php bin/console doctrine:migrations:status
+

1.14.1.4 13.1.4 Revertir +Migración

+
docker exec ogcore-php php bin/console doctrine:migrations:migrate prev
+

1.14.2 13.2 Migración desde +OpenGnsys 1.1

+

Para migrar datos desde una instalación de OpenGnsys 1.1:

+

1.14.2.1 13.2.1 Crear Base de Datos +Temporal

+
docker exec ogcore-php php bin/console doctrine:database:create --connection=og_1
+

1.14.2.2 13.2.2 Cargar Dump de +OpenGnsys 1.1

+
docker exec -i ogcore-database mysql -u user -p ogcore_old_og < dump_og_1.1.sql
+

1.14.2.3 13.2.3 Ejecutar +Migraciones

+

Ejecutar los comandos de migración en orden:

+
docker exec ogcore-php php bin/console opengnsys:migration:organizational-unit
+docker exec ogcore-php php bin/console opengnsys:migration:hardware-profile
+docker exec ogcore-php php bin/console opengnsys:migration:clients
+docker exec ogcore-php php bin/console opengnsys:migration:os
+docker exec ogcore-php php bin/console opengnsys:migration:image
+docker exec ogcore-php php bin/console opengnsys:migration:software-profile
+

1.14.3 13.3 Backup y +Restauración

+

1.14.3.1 13.3.1 Backup de Base de +Datos

+
docker exec ogcore-database mysqldump -u user -p ogcore > backup_$(date +%Y%m%d).sql
+

1.14.3.2 13.3.2 Restaurar Base de +Datos

+
docker exec -i ogcore-database mysql -u user -p ogcore < backup_20251008.sql
+
+

1.15 14. Testing

+

1.15.1 14.1 Framework de +Testing

+

ogCore utiliza PHPUnit con integración de Symfony y +Doctrine.

+

1.15.2 14.2 Ejecutar Tests

+

1.15.2.1 14.2.1 Todos los +Tests

+
docker compose exec php bin/phpunit
+

1.15.2.2 14.2.2 Tests +Específicos

+
docker compose exec php bin/phpunit tests/Functional/ClientTest.php
+

1.15.2.3 14.2.3 Tests con +Coverage

+
docker compose exec php bin/phpunit --coverage-html coverage/
+

1.15.3 14.3 Tipos de Tests

+

1.15.3.1 14.3.1 Tests +Funcionales

+

Ubicación: tests/Functional/

+

20 archivos de tests funcionales que prueban: - Endpoints de API - +Flujos completos - Integraciones

+

Ejemplo:

+
public function testCreateClient(): void
+{
+    $client = static::createClient();
+    $client->request('POST', '/clients', [
+        'json' => [
+            'name' => 'Test Client',
+            'mac' => '00:11:22:33:44:55',
+            'ip' => '192.168.1.100'
+        ]
+    ]);
+    
+    $this->assertResponseStatusCodeSame(201);
+}
+

1.15.4 14.4 Factories para +Testing

+

Se utilizan Zenstruck Foundry factories (24 +factories) para crear datos de prueba:

+
ClientFactory::createOne([
+    'name' => 'Test PC',
+    'status' => 'active'
+]);
+

1.15.5 14.5 Base de Datos de +Testing

+

Los tests utilizan DAMA Doctrine Test Bundle para: - +Ejecutar cada test en una transacción - Rollback automático después de +cada test - Aislamiento completo entre tests

+
+

1.16 15. Despliegue

+

1.16.1 15.1 Despliegue con Docker +Compose

+

1.16.1.1 15.1.1 Desarrollo

+
docker compose up -d
+

1.16.1.2 15.1.2 Producción

+
docker compose -f docker-compose-deploy.yml up -d
+

1.16.2 15.2 Despliegue con +Jenkins

+

El proyecto incluye Jenkinsfile para CI/CD.

+

1.16.2.1 Pipeline stages:

+
    +
  1. Checkout: Clonar repositorio
  2. +
  3. Build: Construir imagen Docker
  4. +
  5. Test: Ejecutar tests
  6. +
  7. Package: Crear paquete Debian
  8. +
  9. Deploy: Desplegar en servidor
  10. +
+

1.16.3 15.3 Paquete Debian

+

El proyecto puede empaquetarse como .deb:

+
./package.sh
+

Estructura del paquete en debian/: - Control files - +Postinst/preinst scripts - Systemd service file - Configuración

+

1.16.4 15.4 Configuración de +Producción

+

1.16.4.1 15.4.1 Variables de +Entorno

+

Crear .env.local con configuración de producción:

+
APP_ENV=prod
+APP_DEBUG=0
+DATABASE_URL="mysql://user:pass@localhost:3306/ogcore"
+# ... más configuración
+

1.16.4.2 15.4.2 Optimizaciones

+
# Limpiar caché
+docker exec ogcore-php php bin/console cache:clear --env=prod
+
+# Calentar caché
+docker exec ogcore-php php bin/console cache:warmup --env=prod
+
+# Optimizar autoloader
+docker exec ogcore-php composer dump-autoload --optimize --classmap-authoritative
+

1.16.5 15.5 Monitoreo

+

1.16.5.1 15.5.1 Logs

+

Logs ubicados en var/log/: - dev.log / +prod.log: Logs de aplicación - +nginx/access.log: Accesos a nginx - +nginx/error.log: Errores de nginx

+

1.16.5.2 15.5.2 Syslog

+

Los logs también se envían a syslog para centralización.

+

1.16.6 15.6 Escalabilidad

+

Para escalar horizontalmente:

+
    +
  1. Base de datos: Usar MariaDB con replicación +master-slave
  2. +
  3. PHP: Aumentar réplicas de contenedor PHP
  4. +
  5. Load Balancer: Usar nginx como balanceador de +carga
  6. +
  7. Caché: Implementar Redis para sesiones y caché
  8. +
  9. Mercure: Escalar hub de Mercure
  10. +
+
+

1.17 16. Mantenimiento y +Operaciones

+

1.17.1 16.1 Reiniciar Base de +Datos

+
docker exec ogcore-php php bin/console doctrine:database:drop --force
+docker exec ogcore-php php bin/console doctrine:database:create
+docker exec ogcore-php php bin/console doctrine:migrations:migrate --no-interaction
+docker exec ogcore-php php bin/console doctrine:fixtures:load --no-interaction
+

1.17.2 16.2 Limpiar Caché

+
docker exec ogcore-php php bin/console cache:clear
+docker exec ogcore-php php bin/console cache:warmup
+

1.17.3 16.3 Actualizar +Dependencias

+
docker exec ogcore-php composer update
+

1.17.4 16.4 Regenerar Claves +JWT

+
docker exec ogcore-php php bin/console lexik:jwt:generate-keypair --overwrite
+

1.17.5 16.5 Backups +Automáticos

+

Script ejemplo para backup automático:

+
#!/bin/bash
+DATE=$(date +%Y%m%d_%H%M%S)
+BACKUP_DIR="/backups"
+
+# Backup de base de datos
+docker exec ogcore-database mysqldump -u user -p password ogcore > $BACKUP_DIR/db_$DATE.sql
+
+# Backup de archivos
+tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www/html/ogcore/var
+
+# Limpiar backups antiguos (>30 días)
+find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
+find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
+

1.17.6 16.6 Monitoreo de Salud

+

1.17.6.1 Health Check Endpoint

+
GET /health
+

1.17.6.2 Verificar Estado de +Servicios

+
# PHP
+docker exec ogcore-php php -v
+
+# Nginx
+docker exec ogcore-nginx nginx -t
+
+# MariaDB
+docker exec ogcore-database mysqladmin -u user -p status
+

1.17.7 16.7 Rotación de Logs

+

Configurar logrotate:

+
/var/www/html/ogcore/var/log/*.log {
+    daily
+    rotate 14
+    compress
+    delaycompress
+    notifempty
+    create 0640 www-data www-data
+    sharedscripts
+}
+
+

1.18 17. Integración con Otros +Servicios

+

1.18.1 17.1 ogRepository

+

Propósito: Gestión de repositorios de imágenes.

+

Endpoints integrados: - Crear imagen - Desplegar +imagen - Backup imagen - Eliminar imagen - Convertir a imagen virtual - +Importar imagen externa - Verificar integridad - Imagen global

+

Webhook: /og-repository/webhook

+

1.18.2 17.2 ogDhcp

+

Propósito: Gestión de DHCP dinámico.

+

Funcionalidades: - Agregar clientes a DHCP - +Eliminar clientes de DHCP - Actualizar configuración - Gestión de +subredes

+

1.18.3 17.3 ogBoot

+

Propósito: Gestión de archivos de arranque PXE.

+

Funcionalidades: - Crear archivos de arranque - +Actualizar plantillas PXE - Eliminar configuraciones - Sincronización de +menús

+

1.18.4 17.4 ogAgent

+

Propósito: Agente instalado en clientes para +ejecutar comandos.

+

Operaciones: - Power on/off/reboot - Crear/desplegar +imágenes - Particionar discos - Ejecutar scripts - Obtener inventario +hardware - Verificar tamaño de particiones - Kill jobs

+

1.18.5 17.5 UDS (Universal Desktop +Services)

+

Propósito: Integración con sistema de escritorios +remotos.

+

Funcionalidades: - Autenticación - Obtener service +pools - Calcular disponibilidad - Gestión de reservas

+

1.18.6 17.6 Git (Versionado de +Imágenes)

+

Propósito: Versionado de imágenes con Git.

+

Funcionalidades: - Backup a repositorio Git - +Versionado automático - Recuperación de versiones - Sincronización

+

1.18.7 17.7 Mercure (Notificaciones +en Tiempo Real)

+

Propósito: Notificaciones push en tiempo real.

+

Eventos publicados: - Cambio de estado de clientes - +Actualización de trazas - Cambios en comandos - Alertas y +notificaciones

+

Suscripción del cliente:

+
const eventSource = new EventSource('http://localhost:8080/.well-known/mercure?topic=/clients/{id}');
+eventSource.onmessage = event => {
+    const data = JSON.parse(event.data);
+    console.log('Client updated:', data);
+};
+
+

1.19 18. Roadmap y Changelog

+

1.19.1 18.1 Versión Actual: +0.5.0

+

1.19.2 18.2 Últimas Características +(v0.25.1 - Octubre 2025)

+
    +
  • Tareas programadas: Sistema completo de colas y +scheduling
  • +
  • Inventario hardware: Obtención automática de +inventario
  • +
  • Clonado de imágenes: Mejoras en el servicio de +clonado
  • +
  • Repositorios Git: Backup y gestión de +repositorios
  • +
  • Particionado: Integración con agente para scripts +de particionado
  • +
  • Gestión de trazas: Marcar como completadas, +cancelación
  • +
  • Estados de cliente: Nuevo estado “enviado” para +Windows/Linux
  • +
  • Validación de particiones: Comprobación de +tamaños
  • +
  • Imagen versionada: Sistema de versionado de +imágenes
  • +
  • Calendario remoto: Integración con UDS
  • +
  • Mercure: Notificaciones en tiempo real
  • +
  • Despliegue multicast: Modos torrent y UDPCAST
  • +
+

1.19.3 18.3 Próximas +Características (Roadmap)

+

1.19.3.1 v0.6.0 (Q4 2025)

+
    +
  • +
  • +
  • +
  • +
+

1.19.3.2 v0.7.0 (Q1 2026)

+
    +
  • +
  • +
  • +
  • +
+

1.19.3.3 v1.0.0 (Q2 2026)

+
    +
  • +
  • +
  • +
  • +
+

1.19.4 18.4 Changelog Resumido

+

Ver CHANGELOG.md para el historial completo de +cambios.

+

Versiones destacadas:

+
    +
  • 0.25.1 (2025-10-01): Correcciones en tareas +programadas
  • +
  • 0.25.0 (2025-09-23): Inventario hardware
  • +
  • 0.24.0 (2025-09-09): Servicio de eliminación de +repositorios Git
  • +
  • 0.23.0 (2025-09-08): Backups a repositorios +Git
  • +
  • 0.20.0 (2025-08-25): Sistema de colas y tareas
  • +
  • 0.15.0 (2025-06-26): Integración ogGit y sistema de +cola
  • +
  • 0.14.0 (2025-06-02): Mover equipos, imagen cache, +inicio sesión
  • +
  • 0.13.0 (2025-05-20): Comunicación TLS con +agente
  • +
  • 0.12.0 (2025-05-13): Tareas programadas, +integración ogGit
  • +
  • 0.11.0 (2025-04-11): Versionado de imágenes, +ejecución de scripts
  • +
  • 0.10.0 (2025-03-25): Imagen virtual, importar +imágenes
  • +
  • 0.9.0 (2025-03-04): Mercure, notificaciones en +tiempo real
  • +
  • 0.8.0 (2025-01-10): Imagen global, jerarquía de +aulas
  • +
  • 0.7.3 (2025-01-03): Multiselección, import/export, +torrent/udpcast
  • +
+
+

1.20 19. Contribución

+

1.20.1 19.1 Guía de +Contribución

+

Para contribuir al proyecto:

+
    +
  1. Fork el repositorio
  2. +
  3. Crea una rama para tu feature: +git checkout -b feature/nueva-funcionalidad
  4. +
  5. Commit tus cambios: +git commit -am 'Añade nueva funcionalidad'
  6. +
  7. Push a la rama: +git push origin feature/nueva-funcionalidad
  8. +
  9. Crea un Pull Request
  10. +
+

1.20.2 19.2 Estándares de +Código

+
    +
  • Seguir PSR-12 para PHP
  • +
  • Usar Type Hints en PHP 8.3
  • +
  • Documentar con PHPDoc
  • +
  • Tests para nuevas funcionalidades
  • +
  • Commits descriptivos en español
  • +
+

1.20.3 19.3 Proceso de +Revisión

+
    +
  1. CI/CD ejecuta tests automáticamente
  2. +
  3. Revisión de código por maintainers
  4. +
  5. Aprobación requerida antes de merge
  6. +
  7. Merge a rama develop
  8. +
  9. Release periódicos a main
  10. +
+

1.20.4 19.4 Reportar Bugs

+

Usar el sistema de Issues del repositorio:

+

Template de Bug:

+
**Descripción del bug**
+Descripción clara y concisa del bug.
+
+**Pasos para reproducir**
+1. Ir a '...'
+2. Hacer clic en '...'
+3. Ver error
+
+**Comportamiento esperado**
+Lo que esperabas que sucediera.
+
+**Screenshots**
+Si aplica, añadir screenshots.
+
+**Entorno**
+- OS: [ej. Ubuntu 22.04]
+- Versión: [ej. 0.5.0]
+- Browser: [ej. Firefox 118]
+
+

1.21 20. Soporte y Contacto

+

1.21.1 20.1 Documentación +Adicional

+
    +
  • API Docs: http://localhost:8080/docs
  • +
  • Postman Collection: +swagger-assets/ogCore.postman_collection.zip
  • +
  • Diagramas: +swagger-assets/img_bbdd.png
  • +
+

1.21.2 20.2 Recursos

+
    +
  • Repositorio: [URL del repositorio]
  • +
  • Wiki: [URL de la wiki]
  • +
  • Issues: [URL de issues]
  • +
+

1.21.3 20.3 Equipo de +Desarrollo

+

Proyecto desarrollado por el equipo de OpenGnsys en colaboración con +universidades participantes.

+

1.21.4 20.4 Licencia

+

Proyecto propietario. Ver archivo LICENSE para más +información.

+
+

1.22 Apéndices

+

1.22.1 Apéndice A: Glosario de +Términos

+
    +
  • Cliente: Equipo físico gestionado por el +sistema
  • +
  • Imagen: Copia bit a bit de una partición de +disco
  • +
  • Traza: Registro de ejecución de un comando
  • +
  • Unidad Organizativa: Agrupación lógica de clientes +(aula, grupo)
  • +
  • PXE: Preboot Execution Environment, arranque por +red
  • +
  • ogLive: Imagen Live de arranque de OpenGnsys
  • +
  • Partición: División lógica de un disco duro
  • +
  • Repositorio: Servidor de almacenamiento de +imágenes
  • +
+

1.22.2 Apéndice B: Puertos y +Servicios

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PuertoServicioProtocoloDescripción
8080nginxHTTPAPI y docs
3306MariaDBMySQLBase de datos
9000PHP-FPMFastCGIProcesador PHP
3000MercureHTTP/SSENotificaciones
+

1.22.3 Apéndice C: Estructura de +Directorios

+
ogcore/
+├── bin/              # Ejecutables (console, phpunit)
+├── config/           # Configuración de Symfony
+│   ├── api_platform/ # Configuración de entidades API
+│   ├── packages/     # Configuración de bundles
+│   └── routes/       # Rutas
+├── migrations/       # Migraciones de base de datos
+├── public/           # Punto de entrada web
+├── src/              # Código fuente
+│   ├── Command/      # Comandos de consola
+│   ├── Controller/   # Controladores
+│   ├── Dto/          # Data Transfer Objects
+│   ├── Entity/       # Entidades Doctrine
+│   ├── EventListener/# Event Listeners
+│   ├── EventSubscriber/ # Event Subscribers
+│   ├── Factory/      # Factories para testing
+│   ├── Filter/       # Filtros de API Platform
+│   ├── Repository/   # Repositorios Doctrine
+│   ├── Security/     # Seguridad y autenticación
+│   ├── Service/      # Servicios de negocio
+│   ├── State/        # States de API Platform
+│   └── Validator/    # Validadores personalizados
+├── tests/            # Tests
+├── translations/     # Traducciones
+├── var/              # Archivos variables (cache, logs)
+└── vendor/           # Dependencias
+
+

1.22.4 Apéndice D: Variables de +Entorno Completas

+

Ver archivo .env para todas las variables de entorno +disponibles.

+
+

Fecha de actualización: Octubre 2025
+Versión del documento: 1.0
+Mantenedor: Equipo OpenGnsys

+ + diff --git a/ogCore_Documentacion_Tecnica.pdf b/ogCore_Documentacion_Tecnica.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3c6a00f95a0cd86947e3250ee0e03e0fa11e4bf GIT binary patch literal 328369 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�-OVIlo&@E& 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 = new PxeTemplateOutput($client->getTemplate()); } - if ($client->getHardwareProfile()) { - $this->hardwareProfile = new HardwareProfileOutput($client->getHardwareProfile()); - } - if ($client->getRepository()) { $this->repository = new ImageRepositoryOutput($client->getRepository()); } @@ -163,7 +153,6 @@ final class ClientInput $menu = $this->menu?->getEntity() ?? $client->getOrganizationalUnit()?->getNetworkSettings()?->getMenu(); $ogLive = $this->ogLive?->getEntity() ?? $client->getOrganizationalUnit()?->getNetworkSettings()?->getOgLive(); - $hardwareProfile = $this->hardwareProfile?->getEntity() ?? $client->getOrganizationalUnit()?->getNetworkSettings()?->getHardwareProfile(); $repository = $this->repository?->getEntity() ?? $client->getOrganizationalUnit()?->getNetworkSettings()?->getRepository(); $template = $this->pxeTemplate?->getEntity() ?? $client->getOrganizationalUnit()?->getNetworkSettings()?->getPxeTemplate(); @@ -176,7 +165,6 @@ final class ClientInput $client->setIp($this->ip); $client->setMenu($menu); $client->setOgLive($ogLive); - $client->setHardwareProfile($hardwareProfile); $client->setRepository($repository); $client->setTemplate($template); $client->setPosition($this->position); diff --git a/src/Dto/Input/CommandExecuteInput.php b/src/Dto/Input/CommandExecuteInput.php index eb21710..4f71b31 100644 --- a/src/Dto/Input/CommandExecuteInput.php +++ b/src/Dto/Input/CommandExecuteInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\ClientOutput; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -13,13 +14,24 @@ final class CommandExecuteInput */ #[Assert\NotNull] #[Groups(['command:write'])] + #[ApiProperty( + description: 'Los clientes donde ejecutar el comando', + example: [] + )] public array $clients = []; - #[Assert\NotNull] #[Groups(['command:write'])] + #[ApiProperty( + description: 'El script a ejecutar', + example: 'echo "Hello World"' + )] public string $script = ''; #[Groups(['command:write'])] + #[ApiProperty( + description: 'Si encolar la ejecución del comando', + example: false + )] public bool $queue = false; } \ No newline at end of file diff --git a/src/Dto/Input/CommandGroupAddCommandsInput.php b/src/Dto/Input/CommandGroupAddCommandsInput.php index 2b14a7b..0cc9964 100644 --- a/src/Dto/Input/CommandGroupAddCommandsInput.php +++ b/src/Dto/Input/CommandGroupAddCommandsInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\CommandOutput; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -13,5 +14,9 @@ final class CommandGroupAddCommandsInput */ #[Assert\NotNull] #[Groups(['command-group:write'])] + #[ApiProperty( + description: 'Los comandos a añadir al grupo', + example: [] + )] public array $commands = []; } \ No newline at end of file diff --git a/src/Dto/Input/CommandGroupExecuteInput.php b/src/Dto/Input/CommandGroupExecuteInput.php index 19dd317..17aca16 100644 --- a/src/Dto/Input/CommandGroupExecuteInput.php +++ b/src/Dto/Input/CommandGroupExecuteInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\ClientOutput; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -13,5 +14,9 @@ final class CommandGroupExecuteInput */ #[Assert\NotNull] #[Groups(['command-group:write'])] + #[ApiProperty( + description: 'Los clientes donde ejecutar el grupo de comandos', + example: [] + )] public array $clients = []; } \ No newline at end of file diff --git a/src/Dto/Input/CommandTaskScheduleInput.php b/src/Dto/Input/CommandTaskScheduleInput.php index afb0fde..5802b88 100644 --- a/src/Dto/Input/CommandTaskScheduleInput.php +++ b/src/Dto/Input/CommandTaskScheduleInput.php @@ -2,29 +2,53 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\CommandTaskOutput; -use App\Dto\Output\CommandTaskScheduleOutput; use App\Entity\CommandTaskSchedule; use Symfony\Component\Serializer\Annotation\Groups; final class CommandTaskScheduleInput { #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'La tarea de comando a programar', + example: null + )] public ?CommandTaskOutput $commandTask = null; #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'El tipo de recurrencia de la programación', + example: 'daily' + )] public ?string $recurrenceType = null; #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'La fecha de ejecución de la tarea', + example: '2024-01-15T00:00:00+00:00' + )] public ?\DateTimeInterface $executionDate = null; #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'La hora de ejecución de la tarea', + example: '2024-01-15T09:00:00+00:00' + )] public ?\DateTimeInterface $executionTime = null; #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'Los detalles de la recurrencia', + example: ['interval' => 1, 'days' => ['monday', 'wednesday', 'friday']] + )] public ?array $recurrenceDetails = null; #[Groups(['command-task-schedule:write'])] + #[ApiProperty( + description: 'Si la programación está habilitada', + example: true + )] public ?bool $enabled = null; public function __construct(?CommandTaskSchedule $commandTaskSchedule = null) diff --git a/src/Dto/Input/CommandTaskScriptInput.php b/src/Dto/Input/CommandTaskScriptInput.php index 8eb8583..d46f001 100644 --- a/src/Dto/Input/CommandTaskScriptInput.php +++ b/src/Dto/Input/CommandTaskScriptInput.php @@ -2,27 +2,46 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\CommandTaskOutput; -use App\Dto\Output\CommandTaskScheduleOutput; -use App\Entity\CommandTaskSchedule; use App\Entity\CommandTaskScript; use Symfony\Component\Serializer\Annotation\Groups; final class CommandTaskScriptInput { #[Groups(['command-task-script:write'])] + #[ApiProperty( + description: 'El contenido del script', + example: '#!/bin/bash\necho "Hello World"' + )] public ?string $content = null; #[Groups(['command-task-script:write'])] + #[ApiProperty( + description: 'El tipo de script', + example: 'bash' + )] public ?string $type = null; #[Groups(['command-task-script:write'])] + #[ApiProperty( + description: 'Los parámetros del script', + example: ['param1' => 'value1', 'param2' => 'value2'] + )] public ?array $parameters = null; #[Groups(['command-task-script:write'])] + #[ApiProperty( + description: 'La tarea de comando asociada', + example: null + )] public ?CommandTaskOutput $commandTask = null; #[Groups(['command-task-script:write'])] + #[ApiProperty( + description: 'El orden de ejecución del script', + example: 1 + )] public ?int $order = null; public function __construct(?CommandTaskScript $commandTaskScript = null) diff --git a/src/Dto/Input/ConvertImageToVirtualInput.php b/src/Dto/Input/ConvertImageToVirtualInput.php index d1d0e84..c86f598 100644 --- a/src/Dto/Input/ConvertImageToVirtualInput.php +++ b/src/Dto/Input/ConvertImageToVirtualInput.php @@ -2,8 +2,7 @@ namespace App\Dto\Input; -use App\Dto\Output\ImageOutput; -use App\Dto\Output\ImageRepositoryOutput; +use ApiPlatform\Metadata\ApiProperty; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -11,5 +10,9 @@ class ConvertImageToVirtualInput { #[Assert\NotNull] #[Groups(['image-image-repository:write'])] + #[ApiProperty( + description: 'La extensión del archivo virtual a generar', + example: 'qcow2' + )] public ?string $extension = ''; } \ No newline at end of file diff --git a/src/Dto/Input/ExportImportImageRepositoryInput.php b/src/Dto/Input/ExportImportImageRepositoryInput.php index 690500b..f115da4 100644 --- a/src/Dto/Input/ExportImportImageRepositoryInput.php +++ b/src/Dto/Input/ExportImportImageRepositoryInput.php @@ -2,8 +2,8 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\ImageOutput; -use App\Dto\Output\ImageRepositoryOutput; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -14,5 +14,9 @@ class ExportImportImageRepositoryInput */ #[Assert\NotNull] #[Groups(['repository:write'])] + #[ApiProperty( + description: 'Las imágenes a exportar o importar', + example: [] + )] public array $images = []; } \ No newline at end of file diff --git a/src/Dto/Input/GetPartitionScriptDataInput.php b/src/Dto/Input/GetPartitionScriptDataInput.php index 14347bc..456e85d 100644 --- a/src/Dto/Input/GetPartitionScriptDataInput.php +++ b/src/Dto/Input/GetPartitionScriptDataInput.php @@ -2,7 +2,8 @@ namespace App\Dto\Input; -use App\Dto\Output\ClientOutput; +use ApiPlatform\Metadata\ApiProperty; +use App\Dto\Input\PartitionInput; use Symfony\Component\Serializer\Annotation\Groups; final class GetPartitionScriptDataInput @@ -11,6 +12,10 @@ final class GetPartitionScriptDataInput * @var PartitionInput[] */ #[Groups(['client:write'])] + #[ApiProperty( + description: 'Las particiones para obtener datos del script', + example: [] + )] public array $partitions = []; } diff --git a/src/Dto/Input/MultipleClientsInput.php b/src/Dto/Input/MultipleClientsInput.php index f47e203..3eca31d 100644 --- a/src/Dto/Input/MultipleClientsInput.php +++ b/src/Dto/Input/MultipleClientsInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\ClientOutput; use Symfony\Component\Serializer\Annotation\Groups; @@ -11,9 +12,17 @@ final class MultipleClientsInput * @var ClientOutput[] */ #[Groups(['client:write'])] + #[ApiProperty( + description: 'Los clientes para la operación múltiple', + example: [] + )] public array $clients = []; #[Groups(['client:write'])] + #[ApiProperty( + description: 'Si encolar la operación', + example: false + )] public bool $queue = false; } diff --git a/src/Dto/Input/NetworkSettingsInput.php b/src/Dto/Input/NetworkSettingsInput.php index add2df6..161aa2e 100644 --- a/src/Dto/Input/NetworkSettingsInput.php +++ b/src/Dto/Input/NetworkSettingsInput.php @@ -8,8 +8,6 @@ use App\Dto\Output\ImageRepositoryOutput; use App\Dto\Output\MenuOutput; use App\Dto\Output\OgLiveOutput; use App\Dto\Output\PxeTemplateOutput; -use App\Entity\HardwareProfile; -use App\Entity\Menu; use App\Entity\NetworkSettings; use App\Validator\Constraints\OrganizationalUnitMulticastMode; use App\Validator\Constraints\OrganizationalUnitMulticastPort; @@ -20,71 +18,146 @@ use Symfony\Component\Validator\Constraints as Assert; class NetworkSettingsInput { #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El servidor siguiente (next server) para PXE', + example: '192.168.1.1' + )] public ?string $nextServer = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El nombre del archivo de arranque', + example: 'pxelinux.0' + )] public ?string $bootFileName = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El servidor proxy', + example: 'http://proxy.example.com:8080' + )] public ?string $proxy = null; #[Assert\Ip(message: 'validators.network_settings.ip_address.invalid')] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El servidor DNS', + example: '8.8.8.8' + )] public ?string $dns = null; #[Assert\Ip(message: 'validators.network_settings.ip_address.invalid')] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La máscara de red', + example: '255.255.255.0' + )] public ?string $netmask = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La puerta de enlace (router)', + example: '192.168.1.1' + )] public ?string $router = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El servidor NTP', + example: 'pool.ntp.org' + )] public ?string $ntp = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La interfaz de red', + example: 'eth0' + )] public ?string $netiface = null; #[OrganizationalUnitP2PMode] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El modo P2P para despliegues torrent', + example: 'seed' + )] public ?string $p2pMode = null; #[Assert\GreaterThan(0, message: 'validators.network_settings.p2p_time.invalid')] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El tiempo P2P en segundos', + example: 3600 + )] public ?int $p2pTime = null; #[Assert\Ip(message: 'validators.network_settings.ip_address.invalid')] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La dirección IP de multicast', + example: '239.255.255.250' + )] public ?string $mcastIp = null; #[Assert\GreaterThan(0, message: 'validators.network_settings.mcast_speed.invalid')] #[Groups(['organizational-write:write'])] + #[ApiProperty( + description: 'La velocidad de multicast en Mbps', + example: 100 + )] public ?int $mcastSpeed = null; #[OrganizationalUnitMulticastPort] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El puerto de multicast', + example: 8000 + )] public ?int $mcastPort = null; #[OrganizationalUnitMulticastMode] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El modo de multicast', + example: 'full' + )] public ?string $mcastMode = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El menú de la configuración de red' + )] public ?MenuOutput $menu = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El perfil de hardware de la configuración de red' + )] public ?HardwareProfileOutput $hardwareProfile = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La configuración OgLive de la configuración de red' + )] public ?OgLiveOutput $ogLive = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El repositorio de imágenes de la configuración de red' + )] public ?ImageRepositoryOutput $repository = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La plantilla PXE de la configuración de red' + )] public ?PxeTemplateOutput $pxeTemplate = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La ruta de ogshare', + example: '/var/ogshare' + )] public ?string $ogshare = null; public function __construct(?NetworkSettings $networkSettings = null) diff --git a/src/Dto/Input/OperativeSystemInput.php b/src/Dto/Input/OperativeSystemInput.php index 8ebac93..23e90a5 100644 --- a/src/Dto/Input/OperativeSystemInput.php +++ b/src/Dto/Input/OperativeSystemInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Entity\OperativeSystem; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -10,6 +11,10 @@ class OperativeSystemInput { #[Assert\NotBlank(message: 'validators.operative_system.name.not_blank')] #[Groups(['operative-system:write'])] + #[ApiProperty( + description: 'El nombre del sistema operativo', + example: 'Ubuntu 20.04 LTS' + )] public ?string $name = null; public function __construct(?OperativeSystem $operativeSystem = null) diff --git a/src/Dto/Input/OrganizationalUnitInput.php b/src/Dto/Input/OrganizationalUnitInput.php index 64b8930..d0d3bf6 100644 --- a/src/Dto/Input/OrganizationalUnitInput.php +++ b/src/Dto/Input/OrganizationalUnitInput.php @@ -6,9 +6,6 @@ use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\OrganizationalUnitOutput; use App\Dto\Output\RemoteCalendarOutput; use App\Entity\OrganizationalUnit; -use App\Validator\Constraints\OrganizationalUnitMulticastMode; -use App\Validator\Constraints\OrganizationalUnitMulticastPort; -use App\Validator\Constraints\OrganizationalUnitP2PMode; use App\Validator\Constraints\OrganizationalUnitParent; use App\Validator\Constraints\OrganizationalUnitType; use Symfony\Component\Serializer\Annotation\Groups; @@ -19,45 +16,95 @@ class OrganizationalUnitInput { #[Assert\NotBlank(message: 'validators.organizational_unit.name.not_blank')] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El nombre de la unidad organizativa', + example: 'Aula 1' + )] public ?string $name = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La unidad organizativa padre', + example: null + )] public ?OrganizationalUnitOutput $parent = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La descripción de la unidad organizativa', + example: 'Aula de informática principal' + )] public ?string $description = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La ubicación de la unidad organizativa', + example: 'Planta baja, edificio A' + )] public ?string $location = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'Si tiene proyector', + example: true + )] public ?bool $projector = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'Si tiene pizarra digital', + example: false + )] public ?bool $board = null; #[Assert\GreaterThan(0)] #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'La capacidad de la unidad organizativa', + example: 30 + )] public ?int $capacity = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'Comentarios adicionales', + example: 'Aula equipada con ordenadores de última generación' + )] public ?string $comments = null; #[Groups(['organizational-unit:write'])] #[OrganizationalUnitType] + #[ApiProperty( + description: 'El tipo de unidad organizativa', + example: 'aula' + )] public ?string $type = null; #[Groups(['organizational-unit:write'])] #[Assert\Valid()] + #[ApiProperty( + description: 'La configuración de red de la unidad organizativa' + )] public ?NetworkSettingsInput $networkSettings = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'El calendario remoto de la unidad organizativa' + )] public ?RemoteCalendarOutput $remoteCalendar = null; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'Si es un PC remoto', + example: false + )] public ?bool $remotePc = false; #[Groups(['organizational-unit:write'])] + #[ApiProperty( + description: 'Si excluir cambios del padre', + example: false + )] public ?bool $excludeParentChanges = null; public function __construct(?OrganizationalUnit $organizationalUnit = null) diff --git a/src/Dto/Input/PartitionInput.php b/src/Dto/Input/PartitionInput.php index 5942a3b..8c5d5c2 100644 --- a/src/Dto/Input/PartitionInput.php +++ b/src/Dto/Input/PartitionInput.php @@ -3,12 +3,8 @@ namespace App\Dto\Input; use ApiPlatform\Metadata\ApiProperty; -use App\Dto\Output\ClientOutput; use App\Dto\Output\ImageOutput; use App\Dto\Output\OperativeSystemOutput; -use App\Dto\Output\OrganizationalUnitOutput; -use App\Entity\HardwareProfile; -use App\Entity\Menu; use App\Entity\Partition; use Ramsey\Uuid\UuidInterface; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Dto/Input/SubnetAddHostInput.php b/src/Dto/Input/SubnetAddHostInput.php index d903357..7cff517 100644 --- a/src/Dto/Input/SubnetAddHostInput.php +++ b/src/Dto/Input/SubnetAddHostInput.php @@ -4,9 +4,6 @@ namespace App\Dto\Input; use ApiPlatform\Metadata\ApiProperty; use App\Dto\Output\ClientOutput; -use App\Dto\Output\PxeTemplateOutput; -use App\Dto\Output\SubnetOutput; -use App\Entity\PxeBootFile; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -17,5 +14,9 @@ final class SubnetAddHostInput */ #[Assert\NotNull] #[Groups(['subnet:write'])] + #[ApiProperty( + description: 'Los clientes a añadir a la subred', + example: [] + )] public ?array $clients = []; } \ No newline at end of file diff --git a/src/Dto/Input/TransferGlobalImageInput.php b/src/Dto/Input/TransferGlobalImageInput.php index 7193d13..7341644 100644 --- a/src/Dto/Input/TransferGlobalImageInput.php +++ b/src/Dto/Input/TransferGlobalImageInput.php @@ -3,7 +3,7 @@ namespace App\Dto\Input; use App\Dto\Output\ImageOutput; -use App\Dto\Output\ImageRepositoryOutput; +use ApiPlatform\Metadata\ApiProperty; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -14,5 +14,9 @@ class TransferGlobalImageInput */ #[Assert\NotNull] #[Groups(['image-image-repository:write'])] + #[ApiProperty( + description: 'Los repositorios de destino para transferir la imagen global', + example: [] + )] public array $repositories = []; } \ No newline at end of file diff --git a/src/Dto/Input/UserGroupInput.php b/src/Dto/Input/UserGroupInput.php index 918e1ef..1dabc19 100644 --- a/src/Dto/Input/UserGroupInput.php +++ b/src/Dto/Input/UserGroupInput.php @@ -2,6 +2,7 @@ namespace App\Dto\Input; +use ApiPlatform\Metadata\ApiProperty; use App\Entity\UserGroup; use App\Validator\Constraints\UserGroupsValidPermission; use Symfony\Component\Serializer\Annotation\Groups; @@ -11,14 +12,26 @@ final class UserGroupInput { #[Assert\NotBlank] #[Groups(['user-group:write'])] + #[ApiProperty( + description: 'El nombre del grupo de usuario', + example: 'Administradores' + )] public ?string $name = null; #[Groups(['user-group:write'])] #[UserGroupsValidPermission] + #[ApiProperty( + description: 'Los permisos del grupo de usuario', + example: ['ROLE_ADMIN', 'ROLE_USER_MANAGEMENT'] + )] public ?array $permissions = []; #[Assert\NotNull] #[Groups(['user-group:write'])] + #[ApiProperty( + description: 'Si el grupo está habilitado', + example: true + )] public ?bool $enabled = false; public function __construct(?UserGroup $userGroupGroup = null) diff --git a/src/Dto/Input/UserInput.php b/src/Dto/Input/UserInput.php index aea6947..c524e2b 100644 --- a/src/Dto/Input/UserInput.php +++ b/src/Dto/Input/UserInput.php @@ -15,47 +15,85 @@ final class UserInput { #[Assert\NotBlank] #[Groups('user:write')] + #[ApiProperty( + description: 'El nombre de usuario', + example: 'admin' + )] public ?string $username = null; /** * @var OrganizationalUnitOutput[] */ #[Groups('user:write')] - #[ApiProperty(readableLink: false, writableLink: false)] + #[ApiProperty( + description: 'Las unidades organizativas permitidas para el usuario', + example: [], + readableLink: false, + writableLink: false + )] public array $allowedOrganizationalUnits = []; #[Assert\NotBlank(groups: ['user:post'])] #[Assert\Length(min: 8, groups: ['user:write', 'user:post'])] #[Groups('user:write')] + #[ApiProperty( + description: 'La contraseña del usuario (mínimo 8 caracteres)', + example: 'password123' + )] public ?string $password = null; #[Groups('user:write')] + #[ApiProperty( + description: 'La vista por defecto de grupos para el usuario', + example: 'grid' + )] public ?string $groupsView = null; #[Assert\NotNull] #[Groups('user:write')] + #[ApiProperty( + description: 'Si el usuario está habilitado', + example: true + )] public ?bool $enabled = true; /** * @var UserGroupOutput[] */ #[Groups('user:write')] - #[ApiProperty(readableLink: false, writableLink: false)] + #[ApiProperty( + description: 'Los grupos de usuario asignados', + example: [], + readableLink: false, + writableLink: false + )] public array $userGroups = []; #[Assert\NotBlank(groups: ['user:reset-password'])] #[Groups('user:reset-password')] + #[ApiProperty( + description: 'La contraseña actual del usuario', + example: 'currentpass123' + )] public ?string $currentPassword = null; #[Assert\NotBlank(groups: ['user:reset-password'])] #[Assert\Length(min: 8, groups: ['user:reset-password'])] #[Groups('user:reset-password')] + #[ApiProperty( + description: 'La nueva contraseña del usuario (mínimo 8 caracteres)', + example: 'newpass123' + )] public ?string $newPassword = null; #[Assert\NotBlank(groups: ['user:reset-password'])] #[Assert\Length(min: 8, groups: ['user:reset-password'])] #[Assert\Expression(expression: 'this.newPassword === this.repeatNewPassword', message: 'This value should be the same as the new password', groups: ['user:reset-password'])] #[Groups('user:reset-password')] + #[ApiProperty( + description: 'Repetir la nueva contraseña para confirmación', + example: 'newpass123' + )] public ?string $repeatNewPassword = null; public function __construct(?User $user = null) diff --git a/src/Dto/Input/WoLInput.php b/src/Dto/Input/WoLInput.php index 82d36ca..7ec82e6 100644 --- a/src/Dto/Input/WoLInput.php +++ b/src/Dto/Input/WoLInput.php @@ -12,6 +12,9 @@ class WoLInput * @var ClientOutput[]|null */ #[Groups(['repository:write'])] - #[ApiProperty(description: 'The client to wol')] + #[ApiProperty( + description: 'Los clientes para Wake on LAN', + example: [] + )] public ?array $clients = null; } \ No newline at end of file diff --git a/src/Dto/Output/ClientOutput.php b/src/Dto/Output/ClientOutput.php index bc7ca50..a9d1b9b 100644 --- a/src/Dto/Output/ClientOutput.php +++ b/src/Dto/Output/ClientOutput.php @@ -14,70 +14,150 @@ final class ClientOutput extends AbstractOutput CONST string TYPE = 'client'; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read', 'hardware-profile:read'])] + #[ApiProperty( + description: 'El nombre del cliente', + example: 'PC-Aula-01' + )] public string $name; #[Groups(['client:read', 'organizational-unit:read'])] + #[ApiProperty( + description: 'El tipo de entidad', + example: 'client' + )] public string $type = self::TYPE; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read', 'hardware-profile:read'])] + #[ApiProperty( + description: 'La dirección IP del cliente', + example: '192.168.1.100' + )] public ?string $ip = ''; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read', 'hardware-profile:read'])] + #[ApiProperty( + description: 'La dirección MAC del cliente', + example: '00:1A:2B:3C:4D:5E' + )] public ?string $mac = ''; #[Groups(['client:read'])] + #[ApiProperty( + description: 'El tipo de firmware (BIOS/UEFI)', + example: 'UEFI' + )] public ?string $firmwareType = ''; #[Groups(['client:read', 'organizational-unit:read', 'trace:read'])] + #[ApiProperty( + description: 'El número de serie del cliente', + example: 'SN123456789' + )] public ?string $serialNumber = ''; #[Groups(['client:read'])] + #[ApiProperty( + description: 'La interfaz de red', + example: 'eth0' + )] public ?string $netiface = ''; #[Groups(['client:read'])] + #[ApiProperty( + description: 'El controlador de red', + example: 'e1000' + )] public ?string $netDriver = ''; #[Groups(['client:read'])] - #[ApiProperty(readableLink: true)] + #[ApiProperty( + description: 'La unidad organizativa a la que pertenece el cliente', + readableLink: true + )] public ?OrganizationalUnitOutput $organizationalUnit = null; #[Groups(['client:read'])] + #[ApiProperty( + description: 'Las particiones del disco del cliente', + example: [] + )] public array $partitions = []; #[Groups(['client:read'])] + #[ApiProperty( + description: 'El menú de arranque asignado al cliente', + example: null + )] public ?MenuOutput $menu = null; #[Groups(['client:read'])] - #[ApiProperty(readableLink: true )] + #[ApiProperty( + description: 'El repositorio de imágenes asignado al cliente', + readableLink: true + )] public ?ImageRepositoryOutput $repository = null; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] - #[ApiProperty(readableLink: true )] + #[ApiProperty( + description: 'La plantilla PXE asignada al cliente', + readableLink: true + )] public ?PxeTemplateOutput $pxeTemplate = null; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] - #[ApiProperty(readableLink: true )] + #[ApiProperty( + description: 'La imagen OGLive asignada al cliente', + readableLink: true + )] public ?OgLiveOutput $ogLive = null; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] + #[ApiProperty( + description: 'La subred del cliente en formato CIDR', + example: '192.168.1.0/24' + )] public ?string $subnet = null; #[Groups(['client:read', 'organizational-unit:read'])] + #[ApiProperty( + description: 'La posición del cliente en la interfaz gráfica', + example: ['x' => 100, 'y' => 200] + )] public ?array $position = ['x' => 0, 'y' => 0]; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] + #[ApiProperty( + description: 'El estado actual del cliente', + example: 'online' + )] public ?string $status = ''; #[Groups(['client:read'])] + #[ApiProperty( + description: 'Fecha de creación del cliente', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['client:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] + #[ApiProperty( + description: 'Indica si el cliente está en modo mantenimiento', + example: false + )] public ?bool $maintenance = false; #[Groups(['client:read'])] + #[ApiProperty( + description: 'Indica si la configuración PXE está sincronizada', + example: true + )] public ?bool $pxeSync = false; public function __construct(Client $client) diff --git a/src/Dto/Output/CommandGroupOutput.php b/src/Dto/Output/CommandGroupOutput.php index 617bf79..cf47375 100644 --- a/src/Dto/Output/CommandGroupOutput.php +++ b/src/Dto/Output/CommandGroupOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\Command; use App\Entity\CommandGroup; @@ -11,15 +12,31 @@ use Symfony\Component\Serializer\Annotation\Groups; final class CommandGroupOutput extends AbstractOutput { #[Groups(['command-group:read', 'command-task:read'])] + #[ApiProperty( + description: 'El nombre del grupo de comandos', + example: 'Comandos de sistema' + )] public string $name; #[Groups(['command-group:read', 'command-task:read'])] + #[ApiProperty( + description: 'Los comandos incluidos en el grupo', + example: [] + )] public array $commands = []; #[Groups(['command-group:read'])] + #[ApiProperty( + description: 'Fecha de creación del grupo de comandos', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['command-group:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(CommandGroup $commandGroup) diff --git a/src/Dto/Output/CommandOutput.php b/src/Dto/Output/CommandOutput.php index 0622b70..0832c78 100644 --- a/src/Dto/Output/CommandOutput.php +++ b/src/Dto/Output/CommandOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\Command; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,27 +11,59 @@ use Symfony\Component\Serializer\Annotation\Groups; final class CommandOutput extends AbstractOutput { #[Groups(['command:read', 'command-group:read', 'command-task:read', 'trace:read'])] + #[ApiProperty( + description: 'El nombre del comando', + example: 'Reiniciar sistema' + )] public string $name; #[Groups(['command:read', 'command-group:read', 'command-task:read', 'trace:read'])] + #[ApiProperty( + description: 'El script del comando', + example: 'reboot' + )] public ?string $script = ''; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Indica si el comando es de solo lectura', + example: false + )] public ?bool $readOnly = false; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Indica si el comando está habilitado', + example: true + )] public ?bool $enabled = true; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Indica si el comando acepta parámetros', + example: true + )] public ?bool $parameters = true; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Comentarios sobre el comando', + example: 'Reinicia el equipo de forma controlada' + )] public ?string $comments = ''; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Fecha de creación del comando', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['command:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Command $command) diff --git a/src/Dto/Output/CommandTaskOutput.php b/src/Dto/Output/CommandTaskOutput.php index c6be84f..eb04d38 100644 --- a/src/Dto/Output/CommandTaskOutput.php +++ b/src/Dto/Output/CommandTaskOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\Client; use App\Entity\Command; @@ -13,30 +14,66 @@ use Symfony\Component\Serializer\Annotation\Groups; final class CommandTaskOutput extends AbstractOutput { #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'El nombre de la tarea de comando', + example: 'Actualización nocturna' + )] public ?string $name = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Los clientes asignados a la tarea', + example: [] + )] public array $clients = []; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'La unidad organizativa asociada a la tarea', + example: null + )] public ?OrganizationalUnitOutput $organizationalUnit = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Fecha de la última ejecución', + example: '2024-01-15T02:00:00+00:00' + )] public ?\DateTimeInterface $lastExecution = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Fecha de la próxima ejecución programada', + example: '2024-01-16T02:00:00+00:00' + )] public ?\DateTimeInterface $nextExecution = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Notas adicionales sobre la tarea', + example: 'Ejecutar fuera del horario escolar' + )] public ?string $notes = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'El alcance de la tarea', + example: 'clients' + )] public ?string $scope = null; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Fecha de creación de la tarea', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['command-task:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; diff --git a/src/Dto/Output/CommandTaskScheduleOutput.php b/src/Dto/Output/CommandTaskScheduleOutput.php index 45dcd02..6860aee 100644 --- a/src/Dto/Output/CommandTaskScheduleOutput.php +++ b/src/Dto/Output/CommandTaskScheduleOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\CommandTaskSchedule; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,18 +11,38 @@ use Symfony\Component\Serializer\Annotation\Groups; class CommandTaskScheduleOutput extends AbstractOutput { #[Groups(['command-task-schedule:read'])] + #[ApiProperty( + description: 'El tipo de recurrencia de la programación', + example: 'weekly' + )] public ?string $recurrenceType = null; #[Groups(['command-task-schedule:read'])] + #[ApiProperty( + description: 'La fecha de ejecución programada', + example: '2024-01-20T00:00:00+00:00' + )] public ?\DateTimeInterface $executionDate = null; #[Groups(['command-task-schedule:read'])] + #[ApiProperty( + description: 'La hora de ejecución programada', + example: '2024-01-15T02:00:00+00:00' + )] public ?\DateTimeInterface $executionTime = null; #[Groups(['command-task-schedule:read'])] + #[ApiProperty( + description: 'Los detalles de la recurrencia', + example: ['days' => ['monday', 'wednesday', 'friday']] + )] public ?array $recurrenceDetails = null; #[Groups(['command-task-schedule:read'])] + #[ApiProperty( + description: 'Indica si la programación está habilitada', + example: true + )] public ?bool $enabled = null; public function __construct(?CommandTaskSchedule $commandTaskSchedule = null) diff --git a/src/Dto/Output/CommandTaskScriptOutput.php b/src/Dto/Output/CommandTaskScriptOutput.php index 1354ffc..ce6274d 100644 --- a/src/Dto/Output/CommandTaskScriptOutput.php +++ b/src/Dto/Output/CommandTaskScriptOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\CommandTaskSchedule; use App\Entity\CommandTaskScript; @@ -11,18 +12,38 @@ use Symfony\Component\Serializer\Annotation\Groups; class CommandTaskScriptOutput extends AbstractOutput { #[Groups(['command-task-script:read'])] + #[ApiProperty( + description: 'El contenido del script', + example: '#!/bin/bash\necho "Hello World"' + )] public ?string $content = null; #[Groups(['command-task-script:read'])] + #[ApiProperty( + description: 'El tipo de script', + example: 'bash' + )] public ?string $type = null; #[Groups(['command-task-script:read'])] + #[ApiProperty( + description: 'Los parámetros del script', + example: [] + )] public ?array $parameters = null; #[Groups(['command-task-script:read'])] + #[ApiProperty( + description: 'La tarea de comando asociada', + example: null + )] public ?CommandTaskOutput $commandTaskOutput = null; #[Groups(['command-task-script:read'])] + #[ApiProperty( + description: 'El orden de ejecución del script', + example: 1 + )] public ?int $order = null; public function __construct(?CommandTaskScript $commandTaskScript = null) diff --git a/src/Dto/Output/GitRepositoryOutput.php b/src/Dto/Output/GitRepositoryOutput.php index 9040e0f..3c65e96 100644 --- a/src/Dto/Output/GitRepositoryOutput.php +++ b/src/Dto/Output/GitRepositoryOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\GitRepository; use Symfony\Component\Serializer\Annotation\Groups; @@ -22,6 +23,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'El UUID del repositorio Git', + example: '123e4567-e89b-12d3-a456-426614174000' + )] public string $uuid = ''; /** @@ -31,6 +36,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'El ID del repositorio Git', + example: 1 + )] public int $id = 0; /** @@ -40,6 +49,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'El nombre del repositorio Git', + example: 'mi-repositorio' + )] public string $name = ''; /** @@ -49,6 +62,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'La descripción del repositorio', + example: 'Repositorio para el proyecto principal' + )] public ?string $description = ''; /** @@ -58,6 +75,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'El servidor donde se encuentra el repositorio', + example: null + )] public ?ImageRepositoryOutput $repository = null; /** @@ -67,6 +88,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'Fecha de creación del repositorio', + example: '2024-01-01T00:00:00+00:00' + )] public ?\DateTime $createdAt = null; /** @@ -76,6 +101,10 @@ final class GitRepositoryOutput * ) */ #[Groups(['git-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(GitRepository $gitRepository, array $context = []) diff --git a/src/Dto/Output/HardwareOutput.php b/src/Dto/Output/HardwareOutput.php index 3823f33..39a1d80 100644 --- a/src/Dto/Output/HardwareOutput.php +++ b/src/Dto/Output/HardwareOutput.php @@ -11,19 +11,38 @@ use Symfony\Component\Serializer\Annotation\Groups; final class HardwareOutput extends AbstractOutput { #[Groups(['hardware:read', 'hardware-profile:read'])] + #[ApiProperty( + description: 'El nombre del componente de hardware', + example: 'Intel Core i7-9700K' + )] public string $name; #[Groups(['hardware:read'])] + #[ApiProperty( + description: 'La descripción del componente de hardware', + example: 'Procesador de 8 núcleos a 3.6GHz' + )] public ?string $description = ''; #[Groups(['hardware:read'])] - #[ApiProperty(readableLink: true)] + #[ApiProperty( + description: 'El tipo de hardware', + readableLink: true + )] public ?HardwareTypeOutput $type = null; #[Groups(['hardware:read'])] + #[ApiProperty( + description: 'Fecha de creación del componente de hardware', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['hardware:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Hardware $hardware) diff --git a/src/Dto/Output/HardwareProfileOutput.php b/src/Dto/Output/HardwareProfileOutput.php index 22b73f3..93a3b55 100644 --- a/src/Dto/Output/HardwareProfileOutput.php +++ b/src/Dto/Output/HardwareProfileOutput.php @@ -12,21 +12,45 @@ use Symfony\Component\Serializer\Annotation\Groups; final class HardwareProfileOutput extends AbstractOutput { #[Groups(['hardware-profile:read', 'client:read'])] + #[ApiProperty( + description: 'La descripción del perfil de hardware', + example: 'Perfil de hardware estándar para aula de informática' + )] public ?string $description = ''; #[Groups(['hardware-profile:read'])] + #[ApiProperty( + description: 'Comentarios adicionales sobre el perfil', + example: 'Configuración actualizada en enero 2024' + )] public ?string $comments = ''; #[Groups(['hardware-profile:read'])] + #[ApiProperty( + description: 'El cliente asociado a este perfil de hardware', + example: null + )] public ?ClientOutput $client = null; #[Groups(['hardware-profile:read'])] + #[ApiProperty( + description: 'La colección de componentes de hardware', + example: [] + )] public ?array $hardwareCollection = []; #[Groups(['hardware-profile:read'])] + #[ApiProperty( + description: 'Fecha de creación del perfil de hardware', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['hardware-profile:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(HardwareProfile $hardwareProfile) diff --git a/src/Dto/Output/HardwareTypeOutput.php b/src/Dto/Output/HardwareTypeOutput.php index 9606d3a..023be56 100644 --- a/src/Dto/Output/HardwareTypeOutput.php +++ b/src/Dto/Output/HardwareTypeOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\HardwareType; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,15 +11,31 @@ use Symfony\Component\Serializer\Annotation\Groups; final class HardwareTypeOutput extends AbstractOutput { #[Groups(['hardware-type:read', 'hardware:read'])] + #[ApiProperty( + description: 'El nombre del tipo de hardware', + example: 'Tarjeta de red' + )] public string $name; #[Groups(['hardware-type:read', 'hardware:read'])] + #[ApiProperty( + description: 'La descripción del tipo de hardware', + example: 'Dispositivo de red Ethernet' + )] public ?string $description = null; #[Groups(['hardware-type:read', 'hardware:read'])] + #[ApiProperty( + description: 'El código del tipo de hardware', + example: 'NET' + )] public ?string $code = null; #[Groups(['hardware-type:read', 'hardware:read'])] + #[ApiProperty( + description: 'Fecha de creación del tipo de hardware', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; public function __construct(HardwareType $hardwareType) diff --git a/src/Dto/Output/ImageImageRepositoryOutput.php b/src/Dto/Output/ImageImageRepositoryOutput.php index c23ce24..d4cf4e9 100644 --- a/src/Dto/Output/ImageImageRepositoryOutput.php +++ b/src/Dto/Output/ImageImageRepositoryOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\ImageImageRepository; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,36 +11,80 @@ use Symfony\Component\Serializer\Annotation\Groups; class ImageImageRepositoryOutput extends AbstractOutput { #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'La imagen asociada', + example: null + )] public ?ImageOutput $image = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'El repositorio donde está almacenada la imagen', + example: null + )] public ?ImageRepositoryOutput $imageRepository = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'El estado de la imagen en el repositorio', + example: 'synchronized' + )] public string $status; #[Groups(['image-image-repository:read', 'image:read', 'partition:read', 'client:read'])] + #[ApiProperty( + description: 'El nombre de la imagen', + example: 'Windows10-v1' + )] public string $name; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'La suma de verificación completa de la imagen', + example: 'a1b2c3d4e5f6...' + )] public ?string $imageFullsum = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'Información sobre las particiones de la imagen', + example: [] + )] public ?array $partitionInfo = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'El tamaño de los datos en bytes', + example: '10737418240' + )] public ?string $datasize = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'La descripción de la imagen', + example: 'Imagen base de Windows 10 actualizado' + )] public ?string $description = null; #[Groups(['image:read', 'image-image-repository:read'])] + #[ApiProperty( + description: 'La versión de la imagen', + example: 1 + )] public ?int $version = null; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'Fecha de creación de la relación imagen-repositorio', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['image-image-repository:read', 'image:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(ImageImageRepository $imageImageRepository, array $context = []) diff --git a/src/Dto/Output/ImageOutput.php b/src/Dto/Output/ImageOutput.php index a5cf26f..9e857fc 100644 --- a/src/Dto/Output/ImageOutput.php +++ b/src/Dto/Output/ImageOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\Image; use App\Entity\ImageImageRepository; @@ -13,35 +14,76 @@ use Symfony\Component\Serializer\Annotation\Groups; final class ImageOutput extends AbstractOutput { #[Groups(['image:read', 'image-image-repository:read', 'git-image-repository:read'])] + #[ApiProperty( + description: 'El nombre de la imagen', + example: 'Windows 10 Pro' + )] public ?string $name = ''; + #[Groups(['image:read', 'image-image-repository:read'])] + #[ApiProperty( + description: 'Indica si es una imagen de PC remoto', + example: false + )] public ?bool $remotePc = null; #[Groups(['image:read', 'image-image-repository:read'])] + #[ApiProperty( + description: 'Indica si la imagen es global', + example: true + )] public ?bool $isGlobal = null; #[Groups(['image:read', 'image-image-repository:read'])] + #[ApiProperty( + description: 'El tipo de imagen', + example: 'basic' + )] public ?string $type = ''; #[Groups(['image:read'])] + #[ApiProperty( + description: 'El perfil de software asociado a la imagen', + example: null + )] public ?SoftwareProfileOutput $softwareProfile = null; /** * @var ImageRepositoryOutput[]|null */ #[Groups(['image:read'])] + #[ApiProperty( + description: 'Los repositorios donde está almacenada la imagen', + example: [] + )] public ?array $imageRepositories = []; #[Groups(['image:read'])] + #[ApiProperty( + description: 'Información sobre las particiones de la imagen', + example: [] + )] public ?array $partitionInfo = null; #[Groups(['image:read', 'image-image-repository:read'])] + #[ApiProperty( + description: 'La versión de la imagen', + example: 1 + )] public ?int $version = null; #[Groups(['image:read'])] + #[ApiProperty( + description: 'Fecha de creación de la imagen', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['image:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Image $image) diff --git a/src/Dto/Output/ImageRepositoryOutput.php b/src/Dto/Output/ImageRepositoryOutput.php index 44445b6..876919c 100644 --- a/src/Dto/Output/ImageRepositoryOutput.php +++ b/src/Dto/Output/ImageRepositoryOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\ImageRepository; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,24 +11,52 @@ use Symfony\Component\Serializer\Annotation\Groups; class ImageRepositoryOutput extends AbstractOutput { #[Groups(['repository:read', 'image:read', 'client:read', "organizational-unit:read", "image-image-repository:read"])] + #[ApiProperty( + description: 'El nombre del repositorio de imágenes', + example: 'Repositorio Principal' + )] public ?string $name = ''; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'La dirección IP del servidor del repositorio', + example: '192.168.1.50' + )] public ?string $ip = ''; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'Comentarios sobre el repositorio', + example: 'Servidor principal de almacenamiento de imágenes' + )] public ?string $comments = ''; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'El puerto SSH del servidor', + example: '22' + )] public ?string $sshPort = ''; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'El usuario SSH para acceder al repositorio', + example: 'opengnsys' + )] public ?string $user = ''; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'Fecha de creación del repositorio', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['repository:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(ImageRepository $imageRepository, bool $status = true) diff --git a/src/Dto/Output/MenuOutput.php b/src/Dto/Output/MenuOutput.php index 1a81def..661c766 100644 --- a/src/Dto/Output/MenuOutput.php +++ b/src/Dto/Output/MenuOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\HardwareProfile; use App\Entity\Menu; @@ -11,27 +12,59 @@ use Symfony\Component\Serializer\Annotation\Groups; final class MenuOutput extends AbstractOutput { #[Groups(['menu:read', 'organizational-unit:read'])] + #[ApiProperty( + description: 'El nombre del menú de arranque', + example: 'Menú Principal' + )] public string $name; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'La resolución del menú', + example: '1024x768' + )] public string $resolution; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'Comentarios sobre el menú', + example: 'Menú de arranque predeterminado para todas las aulas' + )] public ?string $comments = null; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'URL pública del menú', + example: 'https://example.com/menu/public' + )] public ?string $publicUrl = null; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'URL privada del menú', + example: 'https://example.com/menu/private' + )] public ?string $privateUrl = null; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'Indica si es el menú predeterminado', + example: true + )] public ?bool $isDefault = false; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'Fecha de creación del menú', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['menu:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Menu $menu) diff --git a/src/Dto/Output/NetworkSettingsOutput.php b/src/Dto/Output/NetworkSettingsOutput.php index 329cede..d433c8f 100644 --- a/src/Dto/Output/NetworkSettingsOutput.php +++ b/src/Dto/Output/NetworkSettingsOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\NetworkSettings; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,69 +11,157 @@ use Symfony\Component\Serializer\Annotation\Groups; final class NetworkSettingsOutput extends AbstractOutput { #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección del servidor TFTP siguiente', + example: '192.168.1.10' + )] public ?string $nextServer = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El nombre del archivo de arranque', + example: 'pxelinux.0' + )] public ?string $bootFileName = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección del servidor proxy', + example: 'http://proxy.example.com:8080' + )] public ?string $proxy = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección del servidor DNS', + example: '8.8.8.8' + )] public ?string $dns = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La máscara de subred', + example: '255.255.255.0' + )] public ?string $netmask = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección del router/gateway', + example: '192.168.1.1' + )] public ?string $router = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección del servidor NTP', + example: 'time.google.com' + )] public ?string $ntp = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La interfaz de red', + example: 'eth0' + )] public ?string $netiface = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El modo de transferencia punto a punto', + example: 'full' + )] public ?string $p2pMode = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'Tiempo de transferencia P2P en segundos', + example: 300 + )] public ?int $p2pTime = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La dirección IP multicast', + example: '239.194.2.11' + )] public ?string $mcastIp = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La velocidad multicast en Mbps', + example: 100 + )] public ?int $mcastSpeed = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El puerto multicast', + example: 9000 + )] public ?int $mcastPort = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El modo multicast', + example: 'full-duplex' + )] public ?string $mcastMode = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El menú de arranque configurado', + example: null + )] public ?MenuOutput $menu = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El perfil de hardware configurado', + example: null + )] public ?HardwareProfileOutput $hardwareProfile = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La imagen OGLive configurada', + example: null + )] public ?OgLiveOutput $ogLive = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'El repositorio de imágenes configurado', + example: null + )] public ?ImageRepositoryOutput $repository = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La plantilla PXE configurada', + example: null + )] public ?PxeTemplateOutput $pxeTemplate = null; #[Groups(['network-settings:read', "organizational-unit:read", "client:read"])] + #[ApiProperty( + description: 'La ruta compartida de OGAgent', + example: '/opt/opengnsys/ogshare' + )] public ?string $ogshare = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Fecha de creación de la configuración de red', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(NetworkSettings $networkSettings) diff --git a/src/Dto/Output/OgLiveOutput.php b/src/Dto/Output/OgLiveOutput.php index 44f0b53..04e846d 100644 --- a/src/Dto/Output/OgLiveOutput.php +++ b/src/Dto/Output/OgLiveOutput.php @@ -11,48 +11,108 @@ use Symfony\Component\Serializer\Annotation\Groups; final class OgLiveOutput extends AbstractOutput { #[Groups(['og-live:read', 'client:read', "organizational-unit:read"])] + #[ApiProperty( + description: 'El nombre de la imagen OGLive', + example: 'ogLive-5.2.0' + )] public ?string $name = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Indica si la imagen está sincronizada', + example: true + )] public ?bool $synchronized = false; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Indica si la imagen está instalada', + example: true + )] public ?bool $installed = false; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Indica si es la imagen OGLive predeterminada', + example: true + )] public ?bool $isDefault = false; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'URL de descarga de la imagen', + example: 'https://opengnsys.es/svn/branches/version1.1/installer/ogLive-5.2.0-r6374.iso' + )] public ?string $downloadUrl = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'El estado de la imagen', + example: 'synchronized' + )] public ?string $status = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Suma de verificación de la imagen', + example: 'a1b2c3d4e5f6...' + )] public ?string $checksum = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'La distribución de Linux', + example: 'Ubuntu' + )] public ?string $distribution = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'La revisión de la imagen', + example: 'r6374' + )] public ?string $revision = ''; #[Groups(['og-live:read', 'client:read', "organizational-unit:read"])] + #[ApiProperty( + description: 'El nombre del archivo de la imagen', + example: 'ogLive-5.2.0-r6374.iso' + )] public ?string $filename = null; #[Groups(['og-live:read', 'client:read', "organizational-unit:read"])] + #[ApiProperty( + description: 'La versión del kernel', + example: '5.4.0-42-generic' + )] public ?string $kernel = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'La arquitectura del sistema', + example: 'amd64' + )] public ?string $architecture = ''; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Fecha de creación del registro', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['og-live:read', 'client:read', "organizational-unit:read"])] + #[ApiProperty( + description: 'Fecha de la imagen', + example: '2024-01-10T00:00:00+00:00' + )] public ?\DateTimeInterface $date; #[Groups(['og-live:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(OgLive $ogLive) diff --git a/src/Dto/Output/OperativeSystemOutput.php b/src/Dto/Output/OperativeSystemOutput.php index fac3ef1..7cd46bb 100644 --- a/src/Dto/Output/OperativeSystemOutput.php +++ b/src/Dto/Output/OperativeSystemOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\OperativeSystem; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,12 +11,24 @@ use Symfony\Component\Serializer\Annotation\Groups; final class OperativeSystemOutput extends AbstractOutput { #[Groups(['operative-system:read', 'partition:read', 'software-profile:read', 'client:read'])] + #[ApiProperty( + description: 'El nombre del sistema operativo', + example: 'Windows 10 Pro' + )] public string $name; #[Groups(['operative-system:read'])] + #[ApiProperty( + description: 'Fecha de creación del sistema operativo', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['operative-system:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(OperativeSystem $operativeSystem) diff --git a/src/Dto/Output/OrganizationalUnitOutput.php b/src/Dto/Output/OrganizationalUnitOutput.php index d3705bd..290f0ad 100644 --- a/src/Dto/Output/OrganizationalUnitOutput.php +++ b/src/Dto/Output/OrganizationalUnitOutput.php @@ -12,59 +12,129 @@ use Symfony\Component\Serializer\Annotation\Groups; final class OrganizationalUnitOutput extends AbstractOutput { #[Groups(['organizational-unit:read', "client:read", "user:read", 'organizational-unit:read:collection:short', 'software-profile:read', 'command-task:read'])] + #[ApiProperty( + description: 'El nombre de la unidad organizativa', + example: 'Aula 1' + )] public string $name; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Comentarios adicionales', + example: 'Aula de informática equipada con 30 equipos' + )] public ?string $comments = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'La descripción de la unidad organizativa', + example: 'Aula de informática principal' + )] public ?string $description = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'La ubicación física', + example: 'Planta baja, edificio A' + )] public ?string $location = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Indica si tiene proyector', + example: true + )] public ?bool $projector = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Indica si tiene pizarra digital', + example: false + )] public ?bool $board = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'La capacidad de la unidad organizativa', + example: 30 + )] public ?int $capacity = null; #[Groups(['organizational-unit:read', "client:read"])] + #[ApiProperty( + description: 'El tipo de unidad organizativa', + example: 'aula' + )] public string $type; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'La unidad organizativa padre', + example: null + )] public ?self $parent = null; #[Groups(['organizational-unit:read', 'client:read', 'organizational-unit:read:collection:short'])] + #[ApiProperty( + description: 'La ruta completa de la unidad organizativa', + example: '/Edificio A/Planta Baja/Aula 1' + )] public string $path; #[Groups(['organizational-unit:read', "client:read"])] - #[ApiProperty(readableLink: true)] + #[ApiProperty( + description: 'La configuración de red de la unidad organizativa', + readableLink: true + )] public ?NetworkSettingsOutput $networkSettings = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Las unidades organizativas hijas', + example: [] + )] public array $children = []; #[Groups(['organizational-unit:read', "client:read"])] - #[ApiProperty(readableLink: true)] + #[ApiProperty( + description: 'El calendario remoto asociado', + readableLink: true + )] public ?RemoteCalendarOutput $remoteCalendar = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Indica si es un PC remoto', + example: false + )] public ?bool $remotePc = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Indica si está disponible según el calendario', + example: true + )] public ?bool $available = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Indica si excluye cambios del padre', + example: false + )] public ?bool $excludeParentChanges = null; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Fecha de creación de la unidad organizativa', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['organizational-unit:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(OrganizationalUnit $organizationalUnit, array $context = []) diff --git a/src/Dto/Output/PartitionOutput.php b/src/Dto/Output/PartitionOutput.php index 394abcb..76e55e2 100644 --- a/src/Dto/Output/PartitionOutput.php +++ b/src/Dto/Output/PartitionOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\ImageImageRepository; use App\Entity\Partition; @@ -11,30 +12,66 @@ use Symfony\Component\Serializer\Annotation\Groups; class PartitionOutput extends AbstractOutput { #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El número del disco', + example: 1 + )] public ?int $diskNumber = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El número de la partición', + example: 1 + )] public ?int $partitionNumber = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El código del tipo de partición', + example: '83' + )] public ?string $partitionCode = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El tamaño de la partición en MB', + example: 51200 + )] public ?int $size = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El contenido de la caché', + example: 'system' + )] public ?string $cacheContent = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El sistema de archivos', + example: 'ext4' + )] public ?string $filesystem = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El sistema operativo instalado en la partición', + example: null + )] public ?OperativeSystemOutput $operativeSystem = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'La imagen asociada a la partición', + example: null + )] public ?ImageImageRepositoryOutput $image = null; #[Groups(['partition:read', 'client:read'])] + #[ApiProperty( + description: 'El porcentaje de uso de memoria', + example: 45 + )] public ?int $memoryUsage = null; public function __construct(Partition $partition) diff --git a/src/Dto/Output/PxeTemplateOutput.php b/src/Dto/Output/PxeTemplateOutput.php index f625215..87c3578 100644 --- a/src/Dto/Output/PxeTemplateOutput.php +++ b/src/Dto/Output/PxeTemplateOutput.php @@ -12,24 +12,52 @@ use Symfony\Component\Serializer\Annotation\Groups; final class PxeTemplateOutput extends AbstractOutput { #[Groups(['pxe-template:read', 'client:read', 'organizational-unit:read'])] + #[ApiProperty( + description: 'El nombre de la plantilla PXE', + example: 'Plantilla BIOS' + )] public string $name; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'Indica si la plantilla está sincronizada', + example: true + )] public ?bool $synchronized = null; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'El contenido de la plantilla PXE', + example: 'DEFAULT ogLive\nPROMPT 0\nTIMEOUT 0...' + )] public ?string $templateContent = ''; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'Indica si es la plantilla predeterminada', + example: true + )] public ?bool $isDefault = null; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'El número de clientes que usan esta plantilla', + example: 15 + )] public ?int $clientsLength = 0; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'Fecha de creación de la plantilla', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['pxe-template:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(PxeTemplate $pxeTemplate) diff --git a/src/Dto/Output/RemoteCalendarOutput.php b/src/Dto/Output/RemoteCalendarOutput.php index b079f8a..52d80b7 100644 --- a/src/Dto/Output/RemoteCalendarOutput.php +++ b/src/Dto/Output/RemoteCalendarOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\RemoteCalendar; use App\Entity\RemoteCalendarRule; @@ -11,15 +12,27 @@ use Symfony\Component\Serializer\Annotation\Groups; final class RemoteCalendarOutput extends AbstractOutput { #[Groups(['remote-calendar:read', 'organizational-unit:read'])] + #[ApiProperty( + description: 'El nombre del calendario remoto', + example: 'Horario Escolar' + )] public ?string $name = null; /** * @var RemoteCalendarRuleOutput[] */ #[Groups(['remote-calendar:read'])] + #[ApiProperty( + description: 'Las reglas del calendario remoto', + example: [] + )] public array $remoteCalendarRules = []; #[Groups(['remote-calendar:read'])] + #[ApiProperty( + description: 'Fecha de creación del calendario', + example: '2024-01-15T10:30:00+00:00' + )] public ?\DateTimeInterface $createdAt = null; public function __construct(RemoteCalendar $remoteCalendar) diff --git a/src/Dto/Output/RemoteCalendarRuleOutput.php b/src/Dto/Output/RemoteCalendarRuleOutput.php index 9617599..894498e 100644 --- a/src/Dto/Output/RemoteCalendarRuleOutput.php +++ b/src/Dto/Output/RemoteCalendarRuleOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\RemoteCalendarRule; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,24 +11,52 @@ use Symfony\Component\Serializer\Annotation\Groups; final class RemoteCalendarRuleOutput extends AbstractOutput { #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Los días de la semana ocupados', + example: ['monday', 'wednesday', 'friday'] + )] public ?array $busyWeekDays = null; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Hora de inicio del periodo ocupado', + example: '08:00' + )] public ?string $busyFromHour = null; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Hora de fin del periodo ocupado', + example: '14:00' + )] public ?string $busyToHour = null; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Indica si está disponible para acceso remoto', + example: true + )] public ?bool $isRemoteAvailable = false; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Fecha desde la que está disponible', + example: '2024-01-15T00:00:00+00:00' + )] public ?\DateTimeInterface $availableFromDate = null; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'Fecha hasta la que está disponible', + example: '2024-06-30T23:59:59+00:00' + )] public ?\DateTimeInterface $availableToDate = null; #[Groups(['remote-calendar-rule:read', 'remote-calendar:read'])] + #[ApiProperty( + description: 'El motivo de la disponibilidad', + example: 'Periodo lectivo' + )] public ?string $availableReason = null; public function __construct(RemoteCalendarRule $remoteCalendarRule) diff --git a/src/Dto/Output/SoftwareOutput.php b/src/Dto/Output/SoftwareOutput.php index 20da642..cf84134 100644 --- a/src/Dto/Output/SoftwareOutput.php +++ b/src/Dto/Output/SoftwareOutput.php @@ -11,18 +11,38 @@ use Symfony\Component\Serializer\Annotation\Groups; final class SoftwareOutput extends AbstractOutput { #[Groups(['software:read', 'software-profile:read'])] + #[ApiProperty( + description: 'El nombre del software', + example: 'Microsoft Office 2019' + )] public string $name; #[Groups(['software:read'])] + #[ApiProperty( + description: 'La descripción del software', + example: 'Suite de oficina completa' + )] public ?string $description = ''; #[Groups(['software:read', 'software-profile:read'])] + #[ApiProperty( + description: 'El tipo de software', + example: 'productivity' + )] public ?string $type = ''; #[Groups(['software:read'])] + #[ApiProperty( + description: 'Fecha de creación del software', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['software:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Software $software) diff --git a/src/Dto/Output/SoftwareProfileOutput.php b/src/Dto/Output/SoftwareProfileOutput.php index 1b2f423..b3945bf 100644 --- a/src/Dto/Output/SoftwareProfileOutput.php +++ b/src/Dto/Output/SoftwareProfileOutput.php @@ -12,24 +12,52 @@ use Symfony\Component\Serializer\Annotation\Groups; final class SoftwareProfileOutput extends AbstractOutput { #[Groups(['software-profile:read', 'image:read'])] + #[ApiProperty( + description: 'La descripción del perfil de software', + example: 'Perfil estándar para aula de informática' + )] public ?string $description = ''; #[Groups(['software-profile:read'])] + #[ApiProperty( + description: 'Comentarios adicionales sobre el perfil', + example: 'Incluye software educativo básico' + )] public ?string $comments = ''; #[Groups(['software-profile:read'])] + #[ApiProperty( + description: 'La unidad organizativa asociada', + example: null + )] public ?OrganizationalUnitOutput $organizationalUnit = null; #[Groups(['software-profile:read'])] + #[ApiProperty( + description: 'El sistema operativo base del perfil', + example: null + )] public ?OperativeSystemOutput $operativeSystem = null; #[Groups(['software-profile:item:get'])] + #[ApiProperty( + description: 'La colección de software incluido en el perfil', + example: [] + )] public ?array $softwareCollection = []; #[Groups(['software-profile:read'])] + #[ApiProperty( + description: 'Fecha de creación del perfil de software', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['software-profile:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(SoftwareProfile $softwareProfile) diff --git a/src/Dto/Output/SubnetOutput.php b/src/Dto/Output/SubnetOutput.php index 672e6d1..7ac8868 100644 --- a/src/Dto/Output/SubnetOutput.php +++ b/src/Dto/Output/SubnetOutput.php @@ -13,36 +13,80 @@ use Symfony\Component\Serializer\Annotation\Groups; final class SubnetOutput extends AbstractOutput { #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'El nombre de la subred', + example: 'Subred Principal' + )] public string $name; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'La máscara de subred', + example: '255.255.255.0' + )] public string $netmask; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'La dirección IP de la subred', + example: '192.168.1.0' + )] public string $ipAddress; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'La dirección del servidor TFTP siguiente', + example: '192.168.1.10' + )] public ?string $nextServer = null; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'El nombre del archivo de arranque', + example: 'pxelinux.0' + )] public ?string $bootFileName = null; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'La dirección del router/gateway', + example: '192.168.1.1' + )] public ?string $router = null; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'La dirección del servidor DNS', + example: '8.8.8.8' + )] public ?string $dns = null; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'Indica si la subred está sincronizada', + example: true + )] public ?bool $synchronized = false; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'El ID del servidor DHCP', + example: 1 + )] public ?int $serverId; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'Fecha de creación de la subred', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['subnet:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Subnet $subnet) diff --git a/src/Dto/Output/TraceOutput.php b/src/Dto/Output/TraceOutput.php index 94bd188..21f3214 100644 --- a/src/Dto/Output/TraceOutput.php +++ b/src/Dto/Output/TraceOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\Menu; use App\Entity\Trace; @@ -11,36 +12,80 @@ use Symfony\Component\Serializer\Annotation\Groups; final class TraceOutput extends AbstractOutput { #[Groups(['trace:read'])] + #[ApiProperty( + description: 'El comando ejecutado', + example: 'Reiniciar sistema' + )] public ?string $command; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'El cliente sobre el que se ejecutó el comando', + example: null + )] public ?ClientOutput $client = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'El estado de la traza', + example: 'completed' + )] public string $status; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'El ID del trabajo asociado', + example: 'job-12345' + )] public ?string $jobId = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'Fecha de ejecución del comando', + example: '2024-01-15T10:30:00+00:00' + )] public ?\DateTimeInterface $executedAt = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'La salida del comando ejecutado', + example: 'Sistema reiniciado correctamente' + )] public ?string $output = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'Los parámetros de entrada del comando', + example: [] + )] public ?array $input = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'Fecha de finalización del comando', + example: '2024-01-15T10:31:00+00:00' + )] public ?\DateTimeInterface $finishedAt = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'El progreso de ejecución (0.0 a 1.0)', + example: 1.0 + )] public ?float $progress = null; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'Fecha de creación de la traza', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['trace:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(Trace $trace) diff --git a/src/Dto/Output/UserGroupOutput.php b/src/Dto/Output/UserGroupOutput.php index 3892d4b..22e0a81 100644 --- a/src/Dto/Output/UserGroupOutput.php +++ b/src/Dto/Output/UserGroupOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\User; use App\Entity\UserGroup; @@ -11,18 +12,38 @@ use Symfony\Component\Serializer\Annotation\Groups; final class UserGroupOutput extends AbstractOutput { #[Groups(['user-group:read', 'user:read'])] + #[ApiProperty( + description: 'El nombre del grupo de usuarios', + example: 'Administradores' + )] public string $name; #[Groups(['user-group:read'])] + #[ApiProperty( + description: 'Los permisos asignados al grupo', + example: ['clients.read', 'clients.write', 'images.read'] + )] public array $permissions; #[Groups(['user-group:read'])] + #[ApiProperty( + description: 'Indica si el grupo está habilitado', + example: true + )] public bool $enabled; #[Groups(['user-group:read'])] + #[ApiProperty( + description: 'Fecha de creación del grupo de usuarios', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['user-group:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(UserGroup $userGroup) diff --git a/src/Dto/Output/UserOutput.php b/src/Dto/Output/UserOutput.php index afa038f..c67c8fc 100644 --- a/src/Dto/Output/UserOutput.php +++ b/src/Dto/Output/UserOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\OrganizationalUnit; use App\Entity\User; @@ -12,24 +13,59 @@ use Symfony\Component\Serializer\Annotation\Groups; final class UserOutput extends AbstractOutput { #[Groups(['user:read'])] + #[ApiProperty( + description: 'El nombre de usuario', + example: 'admin' + )] public string $username; #[Groups(['user:read'])] + #[ApiProperty( + description: 'Los roles asignados al usuario', + example: ['ROLE_USER', 'ROLE_ADMIN'] + )] public array $roles; #[Groups(['user:read'])] + #[ApiProperty( + description: 'Indica si el usuario está habilitado', + example: true + )] public bool $enabled; + #[Groups(['user:read'])] + #[ApiProperty( + description: 'Las unidades organizativas permitidas para el usuario', + example: [] + )] public array $allowedOrganizationalUnits; + #[Groups(['user:read'])] + #[ApiProperty( + description: 'Los grupos de usuario asignados', + example: [] + )] public array $userGroups; + #[Groups(['user:read'])] + #[ApiProperty( + description: 'La vista por defecto de grupos para el usuario', + example: 'card' + )] public ?string $groupsView = 'card'; #[Groups(['user:read'])] + #[ApiProperty( + description: 'Fecha de creación del usuario', + example: '2024-01-15T10:30:00+00:00' + )] public \DateTime $createdAt; #[Groups(['user:read'])] + #[ApiProperty( + description: 'Usuario que creó este registro', + example: 'admin' + )] public ?string $createdBy = null; public function __construct(User $user) diff --git a/src/Dto/Output/ViewOutput.php b/src/Dto/Output/ViewOutput.php index e2f17bb..d8a9837 100644 --- a/src/Dto/Output/ViewOutput.php +++ b/src/Dto/Output/ViewOutput.php @@ -2,6 +2,7 @@ namespace App\Dto\Output; +use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; use App\Entity\View; use Symfony\Component\Serializer\Annotation\Groups; @@ -10,12 +11,24 @@ use Symfony\Component\Serializer\Annotation\Groups; final class ViewOutput extends AbstractOutput { #[Groups(['view:read'])] + #[ApiProperty( + description: 'El nombre de la vista', + example: 'Mi Vista Personalizada' + )] public string $name; #[Groups(['view:read'])] + #[ApiProperty( + description: 'Indica si es una vista favorita', + example: true + )] public bool $favorite; #[Groups(['view:read'])] + #[ApiProperty( + description: 'Los filtros aplicados en la vista', + example: [] + )] public ?array $filters = null; public function __construct(View $view) diff --git a/src/Factory/ClientFactory.php b/src/Factory/ClientFactory.php index b8f4b89..902955c 100644 --- a/src/Factory/ClientFactory.php +++ b/src/Factory/ClientFactory.php @@ -3,6 +3,7 @@ namespace App\Factory; use App\Entity\Client; +use App\Model\OrganizationalUnitTypes; use Zenstruck\Foundry\ModelFactory; use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; @@ -33,6 +34,7 @@ final class ClientFactory extends ModelFactory 'name' => self::faker()->text(255), 'updatedAt' => self::faker()->dateTime(), 'maintenance' => self::faker()->boolean(), + 'organizationalUnit' => OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT])->_save(), ]; } diff --git a/src/Factory/HardwareProfileFactory.php b/src/Factory/HardwareProfileFactory.php index fe3148b..13021dc 100644 --- a/src/Factory/HardwareProfileFactory.php +++ b/src/Factory/HardwareProfileFactory.php @@ -38,7 +38,7 @@ final class HardwareProfileFactory extends ModelFactory 'createdAt' => self::faker()->dateTime(), 'updatedAt' => self::faker()->dateTime(), 'description' => self::faker()->text(255), - 'organizationalUnit' => OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT])->_save(), + 'client' => ClientFactory::new(), ]; } diff --git a/tests/Functional/ClientTest.php b/tests/Functional/ClientTest.php index c09b047..20efdda 100644 --- a/tests/Functional/ClientTest.php +++ b/tests/Functional/ClientTest.php @@ -3,17 +3,10 @@ namespace Functional; use App\Entity\Client; -use App\Entity\HardwareProfile; -use App\Entity\HardwareType; use App\Entity\OrganizationalUnit; -use App\Entity\User; -use App\Entity\UserGroup; use App\Factory\ClientFactory; -use App\Factory\HardwareProfileFactory; -use App\Factory\HardwareTypeFactory; use App\Factory\OrganizationalUnitFactory; use App\Factory\UserFactory; -use App\Factory\UserGroupFactory; use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; @@ -29,7 +22,6 @@ class ClientTest extends AbstractTest CONST string CLIENT_CREATE = 'test-client-create'; CONST string CLIENT_UPDATE = 'test-client-update'; CONST string CLIENT_DELETE = 'test-client-delete'; - const string HW_PROFILE = 'HW Test'; /** * @throws RedirectionExceptionInterface @@ -71,13 +63,9 @@ class ClientTest extends AbstractTest OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); $ouIri = $this->findIriBy(OrganizationalUnit::class, ['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); - HardwareProfileFactory::createOne(['description' => self::HW_PROFILE]); - $hpIri = $this->findIriBy(HardwareProfile::class, ['description' => self::HW_PROFILE]); - $this->createClientWithCredentials()->request('POST', '/clients',['json' => [ 'name' => self::CLIENT_CREATE, 'organizationalUnit' => $ouIri, - 'hardwareProfile' => $hpIri, 'serialNumber' => '123abc', ]]); @@ -103,9 +91,8 @@ class ClientTest extends AbstractTest UserFactory::createOne(['username' => self::USER_ADMIN, 'roles'=> [UserGroupPermissions::ROLE_SUPER_ADMIN]]); $ou = OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); - $hp = HardwareProfileFactory::createOne(['description' => self::HW_PROFILE]); - ClientFactory::createOne(['name' => self::CLIENT_UPDATE, 'serialNumber' => '123abc', 'organizationalUnit' => $ou, 'hardwareProfile' => $hp]); + ClientFactory::createOne(['name' => self::CLIENT_UPDATE, 'serialNumber' => '123abc', 'organizationalUnit' => $ou]); $iri = $this->findIriBy(Client::class, ['name' => self::CLIENT_UPDATE]); $this->createClientWithCredentials()->request('PUT', $iri, ['json' => [ @@ -133,9 +120,8 @@ class ClientTest extends AbstractTest UserFactory::createOne(['username' => self::USER_ADMIN, 'roles'=> [UserGroupPermissions::ROLE_SUPER_ADMIN]]); $ou = OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); - $hp = HardwareProfileFactory::createOne(['description' => self::HW_PROFILE]); - ClientFactory::createOne(['name' => self::CLIENT_DELETE, 'serialNumber' => '123abc', 'organizationalUnit' => $ou, 'hardwareProfile' => $hp]); + ClientFactory::createOne(['name' => self::CLIENT_DELETE, 'serialNumber' => '123abc', 'organizationalUnit' => $ou]); $iri = $this->findIriBy(Client::class, ['name' => self::CLIENT_DELETE]); $this->createClientWithCredentials()->request('DELETE', $iri); diff --git a/tests/Functional/HardwareProfileTest.php b/tests/Functional/HardwareProfileTest.php index 6d710b8..c4833aa 100644 --- a/tests/Functional/HardwareProfileTest.php +++ b/tests/Functional/HardwareProfileTest.php @@ -3,12 +3,11 @@ namespace Functional; +use App\Entity\Client; use App\Entity\HardwareProfile; -use App\Entity\OrganizationalUnit; +use App\Factory\ClientFactory; use App\Factory\HardwareProfileFactory; -use App\Factory\OrganizationalUnitFactory; use App\Factory\UserFactory; -use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; @@ -59,12 +58,12 @@ class HardwareProfileTest extends AbstractTest { UserFactory::createOne(['username' => self::USER_ADMIN, 'roles'=> [UserGroupPermissions::ROLE_SUPER_ADMIN]]); - OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); - $ouIri = $this->findIriBy(OrganizationalUnit::class, ['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT]); + ClientFactory::createOne(['name' => 'test-client']); + $clientIri = $this->findIriBy(Client::class, ['name' => 'test-client']); $this->createClientWithCredentials()->request('POST', '/hardware-profiles',['json' => [ 'description' => self::HW_PROFILE_CREATE, - 'organizationalUnit' => $ouIri + 'client' => $clientIri ]]); $this->assertResponseStatusCodeSame(201); diff --git a/tests/Functional/ImageRepositoryTest.php b/tests/Functional/ImageRepositoryTest.php index da616c6..0bdce48 100644 --- a/tests/Functional/ImageRepositoryTest.php +++ b/tests/Functional/ImageRepositoryTest.php @@ -2,19 +2,9 @@ namespace Functional; -use App\Entity\Client; -use App\Entity\HardwareProfile; use App\Entity\ImageRepository; -use App\Entity\Menu; -use App\Entity\OrganizationalUnit; -use App\Entity\User; -use App\Factory\ClientFactory; -use App\Factory\HardwareProfileFactory; use App\Factory\ImageRepositoryFactory; -use App\Factory\MenuFactory; -use App\Factory\OrganizationalUnitFactory; use App\Factory\UserFactory; -use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; diff --git a/tests/Functional/MenuTest.php b/tests/Functional/MenuTest.php index ffdd305..8154c56 100644 --- a/tests/Functional/MenuTest.php +++ b/tests/Functional/MenuTest.php @@ -2,17 +2,9 @@ namespace Functional; -use App\Entity\Client; -use App\Entity\HardwareProfile; use App\Entity\Menu; -use App\Entity\OrganizationalUnit; -use App\Entity\User; -use App\Factory\ClientFactory; -use App\Factory\HardwareProfileFactory; use App\Factory\MenuFactory; -use App\Factory\OrganizationalUnitFactory; use App\Factory\UserFactory; -use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; diff --git a/tests/Functional/OgLiveTest.php b/tests/Functional/OgLiveTest.php index 883b9a1..01e9834 100644 --- a/tests/Functional/OgLiveTest.php +++ b/tests/Functional/OgLiveTest.php @@ -2,11 +2,7 @@ namespace Functional; -use App\Entity\Client; -use App\Entity\HardwareProfile; use App\Entity\OgLive; -use App\Entity\User; -use App\Factory\HardwareProfileFactory; use App\Factory\OgLiveFactory; use App\Factory\UserFactory; use App\Model\OgLiveStatus; diff --git a/tests/Functional/PartitionTest.php b/tests/Functional/PartitionTest.php index 859bba0..4168a8c 100644 --- a/tests/Functional/PartitionTest.php +++ b/tests/Functional/PartitionTest.php @@ -2,20 +2,9 @@ namespace Functional; -use App\Entity\Client; -use App\Entity\Image; -use App\Entity\Menu; -use App\Entity\OperativeSystem; use App\Entity\Partition; -use App\Factory\ClientFactory; -use App\Factory\HardwareProfileFactory; -use App\Factory\ImageFactory; -use App\Factory\MenuFactory; -use App\Factory\OperativeSystemFactory; -use App\Factory\OrganizationalUnitFactory; use App\Factory\PartitionFactory; use App\Factory\UserFactory; -use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; @@ -27,9 +16,6 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; class PartitionTest extends AbstractTest { CONST string USER_ADMIN = 'ogadmin'; - CONST string CLIENT_CREATE = 'test-client-create'; - - const string HW_PROFILE = 'HW Test'; /** * @throws RedirectionExceptionInterface diff --git a/tests/Functional/ViewTest.php b/tests/Functional/ViewTest.php index 5a0b016..ccdd769 100644 --- a/tests/Functional/ViewTest.php +++ b/tests/Functional/ViewTest.php @@ -3,14 +3,9 @@ namespace Functional; -use App\Entity\HardwareProfile; -use App\Entity\OrganizationalUnit; use App\Entity\View; -use App\Factory\HardwareProfileFactory; -use App\Factory\OrganizationalUnitFactory; use App\Factory\UserFactory; use App\Factory\ViewFactory; -use App\Model\OrganizationalUnitTypes; use App\Model\UserGroupPermissions; use Symfony\Component\HttpFoundation\Response; use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;