yovi_es4b
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
YOVI is an online game based on Game Y, an abstract strategy board game described by John Milnor in the 1950’s and indepently invented in 1953 by Craige Schensted and Charles Titus.
The game is normally played on a triangular board by two players, whose goal is to connect the three sides of the board with an unbroken chain of their pieces.
YOVI is a modern implementation of Game Y, which allows players to play against bots of varying dificulties, against other players locally or online. It also features a login system, allowing it to log accounts' stats.
1.1. Requirements Overview
-
User registration and login system
-
Allow users to create accounts and log in securely
-
-
Game modes
-
Single-player mode against AI opponents of varying difficulties
-
Local multiplayer mode for two players on the same device
-
Online multiplayer mode for players to compete against each other over the internet
-
-
Game mechanics
-
Implement the rules of Game Y accurately
-
Provide an intuitive and responsive user interface for gameplay
-
Provide custom game settings (e.g., board size, time limits, game variants)
-
-
Account statistics
-
Track and display players' game statistics, such as wins, losses, and games played
-
-
Bot opponents
-
Develop AI opponents with varying levels of difficulty and different strategies to provide a challenging gaming experience for players of all skill levels
-
-
API
-
Provide an API that allows bots to retrieve their game statistics, enabling them to track their progress and performance over time
-
Provide an API that allows bots to play against the game, enabling developers to create their own bots and integrate them into the game
-
1.2. Quality Goals
Priority |
Quality Goal |
Description |
1 |
Robustness |
The game should be able to handle unexpected inputs and situations without crashing or producing incorrect results. This includes handling invalid moves, network interruptions, and other unforeseen circumstances gracefully. |
2 |
Usability |
The game should have an intuitive and user-friendly interface that allows players to easily navigate through menus, understand game mechanics, and enjoy a seamless gaming experience. |
3 |
Performance |
The game should run smoothly with minimal latency, especially in online multiplayer mode, to ensure a responsive and enjoyable gaming experience for all players. |
4 |
Compatibility |
The game should be compatible with any type of device that has a web browser, including desktops, laptops, tablets, and smartphones, to reach a wide audience of players. |
5 |
Security |
The game should implement robust security measures to protect user data and prevent unauthorized access, especially in the context of user accounts and online multiplayer interactions. |
1.3. Stakeholders
| Role/Name | Contact | Expectations |
|---|---|---|
Development Team |
Julián Fernández Herruzo (UO300199@uniovi.es) |
Responsible for implementing and designing the architecture, ensuring that it meets the specified requirements and quality goals. |
Micrati |
N/A |
Interested in the successful development and deployment of the game, as well as its commercial success. They also specify some requirements or constraints that need to be considered during the architectural design process, such as the chosen language (Rust) |
Players |
N/A |
Expect a fun and engaging gaming experience, with a user-friendly interface, smooth performance, and challenging gameplay. They also expect regular updates and improvements to the game based on their feedback. |
2. Architecture Constraints
2.1. Technical Constraints
Constraint |
Description |
Languages |
Front-end: TypeScript (React). Game engine: Rust. |
Communication format |
JSON using the YEN notation for game states and moves. |
Public API |
Must implement an API for bots to interact with the game, and view users stats. |
Deployment |
Application must be deployable and publicly accessible through the internet. |
Testing |
Unit, integration and end-to-end test. |
Security |
Authentication for users with a secure login mechanism. |
Stored data |
User data and game states must be stored persistently in a database. |
2.2. Organizational Constraints
Constraint |
Description |
Documentation |
Use arc42 template for documentation of the application. The documentation must be publicly accessible and updated regularly. |
Development time |
The application should be developed by the end of the semester. |
Github repository |
Use a shared GitHub repository for version control and collaboration. |
Meetings |
At least one meeting per week to discuss progress, challenges and next steps. Every meeting must be documented. |
2.3. Conventions
Convention |
Description |
Code style & linting |
Follow existing project style for TypeScript and Rust. |
Version control |
Use of "main" branch for stable code releases; feature branches for development. Use pull requests and code review before merging. |
3. Context and Scope
This section describes the system boundary: the communication partners (users and external systems), the domain-level inputs and outputs, and the technical channels used for interaction. It separates business context (who interacts with the system and what domain information is exchanged) from technical context (protocols, ports, and runtime deployment aspects).
Motivation: clear context and scope prevent misunderstandings about responsibilities, interfaces, and deployment requirements. === Business Context
3.1. Elements Description
-
Player: The end-user who interacts with the system through a web browser to play games and view statistics.
-
Administrator: Responsible for managing users and monitoring the system.
-
Bot: An automated agent that can interact with the game engine to play games and view user stats.
-
WebApp: The front-end application built with React and Vite, serving the user interface and handling user interactions.
-
Users: The back-end service responsible for user authentication and management, built with Node.js.
-
Gamey: The game engine and bot service implemented in Rust, responsible for game logic and interactions with bots.
-
DB: The database used to persist user data and games.
3.2. Technical Context
3.2.1. Elements Description
| Participants | Input/Output | Channel/Protocol |
|---|---|---|
Player (Browser) |
Web navigation, gameplay actions, requests to the frontend |
HTTPS (via Reverse Proxy) / HTTP (dev 5173) |
Administrator |
Administration actions, user management requests |
HTTPS (Users API) |
External Bot |
Game actions, statistics queries, automated gameplay |
HTTPS JSON (Gamey API) |
Reverse Proxy (nginx) |
Incoming HTTP/HTTPS traffic, routing to internal services |
HTTPS externally / HTTP internally |
WebApp (React + Vite + TypeScript) |
User interactions, REST API calls to Users and Gamey |
HTTP (internal REST) |
Users (Node.js + Express) |
Authentication, user management, metrics endpoint |
HTTP (internal REST) / TCP (database driver) |
Gamey (Rust Engine + Bot Service) |
Game logic, bot API, metrics endpoint |
HTTP (internal REST) / TCP (database driver) |
Database (Postgres / Mongo) |
Storage of users, game sessions, statistics |
SQL/NoSQL over TCP |
Prometheus |
Metrics scraping from Users and Gamey |
HTTP (/metrics) |
Grafana |
Dashboard visualization, queries to Prometheus |
HTTP (host port 9091 → container port 3000) |
4. Solution Strategy
This section summarizes the architectural decisions that guide the system and explains how they support the main quality goals.
4.1. 4.1 Technology Decisions
-
Frontend: React + TypeScript.Reason: fast development, maintainability through static typing, and a broad ecosystem.
-
Application Backend: Node.js + Express (with TypeScript in the application layer where applicable).Reason: agile REST API development and a mature ecosystem.
-
Game Engine Service: Rust + Axum.Reason: alignment with assignment constraints and clear separation of game-domain logic in a specialized service.
-
Containerization: Docker + Docker Compose.Reason: reproducible environments and consistent service integration.
-
Monitoring: Prometheus + Grafana.Reason: baseline observability through service-level metrics.
-
Deployment Target: Azure.Reason: academic availability and prior team experience.
4.2. 4.2 Top-Level Decomposition Decision
The architecture is decomposed into four main building blocks:
-
Webapp (Frontend)Responsibility: user interaction and game state visualization.
Architectural role: system client.
-
Users Service (Application API)Responsibility: public API, user/game/history management, and use-case orchestration.
Architectural role: single entry point for frontend clients.
-
Gamey Service (Game Engine)Responsibility: move validation, game rules, and bot move calculation.
Architectural role: internal domain service invoked by
Users Service. -
Persistence Layer (Database)Responsibility: storage of users, matches, statistics, and history.
Architectural role: persistence dependency used by
Users Service.
4.2.1. Communication Between Subsystems
Communication follows the pattern Webapp → Users Service → Gamey Service.
-
Webapp → Users Service: HTTP/REST + JSON (public API). -
Users Service → Gamey Service: HTTP/REST + JSON (internal domain API). -
Users Service <→ Database: persistence operations.
The Users → Gamey interaction is synchronous for move validation/calculation, and the backend returns a normalized game state to the frontend.
4.3. 4.3 Decisions to Achieve Quality Goals
| Quality Goal | Architectural Decision |
|---|---|
Usability |
React UI with straightforward navigation, clear loading/error feedback, and input validation. |
Performance |
Critical game logic isolated in |
Testability |
Unit tests per service, integration tests across services, and E2E tests for key user flows. |
Maintainability |
Clear separation of responsibilities ( |
Availability and Reliability |
Containerized execution, baseline monitoring with Prometheus/Grafana, and cloud deployment strategy. |
4.4. 4.4 Organizational Decisions
-
Central GitHub repository for source code and collaboration.
-
Task tracking and technical discussion through GitHub Issues.
-
Periodic team meetings for progress review and task distribution.
-
Decision and meeting traceability through documented records (e.g., team wiki).
5. 5. Building Block View
5.1. Whitebox Overall System
- Motivation
-
This first view shows the system at its highest abstraction level. It defines the system boundary (
Yovi) and the external actor (Usuario) before introducing internal decomposition. This helps stakeholders understand scope and ownership before going into technical details. - Contained Building Blocks
-
-
Yovi: Main system boundary that contains the application internals, detailed in the next levels.
-
- Important Interfaces
-
-
Usuario → Yovi: Primary interaction interface between the end user and the system.
-
5.1.1. Yovi
System boundary that provides gameplay capabilities to the user and is internally decomposed in the following levels.
5.2. Level 2
5.2.1. White Box Yovi
- Motivation
-
Level 2 decomposes
Yoviinto its main runtime building blocks while keeping implementation details hidden. This view clarifies responsibilities between presentation, backend logic, and persistence. - Contained Building Blocks
-
-
WebApp: Frontend used by the player for interaction. -
Backend: Server-side component that exposes business operations. -
BBDD: Persistent storage used by backend services.
-
- Important Interfaces
-
-
Usuario → WebApp: User interaction interface. -
WebApp → Backend: HTTP/JSON application interface. -
Backend → BBDD: Persistence access interface.
-
5.3. Level 3
5.3.1. White Box Backend
- Motivation
-
Level 3 details the internal structure of the backend component. It isolates the key business services and their collaboration for user and gameplay operations.
- Contained Building Blocks
-
-
User: Service responsible for user-related operations. -
Gamey: Service responsible for game engine and game logic. -
BBDD: Shared persistence component used by backend services.
-
- Important Interfaces
-
-
User ←→ Gamey: Internal service-to-service interface for game/user data exchange. -
User → BBDD: User data persistence interface. -
Gamey → BBDD: Game state persistence interface.
-
6. Runtime View
6.1. Login
-
Escenario de autenticacion de usuario.
-
WebAppse comunica directamente conUserpara autenticar. -
UserusaBBDDpara comprobar los datos del usuario.
6.2. Jugar partida
-
Escenario principal de ejecucion de juego.
-
Gameyencapsula la logica de partida. -
El estado de la partida se persiste en
BBDD.
7. Deployment View
7.1. Infrastructure Level 1
The system is deployed as a distributed, container-based architecture. It consists of independent services communicating over HTTP and running within isolated container environments.
The deployment view describes the technical infrastructure required to execute the system and the mapping of software building blocks to infrastructure elements.
The following diagram shows the high-level deployment structure in a local environment using containerization. <Overview Diagram> @startuml node "User Device" { component "Web Browser" }
node "Docker Host" {
node "Docker Network" {
node "Webapp Container\n(React + Vite)" {
component "SPA Frontend"
}
node "Users Service Container\n(Node.js + Express)" {
component "Users REST API"
}
node "Gamey Container\n(Rust Engine)" {
component "Game Engine API"
}
node "Database Container" {
database "User Database"
}
} }
"Web Browser" -→ "SPA Frontend" : HTTP "SPA Frontend" -→ "Users REST API" : HTTP /createuser "SPA Frontend" -→ "Game Engine API" : HTTP "Users REST API" -→ "User Database" : DB connection
@enduml
- Motivation
-
The deployment structure is based on containerized services to ensure:
-
Clear separation between frontend, backend, and game engine.
-
Independent deployment and scalability of each service.
-
Reproducible development environments.
-
Isolation of runtime dependencies.
-
A database component has been introduced to persist user data, enabling real user registration and long-term storage.
- Quality and/or Performance Features
-
-
Scalability: Services can be scaled independently in future production environments.
-
Isolation: Each component runs in its own container.
-
Loose Coupling: Communication occurs via well-defined HTTP APIs.
-
Persistence: User data is stored in a dedicated database component.
-
Portability: The system can run on any infrastructure supporting containerization.
-
Maintainability: Clear separation of concerns reduces system complexity.
-
- Mapping of Building Blocks to Infrastructure
-
| Building Block | Infrastructure Element | | ---------------------- | -------------------------------------------- | | React SPA (Webapp) | Webapp Container | | User Management Logic | Users Service Container | | User Persistence Layer | Database Container | | Game Core & Bots | Gamey Container | | Client Interface | Web Browser | | Communication | Docker Internal Network (HTTP + DB protocol) |
7.2. Infrastructure Level 2
This level provides a more detailed view of selected infrastructure elements.
7.2.1. <Webapp Container>
@startuml node "Webapp Container" { component "React SPA" component "UI Components" component "API Client Module" }
node "External Services" { component "Users REST API" component "Game Engine API" }
"React SPA" -→ "UI Components" "React SPA" -→ "API Client Module" "API Client Module" -→ "Users REST API" : HTTP "API Client Module" -→ "Game Engine API" : HTTP
@enduml
The Webapp container:
-
Hosts a Single Page Application built with React.
-
Handles all user interactions.
-
Communicates with backend services via HTTP.
-
Does not maintain persistent state.
-
Acts as the primary system entry point.
7.2.2. <Users Service Container>
@startuml node "Users Service Container" { component "Express Server" component "User Controller" component "User Service" component "Persistence Layer" }
node "Database Container" { database "User Database" }
"Express Server" -→ "User Controller" "User Controller" -→ "User Service" "User Service" -→ "Persistence Layer" "Persistence Layer" -→ "User Database"
@enduml The Users Service container:
-
Exposes REST endpoints (e.g., /createuser).
-
Implements business logic for user registration.
-
Contains a persistence layer responsible for storing user data.
-
Connects to an external database container.
-
Ensures separation between API layer, business logic, and data access.
7.2.3. <Gamey Container>
@startuml node "Gamey Container" { component "Web API" component "Game Core" component "Bot Engine" component "Notation Module" }
"Web API" -→ "Game Core" "Game Core" -→ "Bot Engine" "Game Core" -→ "Notation Module"
@enduml
The Gamey container:
-
Hosts the Rust-based game engine.
-
Encapsulates all core game logic.
-
Provides bot functionality.
-
Exposes a Web API for interaction with the frontend.
-
Does not directly depend on the user database.
Gamey remains logically independent from user management.
7.2.4. <Database Container>
@startuml node "Database Container" { database "User Database" }
@enduml
The database container:
-
Stores user registration data persistently.
-
Is accessed exclusively by the Users Service.
-
Is not directly exposed to the frontend or Gamey.
-
Ensures data durability and separation of concerns.
8. Cross-cutting Concepts
This section describes the fundamental concepts, architectural principles, and technical decisions that apply across multiple components of the system. These concepts ensure architectural consistency, reduce complexity, and support the system’s long-term evolution.
8.1. <Domain Concepts>
The domain of the system is centered around user management and Game Y execution.
Key domain concepts include:
-
User: A registered client of the system.
-
Game: A Game Y match, either active or completed.
-
Player: An entity participating in a game (human or automated).
-
Bot: An automated player controlled by the game engine.
-
Move / Action: A single action performed during gameplay.
-
Game State: The current state of a game.
-
User Profile: Persisted information associated with a user.
8.2. <Architecture and Design Patterns>
The system follows a service-oriented and layered architecture, applying the following principles:
-
Client–Server Architecture The web application acts as a client, while backend services act as servers.
-
Separation of Concerns Each component has a clearly defined responsibility:
-
Webapp: User interaction and presentation
-
Users Service: User management and persistence
-
Gamey: Game logic and bot execution
-
API-first Design All communication between components is performed through HTTP-based APIs.
This approach ensures loose coupling and enables independent evolution of components.
8.3. <Security Concepts>
The system implements basic security concepts, appropriate for a development or educational environment:
-
No authentication or authorization mechanisms are currently enforced.
-
No sensitive credentials are stored.
-
Database access is restricted to the Users Service.
-
Services communicate within a trusted internal network.
-
Security considerations are intentionally simplified to keep the architectural focus on modularity and clarity.
8.4. <Development Concepts>
Development follows these principles:
-
Each service can be built, tested, and run independently.
-
Clear interface contracts define inter-service communication.
-
Technology choices are isolated per component.
This enables parallel development and easier maintenance.
8.5. <Operational Concepts>
From an operational perspective:
-
The system is primarily designed for local and development environments.
-
Services are started and stopped as a group.
-
Logs are written to standard output.
-
No monitoring or automated scaling is currently implemented.
The operational model favors simplicity and transparency over production-level optimization.
9. Architecture Decisions
Architecture Decisions
This section documents the most relevant architectural decisions made during the design of the system. Each decision includes context, alternatives, rationale, and consequences to ensure traceability and transparency.
ADR-01: Adoption of a Service-Oriented Architecture
Status
Accepted
Context
The system consists of three main functional areas:
User interface (Webapp)
User management
Game engine logic
These areas could be implemented either as a single monolithic application or as independent services.
Decision
The system is implemented as a set of loosely coupled services, each running independently and communicating via HTTP APIs.
Alternatives Considered
Monolithic architecture
Service-oriented (multi-container) architecture
Rationale
The service-oriented approach was selected because:
It enforces clear separation of concerns.
It allows independent development and testing.
It aligns with container-based deployment.
It improves maintainability and scalability.
Consequences
Positive:
Independent evolution of components.
Clear API contracts.
Better modularity.
Negative:
Increased deployment complexity.
Network communication overhead.
ADR-02: Use of Container-Based Deployment
Status
Accepted
Context
The system needs to be executable in development environments and easily portable across machines.
Decision
All services are deployed using containerization and orchestrated together.
Alternatives Considered
Native execution on host machine
Containerized execution
Rationale
Containerization ensures:
Environment consistency.
Dependency isolation.
Simplified onboarding.
Infrastructure reproducibility.
Consequences
Positive:
Predictable deployments.
Technology independence per service.
Negative:
Slight overhead compared to native execution.
ADR-03: Introduction of a Dedicated Persistence Layer for Users
Status
Accepted
Context
To support real user management, persistent storage is required.
Decision
A dedicated database component is introduced for storing user data. The database is accessed exclusively through a persistence layer inside the Users Service.
Alternatives Considered
In-memory user storage
File-based storage
Rationale
A database-based solution was chosen because:
It provides durability and consistency.
It enables long-term user management.
It allows future extension (authentication, statistics, etc.).
It enforces architectural separation between services.
Consequences
Positive:
Persistent user data.
Improved scalability.
Clear data ownership (Users Service).
Negative:
Additional infrastructure component.
Need for connection management and data modeling.
ADR-04: Separation of Game Logic from User Management
Status
Accepted
Context
The system includes both user registration and game execution logic.
Decision
T he Gamey engine remains fully independent from user persistence and user management.
Rationale
Ensures single responsibility per service.
Allows the game engine to be reused in other contexts.
Prevents unnecessary coupling between domain areas.
Consequences
Positive:
Clear domain boundaries.
Higher reusability.
Easier testing.
Negative:
Requires API coordination between services.
10. Quality Requirements
10.1. Quality Tree

10.2. Quality Scenarios
| Priority | Quality Requirement | Scenario | System Response |
|---|---|---|---|
1 |
Usability |
A user opens the game and wants to play. |
The interface should be intuitive, the rules clear and the user should be able to understand how to play. |
2 |
Performance |
Multiple players plays simultaneously. |
The game updates all moves and displays changes within 1 second. |
3 |
Reliability |
A network hiccup occurs during a match. |
The game state is preserved, players can continue without losing progress. |
4 |
Maintainability |
Developers add a new feature. |
The new feature integrates smoothly without affecting existing gameplay. |
5 |
Availability |
The system needs to handle more concurrent users. |
The game continues to run with a minimal decrease in latency. |
11. Risks and Technical Debts
Identifying and recording technical risks and debts at an early stage is essential for the project’s success. By identifying potential issues ahead of time, the team can take appropriate measures to minimize their impact. Prioritizing these risks ensures that the most critical ones are addressed first, allowing for better planning and a more stable and maintainable architecture.
11.1. Technical Risks
This table lists the main technical risks for our online board game project, including both team-related and system-related risks, ordered by priority.
| Priority | Risk | Description | Mitigation |
|---|---|---|---|
High |
Team members abandoning the project |
One or more team members leave the project in the middle of development, increasing workload for remaining members. |
Ensure code is well documented and modular, redistribute tasks, and maintain clear progress tracking. |
High |
Poor or limited communication within the team |
Misunderstandings and delays occur due to a lack of communication between team members. |
Hold regular meetings with clear minutes; use task boards and messaging tools to achieve constant communication. |
High |
Limited experience with large-scale projects |
The team has little prior experience working on projects from scratch or with multiple contributors. |
Conduct research, review best practices, and define clear development workflows and responsibilities. |
Medium |
Limited experience with Rust |
The project uses Rust, which is new to the team members, potentially causing delays or inefficient code. |
Each team member should independently study Rust and experiment with small prototypes to build competence. |
Medium |
Lack of experience with Docker |
Docker is used for deployment and development environments, but the team is not familiar with it. |
Set up step-by-step guides and practice building containers. |
Medium |
Database performance or schema issues |
As users increase, the database may slow down or be difficult to scale due to initial design choices. |
Optimize queries, define indexes, and design the schema for future scalability. |
Medium |
Third-party API failures |
Some game functionalities rely on external APIs, which may become unavailable. |
Implement caching, evaluate fallback APIs, and provide error handling to minimize disruption. |
Low |
High concurrent usage |
Many players using the system simultaneously may degrade performance or affect game state consistency. |
Conduct load testing, use caching, and optimize backend services. |
12. Glossary
| Term | Definition |
|---|---|
JavaScript |
A dynamic, high-level programming language frequently utilized for client-side and interactive web development |
Front-end |
The part of a web application that interacts with the user, usually involving the user interface and client-side logic. |
Back-end |
The part of a web application that runs on the server, handling data storage, business logic, and interaction with the front-end. |
Rust |
A modern programming language focused on safety, performance, and concurrency. |
Node.js |
A JavaScript runtime built on Chrome’s V8 engine that allows executing JavaScript on the server-side. |
Docker |
An open-source platform that automates the deployment, scaling, and management of applications using containerization. |
Framework |
A reusable set of libraries or tools that provides a structured environment to develop software applications efficiently. |
API |
API refers to Application Programming Interface. It is a set of rules and protocols that allows software applications to communicate with each other. |
React |
A JavaScript library for building interactive user interfaces, particularly single-page applications. |