teqo-backup/src/utilities/revalidateRequest.ts
Francisco Solla fe5b11cf24 feat(S2): seção de conteúdos da home de campanha inclui os vídeos do YouTube
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
2026-08-18 15:23:50 -03:00

52 lines
1.7 KiB
TypeScript

import { ELECTION_TSE_CACHE_TAG } from '@/utilities/electionCache'
import { getGlobalCacheTag } from '@/utilities/globals'
import { MUNICIPALITY_CATALOG_CACHE_TAG } from '@/utilities/municipality/municipalityCatalogCache'
export const REVALIDATE_POSTS_TAG = 'posts' as const
export const REVALIDATE_PRIVACY_POLICY_CACHE_TAG = getGlobalCacheTag('privacy-policy')
/**
* Cache tag of the campaign home content board's external feeds (`unstable_cache`
* entry of `getYouTubeFeed`). The `SocialFeedSettings` global's `afterChange`
* busts it; the runbook tag is also allowlisted here for direct-DB writes.
*/
export const REVALIDATE_SOCIAL_FEED_TAG = 'social-feed' as const
const ALLOWED_REVALIDATE_TAGS = [
REVALIDATE_POSTS_TAG,
REVALIDATE_PRIVACY_POLICY_CACHE_TAG,
ELECTION_TSE_CACHE_TAG,
MUNICIPALITY_CATALOG_CACHE_TAG,
REVALIDATE_SOCIAL_FEED_TAG,
] as const
type AllowedRevalidateTag = (typeof ALLOWED_REVALIDATE_TAGS)[number]
const allowedTagSet = new Set<string>(ALLOWED_REVALIDATE_TAGS)
export type ResolveRevalidateTagResult =
| { ok: true; tag: AllowedRevalidateTag }
| { ok: false; error: string }
const isAllowedRevalidateTag = (tag: string): tag is AllowedRevalidateTag => allowedTagSet.has(tag)
export const resolveRevalidateTag = (
queryTag: string | null | undefined,
bodyTag: string | null | undefined,
): ResolveRevalidateTagResult => {
const requested = queryTag ?? bodyTag
if (requested == null || requested === '') {
return { ok: true, tag: REVALIDATE_POSTS_TAG }
}
if (!isAllowedRevalidateTag(requested)) {
return {
ok: false,
error: `Unknown tag. Allowed: ${ALLOWED_REVALIDATE_TAGS.join(', ')}`,
}
}
return { ok: true, tag: requested }
}