O projeto é uma aplicação TanStack Start (React) servida no domínio var-mundial.com. A stack escolhida prioriza simplicidade de deploy e uma landing 100% estática.
service_role para as APIs.public/var.html) — fácil de editar e rápido a servir.O documento de topo é uma página React mínima. A landing inteira vive dentro de um <iframe> que carrega um HTML estático.
src/routes/__root.tsx + src/routes/index.tsx
Servido por TanStack Start. Trata do head/SEO (title, descrição, Open Graph, JSON-LD, canonical) e carrega o Google Tag Manager GTM-MDXFMS5W uma única vez. A rota / não renderiza conteúdo próprio — só o iframe.
public/ — sem React.
var-mundial.com), comunicam diretamente sem restrições cross-origin.
Como a landing está num iframe, os eventos não são empurrados para o seu próprio dataLayer — sobem para o dataLayer do documento-pai, onde o GTM já está montado.
vmTrack(nome, params)
Cada interação (ex.: verifier_use, evidence_submit, counter_loaded) chama vmTrack(). O helper acrescenta sempre vm_source:"var_mundial" e procura o dataLayer do window.parent.
window.parent.dataLayer.push(...)
O GTM GTM-MDXFMS5W (carregado em __root.tsx) lê os eventos. Como há um único contexto GTM, não há pageviews duplicados nem perda do page_location.
dataLayer local do iframe
O helper nunca rebenta a UI: se o acesso ao pai falhar (caso raro), empurra para o dataLayer local. O tracking degrada com elegância.
Catálogo completo de eventos, parâmetros e KPIs em Eventos de Tag Manager.
A base de dados guarda as evidências e as listas de apoio. O acesso público é só de leitura a agregados; toda a escrita passa pelas APIs com service_role.
evidencias
Núcleo da campanha. Pipeline de estados recebida → segura → validada_apajo → publicada (ou rejeitada). categoria multi-valor, operador, onde_encontrada, ficheiro em storage privado (ficheiro_path), flag seguro e numero sequencial. RLS sem políticas para anon — fechada.
apajo_associados
Operadores licenciados (com licença SRIJ) associados da APAJO: nome, slug, logo, site, ordem. Alimenta os verificadores e os redireccionamentos "joga com diversão".
casas_ilegais
Casas/sites sem licença, com contagem e portal de queixas. Apoia a identificação de operadores ilegais.
ostentacao
Itens de "ostentação" (valores/imagens) usados no conteúdo editorial da landing.
evidencias_contagem
Só agregados: total_publicadas e total_validadas. Nunca devolve dados crus. Alimenta o contador público.
evidencias_por_operador
Contagem de evidências publicadas por operador. Nunca expõe ficheiros nem contactos.
src/routes/api/public/)POST /api/public/submit-evidence
Recebe multipart (com ficheiro) ou JSON. Valida campos (Zod) e o ficheiro (tipo MIME + tamanho, máx. 25 MB), faz upload para o bucket privado evidencias e insere a linha com estado:'recebida' e seguro:false. Usa a chave service_role (a tabela está fechada a anon).
GET /api/public/evidence-count
Lê as vistas evidencias_contagem e evidencias_por_operador e devolve só agregados (com Cache-Control curto). É o que o contador da landing consome.
Percurso completo de uma prova de publicidade ilegal — desde a submissão pública até à publicação numerada. As caixas a dourado são tratadas no back office (/admin); a final, a verde, é pública.
fonte:'instagram'). Categoria multi-escolha + onde foi encontrada + ficheiro/print opcional.
submit-evidence valida tipo/tamanho, guarda o ficheiro no storage privado e cria a linha com estado:'recebida', seguro:false e um numero sequencial.
seguro:true e estado:'segura'; senão, rejeitada.
apajo_associados). Confirmado, passa a validada_apajo; senão, rejeitada.
estado:'publicada'. A evidência sai nas redes (Instagram) com o seu numero sequencial.
evidencias_contagem / evidencias_por_operador e o contador da landing (via evidence-count) atualiza.
/admin.html. A API pública só faz o passo 1–2 (recebida); a moderação avança o estado a partir daí.
Mapa rápido dos ficheiros-chave para cada tipo de mudança.
| Quero alterar… | Ficheiro / local |
|---|---|
| GTM, SEO, head, Open Graph, JSON-LD | src/routes/__root.tsx |
| A rota raiz que renderiza o iframe | src/routes/index.tsx |
Conteúdo, design e JS da landing (e o helper vmTrack) | public/var.html |
| APIs públicas (submeter evidência / contador) | src/routes/api/public/ |
| Base de dados: tabelas, vistas, RLS, storage, seeds | supabase/migrations/ |
| Documentação interna (esta página, eventos, estratégia) | public/*.html |