5.3 KiB
Proyectos · SAM
Frontend del módulo de gestión de proyectos de la plataforma SAM, con estética y flujo de trabajo al estilo Linear.
Es una aplicación Next.js 16 + Bootstrap 5 (App Router, TypeScript). No
tiene backend propio: se apoya en SAM.API, la API compartida de SAM.
Características
- Issues: lista agrupada por estado, con filtros y edición en línea.
- Detalle: descripción, propiedades editables y comentarios.
- Tablero Kanban: arrastrar y soltar entre columnas de estado.
- Ciclos: sprints con progreso y issues asignados.
- Proyectos: agrupan issues, con lead, fechas y barra de progreso.
- Bandeja: issues abiertos asignados al usuario actual.
- Palette de comandos:
Cmd/Ctrl + Kpara navegar y crear issues.
Requisitos
- Node.js 22+
- npm
Desarrollo
npm install
npm run dev
La app queda en http://localhost:3000.
Scripts
| Comando | Descripción |
|---|---|
npm run dev |
Servidor de desarrollo |
npm run build |
Build de producción (standalone) |
npm run start |
Sirve el build de producción |
npm run typecheck |
Comprueba tipos sin emitir |
Arquitectura
src/
├── app/ # Rutas (App Router)
│ ├── inbox/ # Issues asignados al usuario
│ ├── issues/ # Lista de issues
│ │ └── [id]/ # Detalle de un issue
│ ├── board/ # Tablero Kanban
│ ├── cycles/ # Ciclos / sprints
│ └── projects/ # Proyectos
│ └── [id]/ # Detalle de proyecto
├── components/
│ ├── layout/ # Sidebar, Topbar, AppShell, palette
│ ├── issues/ # IssueList, IssueRow
│ ├── board/ # Tablero Kanban
│ └── ui/ # Avatar, iconos, etiquetas, progreso
├── hooks/
│ └── useIssues.ts # Carga de issues con filtros y refresco
└── lib/
├── types.ts # Modelo de dominio (contrato con SAM)
├── meta.ts # Definiciones de estado/prioridad/tipo
├── format.ts # Helpers de formato de fechas
├── seed.ts # Datos de ejemplo (mock)
├── store.tsx # Contexto de datos de referencia
└── api/
├── client.ts # Interfaz ProyectosApi
├── mock.ts # Implementación en memoria
└── index.ts # Selección de implementación
Capa de datos
Toda la app habla contra la interfaz ProyectosApi (src/lib/api/client.ts),
nunca contra una implementación concreta. Hay dos implementaciones:
httpApi(src/lib/api/http.ts): la real, contraSAM.API. Es la que se usa por defecto.mockApi(src/lib/api/mock.ts): datos en memoria sobresrc/lib/seed.ts, para desarrollar la UI sin backend. Se activa conNEXT_PUBLIC_USE_MOCK=true.
La selección está en src/lib/api/index.ts. Para cambiar de implementación
no hay que tocar componentes, hooks ni páginas: el contrato no cambia.
Autenticación
La API key global de SAM (X-Api-Key) nunca llega al navegador.
El navegador llama a /api/proyectos/* en el mismo origen. Ese route handler
(src/app/api/proyectos/[...path]/route.ts) reenvía la petición a SAM.API
añadiendo la cabecera en el servidor.
La clave vive en SAM_API_KEY, sin prefijo NEXT_PUBLIC_. Next.js solo
inyecta en el bundle JS las variables NEXT_PUBLIC_*, así que esta queda
restringida al proceso del servidor.
Sesión de usuario
AuthProvider (src/lib/auth.tsx) guarda en localStorage el miembro devuelto
por POST /api/proyectos/auth/login, que valida contra sige_sam_v3.usuario.
Ese idUsuario es quien firma los comentarios y filtra la bandeja.
Nota: los tipos de
src/lib/types.tsson el contrato esperado del backend. Los endpoints deSAM.APIdevuelven esta misma forma.
Despliegue en SAM
Sigue el patrón de módulo de SAM: frontend independiente conectado a la API
compartida a través de la red sam-net.
Dockerfile: build standalone de Next.js.docker-compose.module.yml: servicioproyectos-frontendcon healthcheck.
Dentro de la red sam-net el frontend alcanza el backend por nombre de
contenedor: SAM_API_URL=http://sam-api:5000.
SAM_API_KEY se inyecta desde el entorno del host (${SAM_API_KEY} en el
compose); no se escribe en el archivo.
Variables de entorno
| Variable | Quién la lee | Descripción |
|---|---|---|
SAM_API_URL |
servidor | URL base de SAM.API. Por defecto http://127.0.0.1:5000. |
SAM_API_KEY |
servidor | API key global de SAM (X-Api-Key). Sin ella el proxy responde 503. |
NEXT_PUBLIC_MODULE |
cliente | Identificador del módulo (informativo). |
NEXT_PUBLIC_USE_MOCK |
cliente | true para usar datos mock en memoria sin backend. |
SAM_API_URLySAM_API_KEYno llevan prefijoNEXT_PUBLIC_a propósito: solo las ve el proceso del servidor, así que la clave no se empaqueta en el JavaScript que descarga el navegador.