# ADR-004: Estrategia de Validación en 3 Capas **Estado:** Aceptado **Fecha:** 2026-01-07 ## Contexto Las reglas de negocio críticas son: - Máximo 3 materias por estudiante (9 créditos) - No repetir profesor en inscripciones - Datos de entrada válidos (email, nombre) ## Decisión Validar en **3 capas** con responsabilidades distintas: | Capa | Responsabilidad | Tecnología | |------|-----------------|------------| | Frontend | UX, feedback rápido | Reactive Forms | | Application | Estructura de datos, sanitización | FluentValidation | | Domain | Reglas de negocio puras | Domain Services | ## Implementación ### Frontend (UX) ```typescript this.form = this.fb.group({ name: ['', [Validators.required, Validators.minLength(3)]], email: ['', [Validators.required, Validators.email]], }); ``` ### Application (Sanitización + XSS) ```csharp RuleFor(x => x.Name) .NotEmpty() .Must(NotContainDangerousContent); // Previene XSS ``` ### Domain (Negocio) ```csharp public void ValidateEnrollment(Student student, Subject subject) { if (student.Enrollments.Count >= 3) throw new MaxEnrollmentsExceededException(); if (student.HasProfessor(subject.ProfessorId)) throw new SameProfessorConstraintException(); } ``` ## Consecuencias ### Positivas - Defensa en profundidad - Separación de responsabilidades - UX mejorada (errores rápidos) - Seguridad garantizada (backend siempre valida) ### Negativas - Duplicación parcial de reglas - Mantener sincronizadas las validaciones ## Regla de Oro > **Nunca confíes en el frontend.** El backend SIEMPRE debe validar. ## Referencias - [OWASP Input Validation](https://owasp.org/www-community/Input_Validation)