- 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.