feat: make all Flyway SQL migrations fully idempotent

This commit is contained in:
2026-05-19 22:39:19 +02:00
parent 4f140775a2
commit 5cd807f916
5 changed files with 39 additions and 27 deletions
@@ -1,16 +1,16 @@
CREATE TABLE role ( CREATE TABLE IF NOT EXISTS role (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL name VARCHAR(50) UNIQUE NOT NULL
); );
CREATE TABLE app_user ( CREATE TABLE IF NOT EXISTS app_user (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL, username VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE enabled BOOLEAN NOT NULL DEFAULT TRUE
); );
CREATE TABLE user_role ( CREATE TABLE IF NOT EXISTS user_role (
user_id BIGINT NOT NULL, user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL, role_id BIGINT NOT NULL,
PRIMARY KEY (user_id, role_id), PRIMARY KEY (user_id, role_id),
@@ -18,7 +18,7 @@ CREATE TABLE user_role (
CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE
); );
CREATE TABLE adherent ( CREATE TABLE IF NOT EXISTS adherent (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
nom VARCHAR(100) NOT NULL, nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NOT NULL, prenom VARCHAR(100) NOT NULL,
@@ -29,7 +29,7 @@ CREATE TABLE adherent (
representant_legal VARCHAR(150) representant_legal VARCHAR(150)
); );
CREATE TABLE categorie ( CREATE TABLE IF NOT EXISTS categorie (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
nom VARCHAR(20) UNIQUE NOT NULL, nom VARCHAR(20) UNIQUE NOT NULL,
annee_min INT, annee_min INT,
@@ -37,7 +37,7 @@ CREATE TABLE categorie (
tarif_base DECIMAL(10,2) NOT NULL tarif_base DECIMAL(10,2) NOT NULL
); );
CREATE TABLE licence ( CREATE TABLE IF NOT EXISTS licence (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
adherent_id BIGINT NOT NULL, adherent_id BIGINT NOT NULL,
categorie_id BIGINT NOT NULL, categorie_id BIGINT NOT NULL,
@@ -47,7 +47,7 @@ CREATE TABLE licence (
CONSTRAINT fk_licence_categorie FOREIGN KEY (categorie_id) REFERENCES categorie(id) CONSTRAINT fk_licence_categorie FOREIGN KEY (categorie_id) REFERENCES categorie(id)
); );
CREATE TABLE paiement ( CREATE TABLE IF NOT EXISTS paiement (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
licence_id BIGINT NOT NULL, licence_id BIGINT NOT NULL,
montant DECIMAL(10,2) NOT NULL, montant DECIMAL(10,2) NOT NULL,
@@ -56,14 +56,14 @@ CREATE TABLE paiement (
CONSTRAINT fk_paiement_licence FOREIGN KEY (licence_id) REFERENCES licence(id) ON DELETE CASCADE CONSTRAINT fk_paiement_licence FOREIGN KEY (licence_id) REFERENCES licence(id) ON DELETE CASCADE
); );
CREATE TABLE equipement ( CREATE TABLE IF NOT EXISTS equipement (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
nom VARCHAR(100) NOT NULL, nom VARCHAR(100) NOT NULL,
description TEXT, description TEXT,
obligatoire BOOLEAN NOT NULL DEFAULT FALSE obligatoire BOOLEAN NOT NULL DEFAULT FALSE
); );
CREATE TABLE dotation ( CREATE TABLE IF NOT EXISTS dotation (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
licence_id BIGINT NOT NULL, licence_id BIGINT NOT NULL,
equipement_id BIGINT NOT NULL, equipement_id BIGINT NOT NULL,
@@ -1,12 +1,18 @@
CREATE TABLE mode_paiement ( CREATE TABLE IF NOT EXISTS mode_paiement (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
nom VARCHAR(50) UNIQUE NOT NULL nom VARCHAR(50) UNIQUE NOT NULL
); );
INSERT INTO mode_paiement (nom) VALUES ('Espèces'), ('Chèque'), ('Pass Sport'), ('Virement'); INSERT INTO mode_paiement (nom) VALUES ('Espèces'), ('Chèque'), ('Pass Sport'), ('Virement')
ON CONFLICT (nom) DO NOTHING;
ALTER TABLE paiement ADD COLUMN mode_paiement_id BIGINT; ALTER TABLE paiement ADD COLUMN IF NOT EXISTS mode_paiement_id BIGINT;
ALTER TABLE paiement ADD CONSTRAINT fk_paiement_mode FOREIGN KEY (mode_paiement_id) REFERENCES mode_paiement(id); DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_paiement_mode') THEN
ALTER TABLE paiement ADD CONSTRAINT fk_paiement_mode FOREIGN KEY (mode_paiement_id) REFERENCES mode_paiement(id);
END IF;
END $$;
ALTER TABLE paiement DROP COLUMN mode_paiement; ALTER TABLE paiement DROP COLUMN IF EXISTS mode_paiement;
@@ -1,9 +1,11 @@
INSERT INTO role (name) VALUES ('ROLE_ADMIN'), ('ROLE_USER'); INSERT INTO role (name) VALUES ('ROLE_ADMIN'), ('ROLE_USER') ON CONFLICT (name) DO NOTHING;
-- Password is "Talange2026!" hashed with Argon2id -- Password is "Talange2026!" hashed with Argon2id
INSERT INTO app_user (username, password, enabled) VALUES ('Ucef', '$argon2id$v=19$m=65536,t=3,p=4$q29E/VM1esZVxo9HufgILQ$Nzb+rwwsZUMy04BbewYum2A8L8ujs9VZj9VJ/609Am0', true); INSERT INTO app_user (username, password, enabled) VALUES ('Ucef', '$argon2id$v=19$m=65536,t=3,p=4$q29E/VM1esZVxo9HufgILQ$Nzb+rwwsZUMy04BbewYum2A8L8ujs9VZj9VJ/609Am0', true)
ON CONFLICT (username) DO NOTHING;
INSERT INTO user_role (user_id, role_id) VALUES ((SELECT id FROM app_user WHERE username = 'Ucef'), (SELECT id FROM role WHERE name = 'ROLE_ADMIN')); INSERT INTO user_role (user_id, role_id) VALUES ((SELECT id FROM app_user WHERE username = 'Ucef'), (SELECT id FROM role WHERE name = 'ROLE_ADMIN'))
ON CONFLICT (user_id, role_id) DO NOTHING;
INSERT INTO categorie (nom, annee_min, annee_max, tarif_base) VALUES INSERT INTO categorie (nom, annee_min, annee_max, tarif_base) VALUES
('U6', 2020, 2020, 100.00), ('U6', 2020, 2020, 100.00),
@@ -14,10 +16,14 @@ INSERT INTO categorie (nom, annee_min, annee_max, tarif_base) VALUES
('U11', 2015, 2015, 130.00), ('U11', 2015, 2015, 130.00),
('U12', 2014, 2014, 140.00), ('U12', 2014, 2014, 140.00),
('U13', 2013, 2013, 140.00), ('U13', 2013, 2013, 140.00),
('Senior', 1900, 2005, 180.00); ('Senior', 1900, 2005, 180.00)
ON CONFLICT (nom) DO NOTHING;
INSERT INTO equipement (nom, obligatoire) VALUES INSERT INTO equipement (nom, obligatoire)
('Maillot', true), SELECT 'Maillot', true WHERE NOT EXISTS (SELECT 1 FROM equipement WHERE nom = 'Maillot');
('Short', true), INSERT INTO equipement (nom, obligatoire)
('Chaussettes', true), SELECT 'Short', true WHERE NOT EXISTS (SELECT 1 FROM equipement WHERE nom = 'Short');
('Survêtement', false); INSERT INTO equipement (nom, obligatoire)
SELECT 'Chaussettes', true WHERE NOT EXISTS (SELECT 1 FROM equipement WHERE nom = 'Chaussettes');
INSERT INTO equipement (nom, obligatoire)
SELECT 'Survêtement', false WHERE NOT EXISTS (SELECT 1 FROM equipement WHERE nom = 'Survêtement');
@@ -1,8 +1,8 @@
-- Ajouter la colonne pour savoir si l'adhérent est résident de Talange (par défaut oui pour les existants) -- Ajouter la colonne pour savoir si l'adhérent est résident de Talange (par défaut oui pour les existants)
ALTER TABLE adherent ADD COLUMN resident_talange BOOLEAN DEFAULT TRUE; ALTER TABLE adherent ADD COLUMN IF NOT EXISTS resident_talange BOOLEAN DEFAULT TRUE;
-- Ajouter le tarif extérieur aux catégories -- Ajouter le tarif extérieur aux catégories
ALTER TABLE categorie ADD COLUMN tarif_exterieur DECIMAL(10,2); ALTER TABLE categorie ADD COLUMN IF NOT EXISTS tarif_exterieur DECIMAL(10,2);
-- Par défaut, mettre le tarif extérieur égal au tarif de base pour ne pas casser les licences existantes -- Par défaut, mettre le tarif extérieur égal au tarif de base pour ne pas casser les licences existantes
UPDATE categorie SET tarif_exterieur = tarif_base; UPDATE categorie SET tarif_exterieur = tarif_base*1.2 WHERE tarif_exterieur IS NULL;
@@ -1 +1 @@
ALTER TABLE licence ADD COLUMN numero_licence VARCHAR(50); ALTER TABLE licence ADD COLUMN IF NOT EXISTS numero_licence VARCHAR(50);