diff --git a/docs/plan-web-fases.md b/docs/plan-web-fases.md index 7ee7de2..696969d 100644 --- a/docs/plan-web-fases.md +++ b/docs/plan-web-fases.md @@ -129,7 +129,7 @@ Resultado (implementado) - Integración: - Cambios aplicados en AppShell y Toast, evitando solapes y reservando espacio en main. -Fase 4 — Optimización: endpoint “overview” y orden en servidor +Fase 4 — Optimización: endpoint “overview” y orden en servidor — Estado: Completada Objetivos - Evitar N peticiones en /app para el bloque “sin responsable”. - Servir orden “por grupo” ya resuelto en servidor. @@ -144,6 +144,14 @@ Archivos a crear/editar - apps/web/src/routes/app/+page.server.ts - Consumir overview para reducir llamadas y aplicar el orden de servidor. +Resultado (implementado) +- Endpoint GET /api/me/tasks/overview creado. +- Devuelve assigned y unassigned (abiertas) con order=due|group_then_due (mapeo desde la UI: group → group_then_due). +- En cada tarea: id, description, due_date, group_id, group_name (null en personales), display_code, assignees[] (vacío en unassigned). +- Gating aplicado: assigned según /api/me/tasks; unassigned solo de grupos allowed con membresía activa del usuario; exclusión de personales en unassigned. +- /app/+page.server.ts consume overview para “sin responsable” y elimina el N+1; se mantiene /api/me/tasks para “Mis tareas (abiertas)” con su paginación actual. +- Respuestas con cache-control: no-store. + Fase 5 — Responsables: conteo, marca “tú” y popover con wa.me Objetivos - Mostrar de forma compacta cuántas personas están asignadas; marcar si el usuario actual está entre ellas; listar números y permitir mensaje directo (wa.me) bajo demanda. @@ -185,3 +193,11 @@ Siguientes pasos 3) Validar en móvil; luego abordar Fase 3 (tabs inferiores). 4) Optimizar con overview (Fase 4) y cerrar UX de responsables (Fase 5). 5) Pulido y documentación (Fase 6). + +Anexo — Ajustes opcionales futuros (Fase 4) +- Parámetro include=assigned|unassigned|both en /api/me/tasks/overview (por defecto unassigned) para reducir coste cuando solo se necesite una parte. +- Paginación en overview (assigned y/o unassigned) con parámetros page/limit independientes. +- Índices de rendimiento sugeridos (si el dataset crece): + - CREATE INDEX IF NOT EXISTS idx_tasks_group ON tasks(group_id); + - CREATE INDEX IF NOT EXISTS idx_tasks_due_open ON tasks(due_date) WHERE COALESCE(completed, 0) = 0; +- Cacheabilidad opcional con ETag/If-None-Match si se añade una versión por usuario; mantener no-store por defecto.