Saltar al contenido principal

Domain Layer (Entities & Domain Logic)

La capa Domain define el lenguaje del negocio dentro del frontend.

Aquí viven los modelos y las reglas que representan cómo el producto entiende sus datos, independientemente de:

  • cómo el backend los expone
  • cómo la UI los muestra
  • cómo se obtienen (REST, GraphQL, mock, etc.)

👉 El Domain es el punto de estabilidad de la arquitectura.

El Domain desacopla las interfaces

El Domain actúa como un contrato interno estable entre capas:

Infrastructure (API / DTOs)

Domain ← punto estable

Application / UI

Si cambia el backend → se ajustan transforms

Si cambia la UI → el Domain no cambia

Si cambian las reglas → cambias el Domain, no la UI ni la API

👉 El resto del sistema no conoce DTOs, solo conoce Domain models.

Estructura de un domain

domain/
├── model/
├── logic/
└── form/ # opcional — solo si el feature tiene formularios

Tipos de archivos en Domain

1. model.ts (Entities)

Qué es
Definición de las entidades del negocio tal como el frontend las entiende y utiliza.

Responsabilidad

  • Representar conceptos del negocio
  • Los modelos como los conoce el front y como son más facil de utilizar en capas posteriores
  • Usar nombres del negocio, no del backend

Ejemplo

export type User = {
id: string;
status: 'ACTIVE' | 'BLOCKED';
...
};

2. logic.ts (Domain logic)

Qué es

Funciones puras que operan sobre entidades.

Responsabilidad

  • Reglas

  • Validaciones

  • Invariantes

Ejemplo

export function canUserSubmit(user: User) {
return user.status === 'ACTIVE';
}

3. form.ts (Form Schemas & Types)

Qué es

Archivo que centraliza los esquemas de validación (Zod), tipos y valores por defecto de los formularios de un feature.

Responsabilidad

  • Definir esquemas Zod para validación de formularios
  • Exportar tipos inferidos desde los esquemas (z.infer)
  • Proveer factory functions para valores por defecto (createXDefaultValues)

Estructura de cada form

Cada formulario dentro del archivo sigue este patrón:

  1. Schema Zod — la definición de validación
  2. Type — inferido del schema con z.infer
  3. Default values factory — función que retorna valores iniciales

Ejemplo — auth.form.ts

// domain/auth.form.ts
import { z } from 'zod';

// 1. Schema Zod
export const loginFormDefinition = z.object({
email: z.string().min(1, 'El correo es obligatorio').email('Correo inválido'),
password: z.string().min(1, 'La contraseña es obligatoria'),
});

// 2. Type inferido
export type TLoginForm = z.infer<typeof loginFormDefinition>;

// 3. Default values factory
export function createLoginDefaultValues(
partial?: Partial<TLoginForm>
): TLoginForm {
return {
email: partial?.email ?? '',
password: partial?.password ?? '',
};
}

🧪 Testing de esta capa

Para ver lineamientos, alcance y ejemplos de pruebas del Domain layer, consulta:

👉 /docs/frontend/quality/testing/testing-by-layer/domain-test