About arc42
arc42, the template for documentation of software and system architecture.
Template Version 8.2 EN. (based upon AsciiDoc version), January 2023
Created, maintained and © by Dr. Peter Hruschka, Dr. Gernot Starke and contributors. See https://arc42.org.
1. Introduction and Goals
El proyecto Yovi es una propuesta planteada por la empresa de desarrollo de videojuegos Micrati, cuyo objetivo es desarrollar una aplicación web para jugar al juego Y, permitiendo tanto la interacción de usuarios humanos como la integración de bots mediante una API externa.
1.1. Participantes
El equipo está formado por:
-
Pablo García Menéndez, UO299834
-
Elías Fernández Medina, UO299673
-
Sergio Espina Marcos, UO301107
-
Adrián Pérez Menéndez, UO201188
1.2. Requirements Overview
Los requisitos del proyecto Yovi son los siguientes:
-
Los usuarios podrán jugar partidas desde la web al juego Y, al menos a la versión clásica del juego y contra una máquina.
-
Los usuarios podrán elegir el tamaño del tablero, así como la estrategia que el bot rival empleará.
-
Los usuarios podrán registrarse en el sistema y consultar el histórico de su participación: número de juegos realizados, estadísticas de partidas ganadas/perdidas, etc.
-
La aplicación dispondrá de una API que permita a los bots interactuar con ella.
-
La API de la aplicación permitirá acceder y gestionar información de los usuarios y de las partidas.
-
La API tendrá documentación.
-
La API permitirá que un bot juegue contra la aplicación.
1.3. Quality Goals
| Objetivo de calidad | Descripción |
|---|---|
Usabilidad |
La aplicación web deberá ser sencilla de usar e intuitiva, permitiendo que cualquier usuario tenga una buena experiencia jugando al juego Y. |
Rapidez |
Se buscará que los tiempos de respuesta sean lo más cortos posibles, tanto durante la partida como en la navegación de la aplicación. |
Mantenibilidad |
La aplicación deberá ser fácil de mantener, con código limpio y fácil de modificar o ampliar, siguiendo buenas prácticas de diseño de software. |
Fiablilidad |
La aplicación tendrá que ser fiable y funcionar correctamente ante cualquier situación llevada a cabo por los usuarios. También deberá de estar disponible el mayor tiempo posible. |
1.4. Stakeholders
| Rol/Nombre | Contacto | Expectativas |
|---|---|---|
Micrati |
Empresa de desarrollo de videojuegos |
Espera una entrega de la aplicación que cumpla todos los requisitos especificados. |
Equipo de desarrollo |
Sergio Espina Marcos, Pablo García Menéndez, Elías Fernández Medina, Adrián Pérez Menéndez |
Espera desarrollar una aplicación web aplicando y mejorando sus conocimientos y habilidades. |
Usuarios |
Personas que utilicen la aplicación |
Esperan poder divertirse jugando al juego Y. |
Profesor |
Jose Emilio Labra Gayo |
Espera asistir al equipo de desarrollo en el proyecto y evaluarlo. |
2. Architecture Constraints
2.1. Technical Constraints
| Restricción | Descripción |
|---|---|
Lenguaje frontend |
La aplicación web debe desarrollarse utilizando TypeScript con React. |
Módulo de lógica |
El motor del juego debe implementarse en lenguaje introducido en seminarios Rust. |
Comunicación |
La comunicación entre el frontend y el módulo de lógica se realizará mediante servicios web usando JSON. |
Notación YEN |
Las partidas deberán representarse utilizando la notación YEN proporcionada. |
API externa |
El sistema debe exponer una API que permita la interacción con bots. |
Despliegue web |
La aplicación debe estar accesible a través de Internet (p.e VM de Azure). |
2.2. Organizational Constraints
| Restricción | Descripción |
|---|---|
Trabajo en equipo |
El desarrollo se realiza en equipo, lo cual implica coordinación y reparto de tareas equitativo. |
Evaluación académica |
El proyecto será evaluado según los criterios establecidos. |
Uso de GitHub |
El repositorio debe mantenerse actualizado con un historial claro de commits, issues, actas y decisiones que se puedan tomar. |
2.3. Conventions
| Convención | Descripción |
|---|---|
PLantilla arc42 |
Se seguirá la plantilla de arc42 para documentar la arquitectura. |
Buenas prácticas |
Se aplicarán principios de diseño limpio y mantenible. |
Control de versiones |
Se utilizará Git para el control de versiones. |
3. Context and Scope
3.1. Business Context
| Elemento | Entrada | Salida |
|---|---|---|
Usuario |
Accede a la aplicación, realiza movimientos, consulta historial |
Visualización del tablero, resultados de la partida, historial |
Bot externo |
Solicitudes al API (posición en formato YEN, peticiones de jugadas) |
Respuesta con el siguiente movimiento en formato YEN |
Sistema Yovi |
Recibe movimientos y peticiones |
Gestiona partidas, usuarios y lógica del juego |
Módulo de lógica (Rust) |
Estado del tablero en formato YEN |
Resultado de la partida o siguiente movimiento sugerido |
El sistema Yovi actúa como intermediario entre los usuarios, los bots externos y el módulo de lógica del juego. Los usuarios interactúan a través de la interfaz web, mientras que los bots lo hacen mediante el API.
3.2. Technical Context
| Elemento | Canal | Tecnología |
|---|---|---|
Usuario ↔ Aplicación web |
Navegador web |
HTTP/HTTPS, TypeScript/React |
Aplicación web ↔ API |
Peticiones HTTP |
JSON |
Aplicación web ↔ Módulo de lógica |
Servicios web |
HTTP/HTTPS + JSON |
Bot externo ↔ API |
Peticiones HTTP |
JSON |
3.3. Mapping Input/Output to Channels
| Entrada/Salida | Canal |
|---|---|
Movimiento del usuario |
Agente de usuario (HTTP) |
Visualización del tablero |
Agente de usuario (HTTP) |
Petición de jugada (bot) |
API HTTP (JSON) |
Respuesta del sistema |
API HTTP (JSON) |
Comunicación con módulo Rust |
Servicios web (HTTP + JSON) |
4. Solution Strategy
El sistema Yovi se ha diseñado siguiendo principios de modularidad y separación de responsabilidades. La estrategia general se basa en los siguientes aspectos:
4.1. Top-Level Decomposition
-
Frontend web (TypeScript/React): Se encarga de la interacción con los usuarios y la presentación del tablero de juego.
-
API de la aplicación: Expone los servicios para bots y comunicación interna entre frontend y módulo de lógica.
-
Módulo de lógica del juego (Rust): Calcula el estado de la partida, determina movimientos y comprueba victorias.
-
Se comunica mediante JSON utilizando la notación YEN.
-
-
Persistencia de datos (MySQL): Registro de usuarios, partidas e historial en la base de datos gestionada por la aplicación web.
4.2. Technology Decisions
-
Se utiliza TypeScript con React para la web por su tipado estático y facilidad de mantenimiento.
-
Se utiliza Rust para la lógica del juego por su rendimiento y seguridad.
-
Se usa JSON + notación YEN para comunicar los módulos y con los bots.
-
La API está basada en servicios web simples (HTTP) para facilitar la integración con bots y otros sistemas externos.
-
Se emplea Git con GitHub para control de versiones y seguimiento del proyecto.
4.3. Key Quality Goals
-
Usabilidad: Se prioriza una interfaz clara e intuitiva para el usuario.
-
Rendimiento: Respuesta rápida durante la partida y consultas al API.
-
Mantenibilidad: Código poco acoplado, cohesivo, modular y limpio que permite añadir estrategias o variantes del juego sin romper el sistema.
4.4. Group Decisions
-
El proyecto se desarrolla de forma colaborativa por el equipo indicado, con coordinación mediante reuniones telemáticas y/o presenciales, contacto por WhatsApp y el uso del GitHub.
-
Se sigue una metodología ágil ligera de tipo SCRUM como la aprendida en asignaturas pasadas como IPS.
-
La documentación sigue la plantilla arc42, pues es la indicada por el profesor.
5. Building Block View
5.1. Whitebox Overall System
Diagrama
- Motivation
-
El sistema se descompone en servicios independientes (microservicios) para separar claramente la capa de presentación, la gestión de usuarios y la lógica principal del juego. Esta modularización mejora la mantenibilidad, la escalabilidad y permite el despliegue independiente de cada componente mediante contenedores Docker.
- Contained Building Blocks
| Name | Responsibility |
|---|---|
WebApp |
Aplicación SPA que proporciona la interfaz de usuario y se comunica con los servicios backend. |
Users Service |
API REST responsable de la gestión de usuarios y lógica de autenticación. |
Gamey Engine |
Motor principal que implementa la lógica del juego y la gestión de bots. |
Documentation |
Documentación arquitectónica y técnica del sistema basada en arc42. |
- Important Interfaces
-
-
Comunicación REST HTTP entre WebApp y Users Service.
-
Comunicación REST HTTP entre WebApp y Gamey Engine.
-
Comunicación interna entre servicios mediante red Docker.
-
Intercambio de datos en formato JSON.
-
| Name | Responsibility |
|---|---|
WebApp |
Frontend SPA que proporciona la interfaz de usuario y comunica con los servicios backend. |
Users Service |
Backend REST responsable de la gestión de usuarios y autenticación. |
Gamey Engine |
Motor del juego que implementa la lógica y gestión de bots. |
Documentation |
Contiene la documentación arquitectónica y técnica del sistema. |
5.1.1. WebApp
- Interfaces
-
-
Consume los endpoints REST expuestos por Users Service.
-
Se comunica con Gamey Engine para operaciones relacionadas con el juego.
-
Utiliza HTTP y JSON como protocolo y formato de intercambio.
-
- Localización
-
-
/webapp
-
5.1.2. Users Service
- Interfaces
-
-
Expone endpoints REST (por ejemplo, creación y consulta de usuarios).
-
Comunicación mediante HTTP y JSON.
-
- Localización
-
-
/users
-
5.1.3. Gamey Engine
- Interfaces
-
-
Expone endpoints HTTP para operaciones del juego.
-
Intercambio de datos estructurados en JSON.
-
- Localización
-
-
/gamey
-
5.1.4. Documentation
- Interfaces
-
-
Archivos estáticos en formato AsciiDoc.
-
- Localización
-
-
/docs
-
5.2. Level 2
5.2.1. White Box WebApp
La WebApp sigue la estructura típica de una SPA basada en React.
| Componente | Responsabilidad |
|---|---|
App.tsx |
Punto de entrada de la aplicación y configuración de rutas. |
Views |
Componentes de nivel página. |
Components |
Componentes reutilizables de interfaz. |
Services |
Lógica de comunicación con APIs backend. |
- Interaction
-
-
Los componentes llaman a la capa Services.
-
Services realiza peticiones HTTP a los servicios backend.
-
5.2.2. White Box Users Service
API REST basada en Express estructurada por rutas y controladores.
| Componente | Responsabilidad |
|---|---|
Server |
Configuración e inicialización del servidor Express. |
Routes |
Definición de endpoints REST. |
Controllers |
Lógica de gestión de peticiones. |
Models |
Estructuras de datos de usuario. |
- Interaction
-
-
Las rutas delegan en los controladores.
-
Los controladores procesan la lógica y devuelven respuestas JSON.
-
5.2.3. White Box Gamey Engine
Proyecto en Rust estructurado siguiendo convenciones de Cargo.
| Componente | Responsabilidad |
|---|---|
main.rs |
Punto de entrada de la aplicación. |
core |
Lógica de reglas y estado del juego. |
bot |
Gestión y comportamiento de bots. |
web |
Capa de exposición HTTP. |
- Interaction
-
-
La capa web expone endpoints HTTP.
-
El módulo core ejecuta la lógica del juego.
-
El módulo bot integra comportamiento automatizado.
-
5.3. Level 3
5.3.1. White Box Gamey Engine Core
El módulo core encapsula las reglas del juego y la gestión del estado.
-
Representación del estado del juego.
-
Validación de reglas.
-
Transiciones de estado.
-
Gestión de errores.
- Responsabilidad
-
Garantizar la ejecución determinista de la lógica del juego de forma independiente a la interfaz web.
5.3.2. White Box WebApp Services Layer
Capa encargada de encapsular toda la comunicación HTTP.
-
Cliente de API.
-
Llamadas fetch/axios.
-
Gestión de errores.
- Responsabilidad
-
Desacoplar los componentes de interfaz de los detalles de comunicación con el backend.
6. Runtime View
6.1. Resgistro del usuario
- Caso
-
-
El usuario entra en la página web e inicia el proceso de registrarse para poder echar unas partidas.
-
La WebApp envía los datos del formulario al Users Service para validación y creación de la cuenta.
-
Users Service valida los datos, crea al usuario y devuelve la confirmación.
-
-
6.2. Partida a Y
- Caso
-
-
El usuario comienza una nueva partida.
-
La WebApp solicita al Gamey Engine que cree una nueva sesión de juego.
-
Gamey Engine inicializa el estado de la partida y registra los bots necesarios.
-
Gamey Engine devuelve a la WebApp el estado inicial de la partida.
-
La WebApp muestra al usuario el tablero o interfaz de juego lista para interactuar.
-
-
Diagrama de secuencia representativo:
7. Deployment View
7.1. Infrastructure Level 1
<Overview Diagram>
- Motivation
-
La infraestructura usa una máquina virtual en Azure que ejecuta Docker para aislar y contener los servicios. Esto permite un control completo sobre la ejecución de contenedores, facilita el despliegue reproducible y permite escalar cada contenedor independientemente en la misma VM. Azure SQL Database gestiona la persistencia de datos.
- Quality and/or Performance Features
-
-
Contenedores aislados mediante Docker dentro de la VM.
-
Fácil gestión de actualizaciones y despliegues mediante CI/CD.
-
Red interna de baja latencia entre contenedores.
-
Persistencia gestionada con Azure SQL Database (replicación y backups automáticos).
-
Seguridad: firewall de VM y conexión segura a base de datos.
-
- Mapping of Building Blocks to Infrastructure
| Bloque de Construcción | Elemento de Infraestructura |
|---|---|
WebApp |
Contenedor Docker dentro de la VM Azure |
Users Service |
Contenedor Docker dentro de la VM Azure |
Gamey Engine |
Contenedor Docker dentro de la VM Azure |
Base de Datos |
MySQL Database |
7.2. Infrastructure Level 2
7.2.1. Docker Host en VM Azure
Diagrama:
Todos los servicios backend y frontend se ejecutan en contenedores Docker sobre la misma VM. Cada contenedor está aislado, puede reiniciarse independientemente y comparte la red interna para comunicación rápida entre servicios.
8. Cross-cutting Concepts
8.1. Modelo de Dominio
El sistema sigue un modelo de dominio centrado en la separación de responsabilidades: * Usuarios: gestión de cuentas, autenticación y autorización. * Juego: lógica de reglas, estado del juego y comportamiento de bots. * Interacción Web: comunicación entre frontend y backend mediante APIs REST.
Este modelo asegura consistencia en todo el sistema y permite mantener la integridad conceptual entre los diferentes servicios.
8.2. Experiencia de Usuario (UX)
-
La interfaz WebApp sigue el patrón SPA (Single Page Application) para ofrecer fluidez y rapidez.
-
Navegación intuitiva mediante rutas y vistas organizadas.
-
Formularios de registro y login que validan datos antes de enviarlos al backend.
-
Mensajes de error y éxito consistentes en toda la aplicación.
8.3. Seguridad y Autenticación
-
Gestión de autenticación en Users Service con credenciales básicas.
-
Comunicación segura mediante HTTPS (recomendado en despliegues reales).
-
Validación de datos de entrada en frontend y backend para evitar errores o exploits comunes.
-
Roles de usuario potencialmente diferenciados para acceso a distintas funcionalidades del juego.
8.4. Patrones de Arquitectura y Diseño
-
Arquitectura modular por servicios:
-
WebApp: presentación.
-
Users Service: backend REST.
-
Gamey Engine: lógica del juego.
-
Separación de responsabilidades para facilitar mantenimiento y despliegue independiente.
-
Uso de MVC simplificado en Users Service (Rutas → Controladores → Modelos).
-
Patrón cliente‑servidor para comunicación WebApp ↔ Backend.
-
Contenerización con Docker para aislar servicios y garantizar reproducibilidad.
8.5. Detalles Técnicos (“Under-the-hood”)
-
WebApp utiliza React + TypeScript + Vite.
-
Users Service implementado en Node.js + Express.
-
Gamey Engine implementado en Rust, siguiendo estructura modular (core, bot, web).
-
Comunicación entre servicios mediante JSON sobre HTTP.
-
Docker Compose como orquestador de los contenedores para facilitar despliegue local y pruebas.
8.6. Conceptos de Desarrollo
-
Uso de npm y Cargo para gestión de dependencias y scripts de compilación.
-
Estructura de carpetas consistente para mantener claridad y escalabilidad.
-
Pruebas unitarias básicas en frontend y backend.
-
Separación de configuración y código para facilitar cambios de entorno.
8.7. Conceptos Operativos
-
Cada servicio corre de manera independiente en contenedores Docker.
-
Red interna de Docker para comunicación entre servicios.
-
Posibilidad de despliegue independiente de WebApp, Users Service o Gamey Engine.
-
Logs y errores manejados por cada servicio de forma local; integrable con sistemas de logging centralizados en el futuro.
9. Architecture Decisions
9.1. MySQL como BBDD del proyecto
- Estado
-
Aceptada.
- Contexto
-
Se requiere un sistema de persistencia para almacenar los datos de los usuarios, partidas y estado del juego. La solución debe ser flexible, integrarse correctamente con el ecosistema tecnológico elegido y facilitar el desarrollo y despliegue del proyecto.
- Alternativas consideradas
-
-
Otras bases de datos relacionales.
-
Bases de datos no relacionales.
-
- Justificación
Modelo relacional |
MySQL permite estructurar los datos en tablas normalizadas, ideal para usuarios, partidas y relaciones entre entidades del juego. |
Integridad de datos |
Garantiza consistencia mediante claves primarias, foráneas y restricciones, evitando errores de duplicidad o pérdida de información. |
Madurez y soporte |
MySQL es estable, ampliamente documentado y compatible con la mayoría de frameworks y lenguajes backend. |
Adopción del equipo de desarrollo |
Es una tecnología que todo el equipo de desarrollador ha empleado en algún otro proyecto. |
Rendimiento |
Adecuado para cargas moderadas, asegurando tiempos de respuesta rápidos en operaciones comunes. |
Facilidad de despliegue |
Compatible con Docker y entornos cloud, lo que facilita levantar instancias de forma reproducible. |
- Consecuencias
-
-
Se adopta un esquema relacional que requiere planificación previa de las tablas y relaciones.
-
Cambios estructurales en el futuro pueden requerir migraciones más cuidadosas que en una base de datos NoSQL.
-
Se asegura integridad y consistencia de los datos, facilitando mantenimiento y auditorías.
-
9.2. Azure como infraestructura de despliegue (Máquina Virtual)
- Estado
-
Aceptada.
- Contexto
-
Se requiere un entorno donde desplegar la aplicación backend, la base de datos y los servicios asociados, garantizando disponibilidad, escalabilidad y acceso remoto seguro. La solución debe integrarse fácilmente con el ecosistema tecnológico del proyecto y permitir un despliegue sencillo y controlado.
- Alternativas consideradas
-
-
AWS EC2.
-
Google Compute Engine.
-
Servidores on-premise.
-
Otros proveedores cloud.
-
- Justificación
Adopción del equipo de desarrollo |
Es una tecnología que todo el equipo de desarrollador ha empleado en algún otro proyecto. |
Infraestructura como servicio (IaaS) |
Azure permite crear y configurar máquinas virtuales con control total sobre el sistema operativo y el entorno de ejecución. |
Escalabilidad |
Posibilidad de aumentar recursos (CPU, RAM, almacenamiento) según crezcan las necesidades del proyecto. |
Alta disponibilidad |
Integración con servicios de red, copias de seguridad y monitorización dentro del ecosistema Azure. |
Integración con el entorno cloud |
Compatible con Docker, CI/CD y otros servicios gestionados del ecosistema Azure. |
Seguridad |
Configuración de redes virtuales, grupos de seguridad y control de acceso basado en roles. |
Flexibilidad |
Permite alojar tanto la aplicación como la base de datos en un mismo entorno o separarlos en distintas máquinas virtuales según necesidades. |
- Consecuencias
-
-
Se asume la responsabilidad de la administración del sistema operativo, actualizaciones y configuración del servidor.
-
Puede implicar costes variables en función del uso de recursos y tiempo de ejecución.
-
Ofrece mayor control y personalización frente a soluciones PaaS, a cambio de una mayor gestión técnica.
-
Facilita el escalado futuro y la integración con otros servicios del ecosistema Azure.
-
10. Quality Requirements
10.1. Quality Tree
10.2. Quality Scenarios
| Atributo | Escenario | Comportamiento esperado |
|---|---|---|
Usabilidad |
Un usuario accede por primera vez a la aplicación, sin conocimiento de la misma ni del juego, y comienza una partida. |
El usuario entiende las reglas básicas y puede iniciar y jugar una partida sin necesidad de instrucciones externas. |
Rendimiento |
Un jugador realiza una acción durante la partida (por ejemplo, realizar un movimiento). |
El sistema procesa la acción y actualiza el estado del juego inmediatamente o en un muy corto periodo de tiempo. |
Mantenibilidad |
Un desarrollador necesita añadir una nueva funcionalidad o modificar una regla del juego. |
El cambio puede implementarse sin afectar a otras partes del sistema y sin introducir errores colaterales. |
Fiabilidad |
Durante una partida, el sistema enfrenta situaciones inesperadas (por ejemplo, entrada inválida, pérdida de conexión o error interno). |
El sistema maneja el error de forma controlada, no se bloquea ni pierde el progreso del usuario, mantiene la coherencia del estado del juego y permite continuar o recuperarse sin corrupción de datos. |
11. Risks and Technical Debts
| Risk / Technical Debt | Impact | Mitigation / Notes |
|---|---|---|
Complejidad de la integración Frontend ↔ Backend |
La comunicación JSON/YEN entre TypeScript/React y Rust puede generar errores de formato o inconsistencias. |
Definir y validar estrictamente el formato YEN, comprobar e integrar todos los endpoints. |
Evolución de las estrategias de juego |
Medio: Añadir nuevas estrategias puede romper el motor de juego si no se diseña modularmente. |
Diseñar motor de juego con interfaces claras; documentar cómo añadir nuevas estrategias. |
Gestión de concurrencia en partidas multiusuario |
Usuarios jugando simultáneamente pueden generar conflictos de estado e incoherencias. |
Implementar control de acceso a partidas; usar bloqueos o transacciones en la persistencia. |
Dependencia de bots externos |
Bots externos pueden enviar datos inválidos o malformateados. |
Validación estricta de entradas y manejo de errores; definir contratos claros en la API. |
Deuda técnica en el frontend |
Código TypeScript con React puede no ser modular o adquierir acoplamiento que dificulte el mantenimiento o futuros cambios. |
Revisiones de código, pruebas unitarias y refactorizaciones periódicas. |
Escalabilidad del backend |
El API y la lógica deben soportar múltiples partidas simultáneas. |
Planificar escalabilidad desde el inicio; monitorización y pruebas de carga. |
Compatibilidad con variantes futuras del juego |
Añadir variantes como Master Y o Holey Y puede requerir cambios en la lógica. |
Diseñar motor de juego flexible y documentar cómo extender reglas. |
12. Glossary
| Term | Definition |
|---|---|
Yovi |
Nombre del proyecto, plataforma web para jugar al juego Y y permitir la interacción de usuarios y bots. |
Juego Y |
Juego de tablero abstracto en el que dos jugadores intentan conectar lados opuestos del tablero siguiendo reglas específicas. |
Notación YEN |
Formato JSON utilizado para representar el estado de una partida, incluyendo tamaño de tablero, turno, disposición de jugadores y layout. |
Bot |
Programa que juega automáticamente contra la aplicación o contra otros usuarios, usando la API. |
API (Application Programming Interface) |
Conjunto de servicios web que permite la interacción de bots o módulos externos con la aplicación. |
Frontend |
Interfaz web implementada en TypeScript con React que permite a los usuarios jugar y consultar su historial. |
Módulo de Lógica (Rust) |
Componente encargado de calcular movimientos válidos, verificar victorias y sugerir estrategias usando la notación YEN. |
Persistencia (MySQL) |
Componente encargado de almacenar información de usuarios, partidas y estadísticas en la base de datos. |
Estrategia |
Algoritmo que define cómo el bot decide su siguiente movimiento en una partida. |
Partida |
Instancia de un juego Y entre dos jugadores, humanos o bots, con un tablero y un historial de movimientos. |
Historial |
Datos calculados sobre los jugadores y sus partidas, incluyendo victorias, derrotas y ranking. |
