Skip to content

[FEAT] GET /api/ingest/watermarks #218

Description

@cpenaforte-clickbus

User story

Como o worker de coleta, eu quero ler o último refs_digest de cada repositório e janela por uma
rota autenticada, para descobrir o que está pendente sem receber credencial de banco.

Acceptance criteria

  • GET /api/ingest/watermarks — não existe hoje: sob /api/ingest só há o POST e a /api/ingest/usage
  • Autenticada pelo mesmo token de ingestão que o worker já carrega, no padrão que a
    /api/ingest/usage já usa (validateToken + supabaseAdmin)
  • Devolve, por repositório e janela, o último refs_digest
  • Escopo pelo organization_id do token
  • A query usa cross join lateral, não distinct on

A query

select r.id as repository_id, w.window_days, l.refs_digest
from repositories r
cross join (values (7),(15),(30),(60),(90)) as w(window_days)
cross join lateral (
  select refs_digest
  from analysis_runs a
  where a.repository_id = r.id
    and a.window_days   = w.window_days
    and a.refs_digest is not null
  order by a.created_at desc
  limit 1
) l
where r.organization_id = $1;

Por que lateral e não distinct on

O Postgres não tem skip scan, então distinct on (repository_id) varre a tabela inteira: medido em
360 mil linhas — o que ~600 repositórios × 5 janelas acumulam em dois meses de ciclos —, dá 103 ms e
360 mil buffers
. O lateral parte da lista de repositórios e faz uma busca no índice que para na
primeira linha: 32 ms e 8 mil buffers. O que decide não é o ganho de hoje, e sim como cada forma
cresce: o distinct on com o total de linhas da tabela, o lateral com o número de repositórios.

Por que refs_digest is not null no predicado

É o que separa o worker do agente local. O push local grava linha sem digest e, sendo a mais
recente, esconderia o watermark do worker — que reanalisaria o repositório em todo ciclo enquanto o
hook estivesse instalado.

Scope / non-goals

Dentro: a rota de leitura. Fora: o POST no mesmo caminho (issue irmã) e a seleção em si, que
mora no worker.

Se encaixa em qual estágio?

Stage 2 — Ingestion: token auth. É ela que evita dar credencial de banco ao CI.

Implementation notes

Ausência de linha significa pendente, que é o comportamento seguro: repositório nunca analisado
entra no primeiro ciclo. O índice de leitura que serve esta query vem na issue da migration 023.

Links

Bloqueado por

A coluna refs_digest e o índice de leitura: #217. Sem eles a rota existe mas erra em runtime — nada em uso quebra, porque ninguém a chama ainda.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions