Skip to content

release: engagement de posts (N03 + N04) — comentarios, valoraciones, tracking y dashboard#240

Merged
Azfe merged 78 commits into
mainfrom
develop
Jul 11, 2026
Merged

release: engagement de posts (N03 + N04) — comentarios, valoraciones, tracking y dashboard#240
Azfe merged 78 commits into
mainfrom
develop

Conversation

@Azfe

@Azfe Azfe commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Resumen

Release de developmain con las épicas N03 (interacción con posts) y N04 (engagement) completas, más un bloque de correcciones de sesión, routing y manejo de errores detectadas en QA.

Incluye las PRs #214#239 (78 commits, 80 ficheros, +5.275 / −135).

Qué entra

N03 · Interacción con posts

N04 · Engagement

Correcciones

Infraestructura y tests

  • .github/: CODEOWNERS, plantilla de PR y ruleset de protección de main y develop.
  • CI: se sirve y se precalienta la Edge Function antes de los tests de integración; la anon key se lee de supabase status --output json.
  • Cobertura nueva: pgTAP para engagement_sessions, track_engagement, ambas vistas de engagement y RLS de comentarios/valoraciones; tests unitarios de hooks, cola offline y errores; integración end-to-end de track-engagement y del dashboard.

Migraciones

Requiere aplicar las migraciones de supabase/migrations/ (comentarios, RLS de ratings, columnas aditivas de engagement_sessions, RPCs y vistas de engagement) y desplegar la Edge Function track-engagement.

Verificación

  • Suite de tests en verde (pnpm test)
  • Tests RLS de supabase/tests/rls/ en verde
  • Migraciones aplicadas en el proyecto de producción
  • Edge Function track-engagement desplegada

Piedra-1988 and others added 30 commits July 8, 2026 20:06
…ents-schema

feat(db): align post_comments schema with N03 spec — body CHECK + pag…
…mments-ui

feat(comments): mobile UI to create/list post comments (paginated) — …
test(rls): add post_comments INSERT-negative case + align ADR-002 pol…
feat(comments): post comment count aggregate + finalize RLS moderation
…ng-ui

feat(ratings): add StarRating UI with optimistic idempotent upsert (#169)
…ratings

feat(ratings): formalize post_ratings RLS policy names to _own (#168)
feat(ratings): show post rating average in the feed (#159)
…k-register

feat(engagement): track link_clicked before opening external link (#170)
Detecta lectura real de un post combinando AppState, foco de navegación
(useIsFocused) y scroll:

- sessionId estable por sesión de lectura (expo-crypto randomUUID).
- focusedSeconds solo avanza mientras app en primer plano y pantalla enfocada.
- maxScrollPct monótono en [0,1] desde onScroll.
- heartbeat de 5s que emite init/tick a un sink inyectable (opts.onEvent);
  la cola offline real llega en I-F-N04-01-02.
- cleanup de timer y listener de AppState en unmount.

Closes #176

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…engagement

feat(engagement): hook usePostEngagement (#176)
Cola FIFO persistente que entrega los eventos de usePostEngagement a la
Edge Function track-engagement, sobreviviendo a caídas de red y cierres de app:

- lib/engagement/queue.ts: enqueue/flush/size sobre AsyncStorage (@engagement/queue),
  cap de 500 con descarte FIFO + dropped_count, envío en lotes de ≤50 vía fetch,
  backoff exponencial 1s→30s, 401 → refresh de sesión + 1 reintento, 4xx → descarte.
- lib/engagement/sink.ts: adaptador de EngagementEvent (focusedSeconds acumulado)
  a EngagementPayload del servidor (focused_seconds_delta).
- lib/engagement/sync.ts: flush() al recuperar conectividad (NetInfo).
- lib/engagement.ts → lib/engagement/index.ts (conserva trackLinkClick + re-exports).
- jest.setup.ts: mocks globales de AsyncStorage y NetInfo.

Añade @react-native-async-storage/async-storage y @react-native-community/netinfo.
El cableado en la pantalla y el consumo del nuevo payload (Edge Function/DB) quedan
para issues posteriores (integración y N04-02-02).

Closes #177

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s-offline-queue

feat(engagement): heartbeats + cola offline (#177)
…lient

feat(engagement): wire post engagement tracking into UI (#173)
…del (#178)

Sustituye el modelo (user_id, post_id)/link_clicked de ADR-001 por uno
por sesión de lectura: 1 fila por session_id con focused_seconds,
max_scroll_pct y state (viewed → skimmed → read).

- migración 20260710000000: dropea la tabla anterior y recrea
  engagement_sessions (session_id PK, FK post_id/user_id on delete cascade,
  CHECK en focused_seconds y max_scroll_pct, enum engagement_state,
  índices, trigger updated_at, enable RLS + grant select).
- schema_engagement_sessions.sql: tests pgTAP de estructura, constraints,
  upsert por session_id y cascades (post y perfil).
- rls_engagement_sessions.sql: reemplazado por test de default-deny
  (las policies reales llegan en EPIC-S00).
- ADR-0003 (reading sessions) supersede ADR-001; database.types.ts
  actualizado al nuevo esquema + enum engagement_state.

Alcance: solo tabla + RLS enable + tests SQL. La Edge Function
track-engagement queda incoherente hasta #179; policies RLS en EPIC-S00.
FK user_id -> profiles(id): #179 y EPIC-S00 deben mapear auth.uid() -> profiles.id.

supabase db reset + pgTAP: 144 tests PASS. typecheck + lint en verde.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Surround lists with blank lines (blanks-around-lists) so the ADR markdown
lint CI check passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t-sessions-table

feat(engagement): engagement_sessions reading-session model (#178)
Azfe and others added 29 commits July 11, 2026 12:09
…t-metrics

feat(engagement): add post_engagement_metrics view + tests (#180)
…gement-daily

feat(engagement): add post_engagement_daily materialized view + tests (#181)
…t-screen

feat(engagement): add admin engagement screen (#182)
…ashboard

feat(engagement): add manual refresh RPC + dashboard e2e test (#175)
feat(engagement): surface the engaged state on the dashboard (#172)
…rors

fix(errors): surface Supabase query errors instead of swallowing them
…ofiles-public

fix(posts): embed author via profiles_public so staff can load the feed
…irect-loop

fix(session): share auth state via SessionProvider to stop redirect loop
@Azfe
Azfe merged commit 488e102 into main Jul 11, 2026
6 checks passed
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.

2 participants