- apps/api/migrations/ : 4 migrations numérotées idempotentes
001 : schéma initial (bands, trigger geom, indexes)
002 : colonnes manquantes (enriched, themes, geocode_*) + fix trigger
→ updated_at mis à jour sur toute UPDATE (pas seulement lat/lon)
003 : geocode_queue et geocode_cache (formalisées)
004 : tracking crawl (crawled_at, crawled_hash, ma_created_at,
ma_modified_at, first_seen_at) + crawl_run + crawl_checkpoint
- apps/api/src/migrate.js : runner qui s applique au démarrage de l api
- apps/api/Dockerfile : CMD lance migrate.js avant server.js
- infra/init.sql : remplacé par notice de redirection
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
1.6 KiB
PL/PgSQL
37 lines
1.6 KiB
PL/PgSQL
-- Colonnes utilisées par l'API et le geocoder mais absentes du schéma initial
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS enriched BOOLEAN NOT NULL DEFAULT false;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS themes TEXT;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocoded_at TIMESTAMPTZ;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocode_provider TEXT;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocode_query TEXT;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocode_raw JSONB;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocode_error TEXT;
|
|
ALTER TABLE bands ADD COLUMN IF NOT EXISTS geocode_error_at TIMESTAMPTZ;
|
|
|
|
-- Fix: le trigger précédent ne mettait updated_at à jour que sur changement de lat/lon.
|
|
-- Le remplacer pour qu'il se déclenche sur n'importe quelle UPDATE.
|
|
CREATE OR REPLACE FUNCTION bands_set_geom() RETURNS trigger AS $$
|
|
BEGIN
|
|
-- Ne recalculer geom que si lat ou lon a vraiment changé
|
|
IF TG_OP = 'INSERT'
|
|
OR OLD.lat IS DISTINCT FROM NEW.lat
|
|
OR OLD.lon IS DISTINCT FROM NEW.lon
|
|
THEN
|
|
IF NEW.lat IS NOT NULL AND NEW.lon IS NOT NULL THEN
|
|
NEW.geom := ST_SetSRID(ST_MakePoint(NEW.lon, NEW.lat), 4326)::geography;
|
|
ELSE
|
|
NEW.geom := NULL;
|
|
END IF;
|
|
END IF;
|
|
NEW.updated_at := now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_bands_set_geom ON bands;
|
|
CREATE TRIGGER trg_bands_set_geom
|
|
BEFORE INSERT OR UPDATE ON bands
|
|
FOR EACH ROW EXECUTE FUNCTION bands_set_geom();
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_bands_enriched ON bands (enriched);
|
|
CREATE INDEX IF NOT EXISTS idx_bands_geocoded_at ON bands (geocoded_at);
|