feat(S2): seção de conteúdos da home de campanha inclui os vídeos do YouTube #57

Merged
fsolla merged 1 commit from S2-secao-de-conteudos-na-home-de-campanha-youtube into main 2026-08-18 18:58:58 +00:00
Owner

Fechamento da Issue #18 (S2) — a home de campanha ganha os vídeos do canal do YouTube como conteúdo nativo, ao lado dos artigos.

O que muda

  • Nova global social-feed-settings (grupo Configurações, admin-only): enabled (kill switch "Feed ativo"), youtubeEnabled, youtubeApiKey, youtubeChannelId, youtubeMaxItems, excludedItems (exclusão por item com motivo) e snapshot oculto do último feed.
  • Loader src/utilities/youtubeFeed.ts (server-only): busca da Data API v3 (search → statistics), parse/formatação pt-BR (views "12,4 mil"/"1,2 mi"), cache ISR revalidate: 300 sob a tag social-feed (allowlist do /api/revalidate atualizada) e fail-closed: recurso desligado → null (seção vira S1); API fora com snapshot → cards do snapshot; sem snapshot → sem cards YouTube, artigos intactos; kill switch → só artigos.
  • Snapshot persistido via SQL cru (UPDATE-then-INSERT, sem hooks) — revalidateTag dentro de unstable_cache lança no Next 15.4 (verificado no source).
  • UI: CampaignContentCard generalizado (artigos + vídeos; externos abrem no YouTube em nova aba), seção "Acompanhe de perto" merge por recência (grande = mais recente), link "YouTube →" quando o feed está configurado, carrossel com ariaLabel "Conteúdos recentes".
  • Migration 20260818_111748_add_social_feed_settings (aplicada em dev + test; prod aplica no build).

Testes

  • Unit: youtubeFeed.unit.spec.ts (15) — parsers, formatadores, eligibility, dedupe, fallback.
  • E2e (stub HTTP determinístico da API, 4 testes novos em frontend.e2e.spec.ts): feed renderizado com exclusões + abertura no YouTube; falha de API sem snapshot; snapshot servido durante outage; kill switch.
  • Gate local completo verde (pnpm push): lint/format/tsc/knip/cycles/unit (2306)/int (791)/build/e2e (172 passed; 3 flaky ambientais).
  • Prod build validado com /privacidade (cache local do Next sanitizado — ver nota no changelog).

Artefatos

  • Plano aprovado: docs/plans/secao-conteudos-home-youtube-impl.md
  • Changelog: docs/changelog/2026-08-18-s2.md
  • Débito registrado: Issue #40 (validação do itemId na global é código morto; e2e depende do comportamento atual).

Closes #18

Fechamento da Issue #18 (S2) — a home de campanha ganha os vídeos do canal do YouTube como conteúdo nativo, ao lado dos artigos. **O que muda** - Nova global `social-feed-settings` (grupo Configurações, admin-only): `enabled` (kill switch "Feed ativo"), `youtubeEnabled`, `youtubeApiKey`, `youtubeChannelId`, `youtubeMaxItems`, `excludedItems` (exclusão por item com motivo) e snapshot oculto do último feed. - Loader `src/utilities/youtubeFeed.ts` (server-only): busca da Data API v3 (search → statistics), parse/formatação pt-BR (views "12,4 mil"/"1,2 mi"), cache ISR `revalidate: 300` sob a tag `social-feed` (allowlist do `/api/revalidate` atualizada) e **fail-closed**: recurso desligado → `null` (seção vira S1); API fora com snapshot → cards do snapshot; sem snapshot → sem cards YouTube, artigos intactos; kill switch → só artigos. - Snapshot persistido via SQL cru (UPDATE-then-INSERT, sem hooks) — `revalidateTag` dentro de `unstable_cache` lança no Next 15.4 (verificado no source). - UI: `CampaignContentCard` generalizado (artigos + vídeos; externos abrem no YouTube em nova aba), seção "Acompanhe de perto" merge por recência (grande = mais recente), link "YouTube →" quando o feed está configurado, carrossel com ariaLabel "Conteúdos recentes". - Migration `20260818_111748_add_social_feed_settings` (aplicada em dev + test; prod aplica no build). **Testes** - Unit: `youtubeFeed.unit.spec.ts` (15) — parsers, formatadores, eligibility, dedupe, fallback. - E2e (stub HTTP determinístico da API, 4 testes novos em `frontend.e2e.spec.ts`): feed renderizado com exclusões + abertura no YouTube; falha de API sem snapshot; snapshot servido durante outage; kill switch. - Gate local completo verde (`pnpm push`): lint/format/tsc/knip/cycles/unit (2306)/int (791)/build/e2e (172 passed; 3 flaky ambientais). - Prod build validado com `/privacidade` (cache local do Next sanitizado — ver nota no changelog). **Artefatos** - Plano aprovado: `docs/plans/secao-conteudos-home-youtube-impl.md` - Changelog: `docs/changelog/2026-08-18-s2.md` - Débito registrado: Issue #40 (validação do `itemId` na global é código morto; e2e depende do comportamento atual). Closes #18
fsolla added 1 commit 2026-08-18 16:50:47 +00:00
feat(S2): seção de conteúdos da home de campanha inclui os vídeos do YouTube
Some checks failed
CI (PR) / lint (pull_request) Successful in 40s
CI (PR) / docs-guards (pull_request) Successful in 8s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / format (pull_request) Successful in 51s
CI (PR) / e2e (1) (pull_request) Failing after 25s
CI (PR) / build (pull_request) Failing after 1m32s
CI (PR) / int (pull_request) Failing after 1m46s
CI (PR) / cycles (pull_request) Successful in 36s
CI (PR) / typecheck (pull_request) Successful in 33s
CI (PR) / knip (pull_request) Successful in 38s
CI (PR) / unit (pull_request) Successful in 57s
Agent pool supervisor / tick (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Has been skipped
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 11s
CI (PR) / scope (pull_request) Successful in 29s
CI (PR) / e2e (2) (pull_request) Successful in 5m58s
CI (PR) / checks (pull_request) Failing after 2s
30c26aed1b
Board "Acompanhe de perto" (S1) ganha o feed automático do canal oficial:
global SocialFeedSettings (admin-only, kill switch + toggle + maxItems +
exclusões por item), loader src/utilities/youtubeFeed.ts (Data API v3
search→statistics, unstable_cache tag social-feed + revalidate 300,
fail-closed com snapshot persistido via SQL direto — revalidateTag dentro
de unstable_cache lança no Next 15.4), card generalizado
(CampaignArticleCard → CampaignContentCard, external com noopener) e merge
por recência com o grande = mais recente elegível. Stub HTTP do YouTube no
webServer do Playwright (porta dev+1000) + 4 e2e novos no describe serial.
Migration 20260818_111748_add_social_feed_settings (não destrutiva).
Closes #18
fsolla closed this pull request 2026-08-18 18:09:07 +00:00
fsolla reopened this pull request 2026-08-18 18:09:18 +00:00
fsolla force-pushed S2-secao-de-conteudos-na-home-de-campanha-youtube from 30c26aed1b to fe5b11cf24 2026-08-18 18:27:56 +00:00 Compare
fsolla merged commit fe5b11cf24 into main 2026-08-18 18:58:58 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#57
No description provided.