S2-FOLLOWUP — validate do itemId (excludedItems do YouTube) é código morto; produção sem validação de ID de vídeo #40

Closed
opened 2026-08-18 13:28:11 +00:00 by fsolla · 2 comments
Owner
id depends serializes priority model
S2-FOLLOWUP
S2
P2 deepseek-v4-flash

Follow-up da entrega S2 (Issue #18, seção de conteúdos com YouTube na home de campanha).

Problema

O validate do campo itemId em src/globals/SocialFeedSettings.ts (excludedItems) é código morto: ele lê data.platform, mas em ambos os caminhos o data passado ao validate é o documento inteiro, não a linha do array — server-side em beforeChange (siblingData: row, data: deepMerge(doc, data) — payload/dist/fields/hooks/beforeChange/promise.js:209) e no admin em useField (data: documentForm.getData(), siblingData: getSiblingData(path)). Logo data.platform é sempre undefined e o guard nunca dispara — produção não tem validação nenhuma de ID de vídeo do YouTube.

O e2e do S2 (tests/e2e/youtube-stub.mjs + frontend.e2e.spec.ts) depende dessa mortandade: os ids do stub têm 20 chars (e2e-video-destaque-1 etc.), fora do padrão [A-Za-z0-9_-]{11} que o validate declara — um "conserto" isolado do validate quebra os testes renders the YouTube feed with exclusions… e keeps the last snapshot… (400 no write de exclusão).

Correção em dupla (obrigatória)

  1. Validar via siblingData.platform (ou remover o validate e deixar o campo livre);
  2. Trocar os ids do stub para 11 chars exatos (ex.: e2evidest1) e atualizar os excludedItems no spec;
  3. Re-rodar o e2e do describe "Campaign home content section".

Fora do escopo: mexer no S2 entregue em produção.

--- id: S2-FOLLOWUP depends: [S2] serializes: [] priority: P2 model: deepseek-v4-flash --- Follow-up da entrega S2 (Issue #18, seção de conteúdos com YouTube na home de campanha). ## Problema O `validate` do campo `itemId` em `src/globals/SocialFeedSettings.ts` (excludedItems) é **código morto**: ele lê `data.platform`, mas em ambos os caminhos o `data` passado ao validate é o documento inteiro, não a linha do array — server-side em `beforeChange` (`siblingData: row`, `data: deepMerge(doc, data)` — payload/dist/fields/hooks/beforeChange/promise.js:209) e no admin em `useField` (`data: documentForm.getData()`, `siblingData: getSiblingData(path)`). Logo `data.platform` é sempre `undefined` e o guard nunca dispara — **produção não tem validação nenhuma de ID de vídeo do YouTube**. O e2e do S2 (`tests/e2e/youtube-stub.mjs` + `frontend.e2e.spec.ts`) **depende dessa mortandade**: os ids do stub têm 20 chars (`e2e-video-destaque-1` etc.), fora do padrão `[A-Za-z0-9_-]{11}` que o validate declara — um "conserto" isolado do validate quebra os testes `renders the YouTube feed with exclusions…` e `keeps the last snapshot…` (400 no write de exclusão). ## Correção em dupla (obrigatória) 1. Validar via `siblingData.platform` (ou remover o validate e deixar o campo livre); 2. Trocar os ids do stub para 11 chars exatos (ex.: `e2evidest1`) e atualizar os `excludedItems` no spec; 3. Re-rodar o e2e do describe "Campaign home content section". Fora do escopo: mexer no S2 entregue em produção.
fsolla added a new dependency 2026-08-18 13:28:16 +00:00
fsolla added the
prio:P2
label 2026-08-18 13:28:21 +00:00
Author
Owner

S3 (2026-08-18) — impacto estendido: a entrega S3 (Issue #20) adiciona platform: 'instagram' ao mesmo excludedItems e o picker de exclusão no admin (InstagramPostExclusionPicker) escreve os IDs via useField — a mortandade do validate continua (o picker não passa por validate, e os ids do stub IG e2e-ig-muro-1 etc. também estão fora de qualquer padrão). Mitigação prática: o picker só grava IDs vindos do snapshot (IDs reais da API), então o impacto em produção para IG é baixo; para YouTube segue como registrado. A correção em dupla desta issue deve cobrir os dois stubs (YT 11 chars + IG) se o validate passar a valer por siblingData.platform.

**S3 (2026-08-18) — impacto estendido:** a entrega S3 (Issue #20) adiciona `platform: 'instagram'` ao mesmo `excludedItems` e o picker de exclusão no admin (`InstagramPostExclusionPicker`) escreve os IDs via `useField` — a mortandade do validate continua (o picker não passa por validate, e os ids do stub IG `e2e-ig-muro-1` etc. também estão fora de qualquer padrão). Mitigação prática: o picker só grava IDs vindos do snapshot (IDs reais da API), então o impacto em produção para IG é baixo; para YouTube segue como registrado. A correção em dupla desta issue deve cobrir os dois stubs (YT 11 chars + IG) se o validate passar a valer por `siblingData.platform`.
Author
Owner

Tracker migrado para o GitHub — continue em #gh775 (github.com/fsolla/teqo/issues/775). Esta Issue Forgejo está fechada.

Tracker migrado para o GitHub — continue em #gh775 (github.com/fsolla/teqo/issues/775). Esta Issue Forgejo está fechada.
Sign in to join this conversation.
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.

Reference: fsolla/teqo#40
No description provided.