# 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)