|
| 1 | +-- ╔══════════════════════════════════════════════════════════════════════════╗ |
| 2 | +-- ║ Migration 052 — positions.updated_at (cursore delta pull-desired-state) ║ |
| 3 | +-- ╠══════════════════════════════════════════════════════════════════════════╣ |
| 4 | +-- ║ ║ |
| 5 | +-- ║ FIX drift codice↔schema. La route GET /api/cloud-sync/pull-desired-state ║ |
| 6 | +-- ║ usa `positions.updated_at` come cursore delta (.gt/.order/cursor), ma la ║ |
| 7 | +-- ║ colonna non è MAI esistita: `001_schema.sql` definisce solo `created_at`. ║ |
| 8 | +-- ║ Risultato: la route andava in HTTP 500 a ogni ciclo del daemon ║ |
| 9 | +-- ║ "query failed: column positions.updated_at does not exist" ║ |
| 10 | +-- ║ → le intenzioni scritte dall'utente via web (write_requested, ║ |
| 11 | +-- ║ recheck_requested, geocode_requested, user_excluded, salary_precise) ║ |
| 12 | +-- ║ non raggiungevano mai la VPS = "non si sincronizza da pulsante web". ║ |
| 13 | +-- ║ ║ |
| 14 | +-- ║ Aggiunge la colonna + trigger BEFORE UPDATE che riusa la funzione ║ |
| 15 | +-- ║ update_updated_at() già definita in 001_schema.sql: ogni UPDATE (sia le ║ |
| 16 | +-- ║ route desired-state, sia gli upsert di push) fa avanzare il cursore. ║ |
| 17 | +-- ║ Le righe esistenti ottengono updated_at = now() al momento dell'ALTER ║ |
| 18 | +-- ║ (DEFAULT su backfill): la prima pull post-deploy le rivede una volta ║ |
| 19 | +-- ║ (volume limitato dalla finestra), poi si stabilizza sul delta. ║ |
| 20 | +-- ║ ║ |
| 21 | +-- ║ Idempotente. ║ |
| 22 | +-- ║ ║ |
| 23 | +-- ╚══════════════════════════════════════════════════════════════════════════╝ |
| 24 | + |
| 25 | +ALTER TABLE public.positions |
| 26 | + ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT now(); |
| 27 | + |
| 28 | +DROP TRIGGER IF EXISTS trg_positions_updated_at ON public.positions; |
| 29 | +CREATE TRIGGER trg_positions_updated_at |
| 30 | + BEFORE UPDATE ON public.positions |
| 31 | + FOR EACH ROW EXECUTE FUNCTION update_updated_at(); |
0 commit comments