Pular para conteúdo

0010 — Sinal de reset do Powersync via bi_configuracao

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-06-11 · Decidido em: 2026-05-26

Contexto

Depois de um reset do Powersync (ver decisão 0009), o cliente Dart reaproveita o SQLite local e fica dessincronizado do servidor já zerado. Precisa de um sinal que dispare disconnectAndClear no cliente.

Este sinal foi adicionado depois do primeiro reset real em produção (maio/2026): observou-se que o cliente Flutter não re-baixava os dados — o PowerSync só sincroniza deltas e o cliente não tinha como saber que o Mongo fora recriado.

Decisão

No STEP_FINALIZAR, o pipeline faz UPSERT em bi_configuracao.ultimo_nuke (valor = NOW()::TEXT). O PowerSync replica essa linha; o cliente compara com o último valor visto em SharedPreferences['ps.ultimo_nuke'] e dispara disconnectAndClear quando muda.

Consequências

  • bi_configuracao é uma tabela KV (id TEXT PK) sincronizada (stream recent_data, priority 0); serve também para outras configs globais.
  • Backend consome via ConfigService (cache in-memory, TTL 30 s).
  • ultimo_nuke é chave de sistema (sistema=TRUE): read-only na tela /admin/configuracoes; POST manual retorna 403.

Alternativas consideradas

  • Flag booleano (reset=true) em vez de timestamp: entraria em loop infinito — o cliente lê reset=true, faz disconnectAndClear, reconecta, lê reset=true de novo… O timestamp monotônico resolve: o cliente guarda o valor visto antes do clear e, ao reconectar, compara igual = igual → não redispara. Descartado.
  • Push notification ao cliente: exige infra de notificação extra; o sinal via tabela já replicada é mais simples. Descartado.
  • Cliente detectar por heurística (ex. contagem de linhas): frágil e ambíguo. Descartado.