72 lines
3.2 KiB
PL/PgSQL
72 lines
3.2 KiB
PL/PgSQL
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- Listes de surveillance d'aéronefs
|
|
--
|
|
-- Deux tables plutôt qu'une colonne « liste » libre : une liste est un objet
|
|
-- qu'on renomme, colore et supprime, et sa suppression doit emporter ses
|
|
-- membres. Une chaîne répétée sur chaque ligne rendrait le renommage fragile.
|
|
--
|
|
-- La clé de surveillance est l'adresse ICAO 24 bits, stable pour une cellule
|
|
-- donnée, et non l'indicatif, qui change à chaque vol et manque souvent.
|
|
--
|
|
-- À jouer avec ON_ERROR_STOP=1.
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
BEGIN;
|
|
|
|
CREATE TABLE IF NOT EXISTS adsb.watchlists (
|
|
id serial PRIMARY KEY,
|
|
nom varchar(60) NOT NULL UNIQUE,
|
|
couleur varchar(9) NOT NULL DEFAULT '#d29922',
|
|
description text,
|
|
actif boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
COMMENT ON TABLE adsb.watchlists IS
|
|
'Listes de surveillance nommées (ex. Militaires, Hélicoptères).';
|
|
|
|
CREATE TABLE IF NOT EXISTS adsb.watchlist_items (
|
|
id serial PRIMARY KEY,
|
|
watchlist_id integer NOT NULL
|
|
REFERENCES adsb.watchlists(id) ON DELETE CASCADE,
|
|
icao varchar(6) NOT NULL,
|
|
motif text,
|
|
-- Instantané des métadonnées au moment de la mise sous surveillance.
|
|
-- Redondant avec aircraft_history, et c'est voulu : il garde une trace de
|
|
-- ce qui avait motivé l'ajout, même si la fiche de l'appareil change
|
|
-- ensuite, et évite une jointure à chaque affichage de la liste.
|
|
callsign varchar(12),
|
|
aircraft_type varchar(8),
|
|
aircraft_desc varchar(60),
|
|
aircraft_wtc varchar(4),
|
|
operator_name varchar(120),
|
|
country varchar(60),
|
|
added_at timestamptz NOT NULL DEFAULT now(),
|
|
CONSTRAINT watchlist_items_uniq UNIQUE (watchlist_id, icao),
|
|
-- Normalisation imposée en base : l'API majuscule déjà, mais une insertion
|
|
-- manuelle en minuscules créerait un doublon invisible.
|
|
CONSTRAINT watchlist_items_icao_upper CHECK (icao = upper(icao))
|
|
);
|
|
|
|
-- Recherche « cet appareil est-il surveillé ? » lors du rendu des tableaux
|
|
CREATE INDEX IF NOT EXISTS watchlist_items_icao_idx
|
|
ON adsb.watchlist_items (icao);
|
|
|
|
COMMENT ON TABLE adsb.watchlist_items IS
|
|
'Aéronefs surveillés, identifiés par leur adresse ICAO 24 bits.';
|
|
|
|
-- Liste par défaut, pour que le bouton « Surveiller » ait une cible dès le
|
|
-- premier clic sans imposer la création préalable d'une liste.
|
|
INSERT INTO adsb.watchlists (nom, couleur, description)
|
|
SELECT 'Surveillance', '#d29922', 'Liste par défaut'
|
|
WHERE NOT EXISTS (SELECT 1 FROM adsb.watchlists);
|
|
|
|
COMMIT;
|
|
|
|
\echo '--- Tables créées ---'
|
|
SELECT w.id, w.nom, w.couleur, w.actif, count(i.id) AS appareils
|
|
FROM adsb.watchlists w
|
|
LEFT JOIN adsb.watchlist_items i ON i.watchlist_id = w.id
|
|
GROUP BY w.id, w.nom, w.couleur, w.actif
|
|
ORDER BY w.id;
|