feat(S3): seção de conteúdos da home de campanha inclui os posts do Instagram #71

Merged
fsolla merged 4 commits from S3-secao-de-conteudos-na-home-de-campanha-instagram into main 2026-08-19 00:01:38 +00:00
Owner

S3 — a seção "Acompanhe de perto" da home de campanha (S1 artigos + S2 YouTube) ganha os posts do Instagram oficial, completando o board do plano-site §4.2.

  • Loader irmão src/utilities/socialFeed/instagramFeed.ts — os feeds externos mudaram para o subfolder socialFeed/ (o pin da S2 predizia exatamente isso; git mv preserva o histórico): Graph API (/media com children p/ carrossel + username), unstable_cache tag social-feed + revalidate: 300, snapshot cru pré-exclusão persistido via SQL direto, refresh de token automático (refresh-on-failure + retry; só tokens de Instagram Login — page tokens caem no fail-closed, nota no admin).
  • Requisito nº 1 — picker de exclusão no admin: primeiro componente custom do repo (InstagramPostExclusionPicker, campo ui + importmap) — lista os posts do snapshot com thumbnail e toggle "Não exibir" que escreve em excludedItems (mecanismo unificado da S2).
  • UI: coverAspect: 'square' (1:1 do rascunho aprovado), badge "Instagram", título = legenda (fallback p/ post de grade sem legenda), clique no permalink (nova aba), link "Seguir no Instagram →".
  • Global SocialFeedSettings estendida (5 campos IG) — migration 20260818_192948_add_instagram_social_feed_fields não destrutiva.
  • Testes: 16 units novas; e2e com stub irmão (porta dev+2000, helper socialStub.ts) — 3 testes novos no describe serial + kill switch estendido + smoke do picker no admin. Local: 9/9 serial + 1/1 admin; prod-mode 9/9 ×2; unit 2351 + int 791; gates verdes.
  • Fix de flake compartilhado do describe (medido no CI deste PR): o page.goto('/') servia a cópia stale do cache heurístico do Chromium (ISR s-maxage sem max-age) após o bust — navegação com URL única /?e2e=<ts> erra todas as entradas de cache; e2e (1) e (2) verdes no CI.

Impl plan: docs/plans/secao-conteudos-home-instagram-impl.md (aprovado no gate humano). Closes #20.

changelog-rewrite: rebase dos 3 commits de main (S6-FOLLOWUP, OPS62, OPS63) — o pnpm changelog:build deduplicou blocos idênticos duplicados no agregado de main (S6-FOLLOWUP/OPS61/OPS62 apareciam 2×; mesmo texto, sem perda).

**S3** — a seção "Acompanhe de perto" da home de campanha (S1 artigos + S2 YouTube) ganha os posts do Instagram oficial, completando o board do plano-site §4.2. - **Loader irmão** `src/utilities/socialFeed/instagramFeed.ts` — os feeds externos mudaram para o subfolder `socialFeed/` (o pin da S2 predizia exatamente isso; `git mv` preserva o histórico): Graph API (`/media` com `children` p/ carrossel + username), `unstable_cache` tag `social-feed` + `revalidate: 300`, snapshot cru pré-exclusão persistido via SQL direto, **refresh de token automático** (refresh-on-failure + retry; só tokens de Instagram Login — page tokens caem no fail-closed, nota no admin). - **Requisito nº 1 — picker de exclusão no admin**: primeiro componente custom do repo (`InstagramPostExclusionPicker`, campo `ui` + importmap) — lista os posts do snapshot com thumbnail e toggle "Não exibir" que escreve em `excludedItems` (mecanismo unificado da S2). - **UI**: `coverAspect: 'square'` (1:1 do rascunho aprovado), badge "Instagram", título = legenda (fallback p/ post de grade sem legenda), clique no `permalink` (nova aba), link "Seguir no Instagram →". - Global `SocialFeedSettings` estendida (5 campos IG) — migration `20260818_192948_add_instagram_social_feed_fields` não destrutiva. - Testes: 16 units novas; e2e com stub irmão (porta dev+2000, helper `socialStub.ts`) — 3 testes novos no describe serial + kill switch estendido + smoke do picker no admin. Local: 9/9 serial + 1/1 admin; prod-mode 9/9 ×2; unit 2351 + int 791; gates verdes. - Fix de flake compartilhado do describe (medido no CI deste PR): o `page.goto('/')` servia a cópia stale do cache heurístico do Chromium (ISR s-maxage sem max-age) após o bust — navegação com URL única `/?e2e=<ts>` erra todas as entradas de cache; e2e (1) e (2) verdes no CI. Impl plan: `docs/plans/secao-conteudos-home-instagram-impl.md` (aprovado no gate humano). Closes #20. changelog-rewrite: rebase dos 3 commits de main (S6-FOLLOWUP, OPS62, OPS63) — o `pnpm changelog:build` deduplicou blocos idênticos duplicados no agregado de main (S6-FOLLOWUP/OPS61/OPS62 apareciam 2×; mesmo texto, sem perda).
fsolla added 2 commits 2026-08-18 21:22:58 +00:00
Board "Acompanhe de perto" (S1+S2) ganha o feed automático do perfil oficial:
loader irmão src/utilities/socialFeed/instagramFeed.ts (Graph API /media com
children p/ carrossel + username, unstable_cache tag social-feed + revalidate
300, snapshot cru pré-exclusão persistido via SQL direto, refresh de token
automático com retry 1x — refresh endpoint só renova tokens de Instagram
Login, page tokens caem no fail-closed), global SocialFeedSettings estendida
(instagramEnabled/AccessToken/UserId/MaxItems + snapshot hidden; excludedItems
já cobria a plataforma desde a S2). Requisito nº 1 — picker de exclusão no
admin (primeiro componente custom do repo, campo ui + importmap): lista os
posts do snapshot com thumbnail e toggle "Não exibir" que escreve em
excludedItems. Card com coverAspect square (1:1 do rascunho), badge
Instagram, título = legenda com fallback para post sem legenda, clique no
permalink (noopener), link "Seguir no Instagram →" derivado do username.
Os feeds externos mudam para o subfolder socialFeed/ (pin da S2 previa).
Migration 20260818_192948_add_instagram_social_feed_fields (não destrutiva).
Stub IG no webServer (porta dev+2000, helper socialStub.ts) + 3 e2e novos no
describe serial + kill switch estendido + smoke do picker no admin.
Closes #20
style: prettier no changelog agregado (pós-rebase S6+S3)
Some checks failed
CI (PR) / scope (pull_request) Successful in 30s
CI (PR) / lint (pull_request) Successful in 42s
CI (PR) / format (pull_request) Successful in 52s
CI (PR) / docs-guards (pull_request) Successful in 7s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / typecheck (pull_request) Successful in 34s
CI (PR) / knip (pull_request) Successful in 34s
CI (PR) / cycles (pull_request) Successful in 37s
CI (PR) / unit (pull_request) Successful in 55s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 11m52s
CI (PR) / int (pull_request) Successful in 2m14s
CI (PR) / build (pull_request) Successful in 2m44s
CI (PR) / e2e (1) (pull_request) Successful in 5m59s
CI (PR) / e2e (2) (pull_request) Failing after 5m24s
CI (PR) / checks (pull_request) Failing after 1s
9705faeaf8
fsolla added 1 commit 2026-08-18 22:48:52 +00:00
fix(e2e S3): goto da home com URL cache-busting no describe da seção de conteúdos
Some checks failed
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 16s
CI (PR) / scope (pull_request) Successful in 47s
CI (PR) / lint (pull_request) Successful in 1m2s
CI (PR) / format (pull_request) Successful in 1m6s
CI (PR) / docs-guards (pull_request) Successful in 8s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / typecheck (pull_request) Successful in 37s
CI (PR) / knip (pull_request) Successful in 38s
CI (PR) / cycles (pull_request) Successful in 38s
CI (PR) / unit (pull_request) Successful in 1m6s
CI (PR) / int (pull_request) Successful in 3m38s
CI (PR) / build (pull_request) Successful in 2m53s
CI (PR) / e2e (2) (pull_request) Successful in 4m46s
CI (PR) / e2e (1) (pull_request) Successful in 5m10s
CI (PR) / checks (pull_request) Successful in 1s
9108f441bc
O poll (request.get) convergia no HTML fresco, mas o page.goto servia a
cópia stale do cache heurístico do Chromium (ISR s-maxage sem max-age)
quando a regeneração pós-bust ainda não tinha completado — flake medido no
CI (YT snapshot da S2, 2 flaky) e no prod-mode local (IG snapshot 3/3
retries). cache:'no-cache' não existe nos tipos do Playwright 1.58 e reload
reduz mas não elimina a janela. URL única (?e2e=<ts>) erra todas as
entradas de cache (HTTP + router do Next) e a página sempre vem fresca do
servidor; prod-mode local 9/9 × 2.
fsolla force-pushed S3-secao-de-conteudos-na-home-de-campanha-instagram from 9108f441bc to 46038d5a6a 2026-08-18 23:32:45 +00:00 Compare
fsolla added 1 commit 2026-08-18 23:51:41 +00:00
ci: retry — pool de redes Docker do runner esgotado (infra); redes órfãs podadas
Some checks failed
CI (PR) / checks (pull_request) Successful in 9m40s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 9m50s
Agent pool supervisor / tick (pull_request) Successful in 31s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 12s
CI / checks (push) Successful in 10m12s
CI / deploy homeserver (teqo-1313) (push) Failing after 19m57s
4522fe4b74
fsolla merged commit 4522fe4b74 into main 2026-08-19 00:01:38 +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#71
No description provided.