Skip to content

feat(engagement): add admin engagement screen (#182)#234

Merged
Azfe merged 4 commits into
developfrom
task/n04-03-03-engagement-screen
Jul 11, 2026
Merged

feat(engagement): add admin engagement screen (#182)#234
Azfe merged 4 commits into
developfrom
task/n04-03-03-engagement-screen

Conversation

@Azfe

@Azfe Azfe commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Read per-post metrics from the post_engagement_daily view (never raw engagement_sessions), aggregate the last 30 days and show one row per post with unique clicks, click rate, average rating and reactions, including loading/empty/error states. Summing unique_readers across days is safe because engagement_sessions holds one row per (user_id, post_id); averages are weighted and left null when there is no denominator. Staff is redirected away as UX only — the view's is_manager() guard is what enforces access. Reachable from the admin hub and, for managers, from the profile screen.

Closes #182

@Azfe

Azfe commented Jul 11, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Fix del CI: beforeAll timeout en el test de integración de track-engagement

Causa raíz

El readiness probe del workflow era falso. El curl no enviaba la cabecera apikey, y sin ella la Edge Function corta en su primer check y devuelve 401 {"error":"Missing Authorization header"} antes de crear el cliente de Supabase. El probe cantaba "ready" sin haber ejercitado el camino caro (resolución de los imports remotos + createClient + getUser).

Consecuencia: el cold start real lo acababa pagando el beforeAll de Jest, que reventaba su timeout de 30 s.

Comparativa de ambos probes contra la función local:

Probe Respuesta Qué ejercita
sin apikey {"error":"Missing Authorization header"} early-return, nada
con apikey {"error":"Unauthorized"} Kong inyecta AuthorizationcreateClient + getUser (camino caro)

Arreglo (dos partes)

1. .github/workflows/ci.yml — el probe ahora envía apikey (leída de supabase status -o env) y espera hasta obtener el Unauthorized de la propia función, que prueba que createClient + getUser ya están calientes. Así el arranque en frío se paga dentro del step de CI, fuera de cualquier timeout de Jest. Ventana ampliada a 60 intentos con -m 30 por petición.

2. supabase/functions/track-engagement/index.ts — imports movidos del CDN esm.sh a los registros oficiales:

import { createClient } from 'jsr:@supabase/supabase-js@2'   // antes: https://esm.sh/...
import { z } from 'npm:zod@3.23.8'                            // antes: https://esm.sh/...

Ataca la causa de fondo (la lentitud/flakiness del cold start venía de descargar el grafo de módulos desde un CDN de terceros) y alinea con la convención que ya seguía scrape-og en este repo, que usa jsr:.

Verificación

Simulé el step de CI eliminando el contenedor del edge runtime para forzar arranque desde cero:

  • Probe caliente en 1 s · 6/6 tests de trackEngagement PASS · sin errores en el log de la función.
  • Suite de integración completa → 4 suites, 13 tests PASS.
  • pnpm typecheck ✅ · pnpm lint --max-warnings=0 ✅.

Nota: en local el caché de módulos de Deno persiste, así que no se reproduce al 100 % el cold start de CI (la descarga real). Pero el probe ahora bloquea hasta que el camino caro responde, que es justo lo que faltaba.

Ficheros

  • .github/workflows/ci.yml
  • supabase/functions/track-engagement/index.ts

@Azfe
Azfe merged commit 174f1d0 into develop Jul 11, 2026
6 checks passed
@Azfe
Azfe deleted the task/n04-03-03-engagement-screen branch July 11, 2026 11:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant