| Campo | Valor |
|---|---|
| Estado | Aceptado |
| Fecha | 2026-05-21 |
| Contexto | UMS Web App — Arquitectura Frontend |
| Decisores | Equipo de Arquitectura |
Las aplicaciones frontend frecuentemente mezclan concerns: lógica de negocio en componentes, llamadas HTTP en código de UI, y gestión de estado dispersa entre archivos. Esto hace el testing difícil, la reutilización imposible, y el codebase frágil al cambio.
Aplicar Clean Architecture (Hexagonal) al frontend React con límites de capa estrictos:
src/
├── domain/ # Reglas de negocio empresariales (PURO)
│ ├── entities/ # Entidades empresariales (Tenant, Branch, IdP)
│ ├── value-objects/ # Value objects (Email, TenantCode)
│ ├── schemas/ # Schemas de validación Zod
│ └── constants/ # Constantes de dominio
│
├── application/ # Casos de uso y lógica de aplicación
│ ├── hooks/ # React hooks (casos de uso)
│ ├── stores/ # Zustand stores (estado)
│ ├── errors/ # Utilidades de manejo de errores
│ ├── utils/ # Utilidades de aplicación (logger, i18n)
│ └── i18n/ # Internacionalización
│
├── infrastructure/ # Concerns externos
│ ├── http/ # Cliente HTTP, Cliente GraphQL, CSRF
│ └── services/ # Adaptadores de servicios externos
│
└── presentation/ # Capa de UI
├── shared/ # Componentes compartidos, layouts, tema
└── identity/ # Presentación del bounded context
├── tenant/ # Pantallas del aggregate Tenant
├── profile/ # Pantallas del aggregate Profile
└── hooks/ # Hooks específicos de contexto
Las dependencias fluyen hacia adentro: Presentation → Application → Domain. Infrastructure se inyecta vía inversión de dependencias.
presentation ──▶ application ──▶ domain
▲
│
infrastructure (inyectado)
La manipulación de DOM (ej., document.body.classList) se realiza en la capa de presentación, no en stores. Los stores exponen estado; los componentes reaccionan a él.
Positivas:
Negativas:
no-restricted-imports puede enforce fronteras (futuro)index.ts) definen APIs públicas por capaAGENTS.md documenta convenciones para agentes IA