Skip to content

Arquitectura de alto nivel ​

Este manual es de usuario, pero entender la arquitectura ayuda a ubicar cada funcionalidad en la capa correcta. La documentación técnica canónica vive en ARCHITECTURE.md del repositorio.

Dos codebases independientes ​

HUMAE NEW/
├── humae_backend/          Laravel 12 · PHP 8.3 · MySQL 8
│   ├── API REST v1         /api/v1/*
│   ├── Auth: Sanctum       tokens + SPA cookies
│   ├── Auth: Spatie        roles + permissions
│   ├── Policies            autorización por recurso
│   ├── Services            lógica de negocio
│   └── Jobs + Queues       ExpireMembershipsJob, mailers
│
├── humae_frontend/         Next.js 16 · React 19 · TypeScript
│   ├── App Router          server + client components
│   ├── TanStack Query      data fetching server state
│   ├── Zustand             session + UI state
│   ├── shadcn/ui           design system
│   └── Tailwind v4         estilos + tokens HUMAE
│
├── humae_docs/             VitePress · Markdown · Vue 3
│   └── Este manual
│
└── ARCHITECTURE.md         Documento técnico canónico

Contrato de API ​

Todas las respuestas del backend siguen el mismo envelope:

json
{
  "success": true,
  "message": "OK",
  "data": { /* payload */ },
  "meta": { "page": 1, "total": 42 }
}

En caso de error:

json
{
  "success": false,
  "message": "Validation failed",
  "errors": { "email": ["El correo ya está registrado"] }
}

Códigos HTTP semánticos: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 422 Validation, 429 Too Many Requests, 500 Internal Error.

Flujo de autenticación ​

HUMAE soporta dos modos de autenticación Sanctum:

Cliente (localhost:3000)          Backend (localhost:8000)
         │                                  │
         │  POST /sanctum/csrf-cookie       │
         │ ──────────────────────────────▶  │
         │                                  │
         │ ◀──── Cookie: XSRF-TOKEN ─────── │
         │                                  │
         │  POST /api/v1/auth/login         │
         │  { email, password }             │
         │  X-XSRF-TOKEN: ...               │
         │ ──────────────────────────────▶  │
         │                                  │
         │ ◀──── Cookie: humae_session ──── │
         │                                  │
         │  Todas las requests siguientes   │
         │  llevan la cookie automáticamente│

Modo 2 · Token — mobile / integraciones ​

POST /api/v1/auth/login           → { token: "1|abc...", user: {...} }
Authorization: Bearer 1|abc...    en cada request

Capas del backend ​

┌────────────────────────────────────────────────┐
│  Routes (routes/api.php)                       │
│  • Agrupadas por prefijo + middleware de rol   │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  Middleware                                    │
│  • auth:sanctum                                │
│  • role:candidate / role:recruiter / ...       │
│  • rate limits por endpoint                    │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  FormRequest (validación)                      │
│  • reglas Zod-like, mensajes en español        │
│  • autoriza con Policies antes de correr       │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  Controller                                    │
│  • Thin: valida, delega, responde              │
│  • Usa trait ApiResponse para envelope         │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  Service (lógica de negocio)                   │
│  • MembershipService, PipelineService, ...     │
│  • Transacciones DB                            │
│  • State Machines                              │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  Models (Eloquent)                             │
│  • Relaciones                                  │
│  • Casts a enums / carbon / json               │
│  • Scopes y atributos calculados               │
└──────────────────┬─────────────────────────────┘
                   ▼
┌────────────────────────────────────────────────┐
│  API Resource (transformación de salida)       │
│  • CandidateProfileResource, VacancyResource   │
└────────────────────────────────────────────────┘

Capas del frontend ​

app/                          Rutas (Next App Router)
  (auth)/                     Layout auth: login, register, forgot
  dashboard/                  Layout autenticado
  recruiter/                  Protegido por rol
  admin/                      Protegido por rol
  api/                        Opcional, proxy a backend

components/
  ui/                         shadcn/ui primitives
  shared/                     SiteHeader, Logo, NotificationBell
  motion/                     Variantes de animación

features/<módulo>/            Feature folders: hooks + components + api + types
  auth/
  profile/
  membership/
  directory/
  pipeline/
  interviews/
  psychometric/
  notifications/
  reports/

hooks/                        Custom hooks cross-feature
lib/
  api.ts                      Axios client + ApiError
  query-client.ts             TanStack factory
stores/
  auth-store.ts               Zustand auth session
schemas/                      Zod forms
types/                        TypeScript contracts

Persistencia ​

  • MySQL 8 (producción + dev). Estructura en 55+ tablas de dominio.
  • SQLite in-memory (tests). Automático vía phpunit.xml.
  • Redis (opcional): cache de queries pesadas, sesiones y queue.

Los índices están optimizados para las consultas del directorio, pipeline y reportes. Ver PERFORMANCE.md del repo.

Observabilidad ​

  • Logs: channel diario Laravel (storage/logs/laravel-YYYY-MM-DD.log).
  • Errores de API: mapeados uniformemente por ApiExceptionHandler (nunca exponen traza en producción).
  • Health endpoint: GET /api/v1/health devuelve estado DB + cache.
  • Reportes ejecutivos: dashboard /admin/reportes con métricas en tiempo real.

Deploy ​

  • Backend: servidor PHP 8.3 + MySQL 8 + Redis. Supervisor para queues + cron para scheduler (ver Cronjobs y tareas programadas).
  • Frontend: Vercel / Netlify / cualquier host estático compatible con Next.js (SSR + SSG).
  • Docs: cualquier host estático (Cloudflare Pages, Vercel, Netlify, GitHub Pages).

Detalles completos en el README.md del monorepo.

Siguiente ​

Entra a la sección que corresponda a tu rol:

Manual de usuario HUMAE · Uso interno