☕ Rota do Cafezinho — Recife & RMR

Roteiro de cafés para dois explorarem, com visitas, notas, favoritos e fotos persistidos no servidor (Val Town) — disponível de qualquer aparelho.

👉 Abrir o app

Como as memórias são guardadas (e por que não se perdem mais)

Nada de um único bloco que possa ser sobrescrito: cada café visitado e cada café custom é uma linha própria no SQLite do projeto, e o servidor sempre faz merge ao salvar — um POST vindo de um aparelho/aba com memória vazia nunca apaga visitas existentes.

Chave no SQLite (kv)Guarda
visit:<id>dados da visita de um café (nota, data, favorito, photo_key)
custom:<n>um café custom por linha
metacontadores (ex.: lastBackupCount)
blob cafe:<id>foto de cada visita

Endpoints:

  • GET /api/state → estado completo (montado das linhas)
  • POST /api/visit → upsert de uma visita (aceita photo_base64 → blob)
  • POST /api/state → merge (nunca apaga visitas)
  • GET /api/photo/<key> → serve a foto

Rede de segurança: backup automático 🔒

Um cron diário (backup-cron.ts) tira um instantâneo completo do estado e grava no blob do projeto como backup/snapshot-<ISO>.json, mantendo os 30 mais recentes (retenção automática).

  • Criar snapshot: backup.tsrunBackup() (já testado e funcionando)
  • Listar snapshots: restore.tslistSnapshots()
  • Restaurar: restore.tsrestoreFromBackup(<key>) — repõe visitas, custom e meta no SQLite. ⚠️ Sobrescreve; só usar em emergência.

Agendamento: 37 4 * * * UTC (≈ 01:37 Brasília), próximo em 2026-08-28 04:37 UTC.

Arquivos

  • main.ts — API + serve o app (endpoint HTTP)
  • frontend.html — a interface (HTML/JS/CSS)
  • backup.ts — lógica de snapshot
  • backup-cron.ts — cron diário que chama runBackup()
  • restore.ts — recuperação a partir de um snapshot

Tags

cafes, sqlite