# Arquitectura

ADAS Core sigue una arquitectura de capas que separa claramente las responsabilidades entre los diferentes proyectos de la solución.

## Capas principales

| Capa | Proyecto | Responsabilidad |
| --- | --- | --- |
| Presentación | `adas-core` | Exposición de la API HTTP, WebSocket Hubs, middleware y composición del grafo de dependencias. |
| Aplicación | `adas-core.Application` | Casos de uso, servicios de aplicación, interfaces de repositorio, proveedores y customizaciones por centro. |
| Dominio | `adas-core.Domain` | Entidades, modelos, enums, excepciones de negocio y utilidades compartidas. |
| Infraestructura | `adas-core.Infrastructure` | Implementaciones de repositorios, acceso a MongoDB, mensajería RabbitMQ, caché Redis y mapeos de persistencia. |
| Autenticación | `adas-core.Authentication` | Atributos, servicios de autoridad, gestión de usuarios y extensión de registro de autenticación. |
| Módulos | `adas-core.module.*` | Funcionalidades específicas desacopladas (balizas, proxy de dispositivos, relés). |

## Flujo de datos

1. Los **Controllers** reciben las peticiones HTTP y delegan en los **Services** de aplicación.
2. Los **Services** ejecutan la lógica de negocio y utilizan las **interfaces de repositorio** definidas en Application.
3. Los **Repositories** concretos (en Infrastructure) acceden a MongoDB y publican eventos a través de RabbitMQ cuando es necesario.
4. Los **WebSocket Hubs** (`UciHub`) envían actualizaciones en tiempo real a los clientes conectados.

## Dependencias entre proyectos

```
adas-core
├── adas-core.Application
│   ├── adas-core.Domain
│   └── (interfaces de infraestructura)
├── adas-core.Infrastructure
│   ├── adas-core.Application
│   └── adas-core.Domain
├── adas-core.Authentication
│   └── adas-core.Domain
├── adas-core.module.*
│   ├── adas-core.Application
│   └── adas-core.Domain
└── adas-core.Test
    └── (todos los proyectos)
```
