Schema migrates dev to prod only; catalog rows merge by updated_at and images by mtime with union merge and conflict reporting. Co-authored-by: Cursor <cursoragent@cursor.com>
40 lines
935 B
PL/PgSQL
40 lines
935 B
PL/PgSQL
-- Catalog row timestamps for dev/prod harmonize (last-write-wins merge).
|
|
-- Idempotent: safe to re-run on existing databases.
|
|
|
|
CREATE OR REPLACE FUNCTION sync_touch_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DO $$
|
|
DECLARE
|
|
tbl TEXT;
|
|
BEGIN
|
|
FOREACH tbl IN ARRAY ARRAY[
|
|
'historical_eras',
|
|
'art_movements',
|
|
'artists',
|
|
'artist_periods',
|
|
'paintings',
|
|
'painting_influences',
|
|
'painting_influence_sources',
|
|
'painting_annotations'
|
|
]
|
|
LOOP
|
|
EXECUTE format(
|
|
'ALTER TABLE %I ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT now()',
|
|
tbl
|
|
);
|
|
|
|
EXECUTE format('DROP TRIGGER IF EXISTS %I ON %I', tbl || '_updated_at', tbl);
|
|
EXECUTE format(
|
|
'CREATE TRIGGER %I BEFORE UPDATE ON %I FOR EACH ROW EXECUTE PROCEDURE sync_touch_updated_at()',
|
|
tbl || '_updated_at',
|
|
tbl
|
|
);
|
|
END LOOP;
|
|
END $$;
|