mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:13:07 +00:00
O fail-closed silencioso da S3 deixava a assessoria cega: token errado não deixava rastro além do picker vazio. Fim da caixa-preta: - `instagramSyncStatus` (jsonb hidden) na global `social-feed-settings`, escrito pelo render, pelo afterChange (sync awaited quando a credencial IG muda) e pela rota `POST /api/social-feed/sync` (botão, auth admin + same-origin). - `InstagramApiError` + `describeInstagramError`: o fetch parseia o body de erro da Graph API e o mapeia para copy pt-BR com a correção (OAuthException/expired → "token inválido/expirado ou emitido via Facebook Login — gere pelo Instagram Login"; "Invalid user id" → confira o ID; 5xx → indisponível; TypeError → rede; AbortError → demorou demais). O ID só casa com "user" E "id" juntos (token rejections real falam "the user must be logged in" — não podem virar a branch de ID). - `InstagramSyncStatusPanel` (campo ui irmão do picker): 5 estados fiéis ao rascunho; gate respeita o master `enabled`; `outcome` transiente limpo ao editar credencial; aria-live nos boxes interativos. Home inalterada (fail-closed intacto). - Bug real: `afterChange` roda dentro da transação do save (row lock até os hooks retornarem); persistir o status via pool numa 2ª conexão deadlockava no lock da própria linha (~80-230s/save). Fix: persists do sync-hook na MESMA transação via `getPostgresTransactionDatabase` (C6); render/rota sem transação seguem no pool. Diagrama: UPDATE transactionid Lock vs idle in transaction; fix verificado 45ms vs 232s. - Stub IG ganha estado `invalid-token`; runbook docs/ops/instagram-feed-token-runbook.md; migration add_instagram_sync_status (jsonb nullable). - Débitos registrados: #124 (janela de lock) e #125 (polish P3). - Gates: unit 2463 + int 791; lint/format/tsc/cycles; build; e2e admin 5/5 + frontend serial 19/19. |
||
|---|---|---|
| .. | ||
| fixtures | ||
| helpers | ||
| admin.e2e.spec.ts | ||
| campaign-pwa.e2e.spec.ts | ||
| campaignActivity.e2e.spec.ts | ||
| campaignAgendaFeed.e2e.spec.ts | ||
| campaignAgendaGoogleSync.e2e.spec.ts | ||
| campaignAgendaMobile.e2e.spec.ts | ||
| campaignAiChatFollowUps.e2e.spec.ts | ||
| campaignAiChatOpeningChips.e2e.spec.ts | ||
| campaignAiChatResize.e2e.spec.ts | ||
| campaignAiLinks.e2e.spec.ts | ||
| campaignAiTranscribe.e2e.spec.ts | ||
| campaignAuth.e2e.spec.ts | ||
| campaignBottomNav.e2e.spec.ts | ||
| campaignColumnPicker.e2e.spec.ts | ||
| campaignConcepts.e2e.spec.ts | ||
| campaignContacts.e2e.spec.ts | ||
| campaignDemandVisibility.e2e.spec.ts | ||
| campaignHomeActions.e2e.spec.ts | ||
| campaignIosInputZoom.e2e.spec.ts | ||
| campaignLeaderships.e2e.spec.ts | ||
| campaignMunicipalities.e2e.spec.ts | ||
| campaignMunicipalityResponsiveColumns.e2e.spec.ts | ||
| campaignNearestMunicipality.e2e.spec.ts | ||
| campaignNewsletter.e2e.spec.ts | ||
| campaignPeople.e2e.spec.ts | ||
| campaignRegisterDemand.e2e.spec.ts | ||
| campaignSavedFilters.e2e.spec.ts | ||
| campaignSollinhaContext.e2e.spec.ts | ||
| campaignSollinhaWidth.e2e.spec.ts | ||
| campaignTableStickyHeader.e2e.spec.ts | ||
| campaignTerritoriesColumns.e2e.spec.ts | ||
| campaignTerritoriesHttp.e2e.spec.ts | ||
| campaignUpdatesMobile.e2e.spec.ts | ||
| campaignWebAuthn.e2e.spec.ts | ||
| campaignWizardChrome.e2e.spec.ts | ||
| campaignZoneMap.e2e.spec.ts | ||
| frontend.e2e.spec.ts | ||
| instagram-stub.mjs | ||
| seedParity.setup.e2e.spec.ts | ||
| setup.e2e.spec.ts | ||
| youtube-stub.mjs | ||