diff --git a/src/main/resources/db/migration/V30__Fix_MembresRoles_Schema_Align_With_Entity.sql b/src/main/resources/db/migration/V30__Fix_MembresRoles_Schema_Align_With_Entity.sql new file mode 100644 index 0000000..c0f203a --- /dev/null +++ b/src/main/resources/db/migration/V30__Fix_MembresRoles_Schema_Align_With_Entity.sql @@ -0,0 +1,67 @@ +-- ============================================================================ +-- V30 — Alignement membres_roles avec l'entité Java MembreRole +-- +-- Contexte : Hibernate update mode a pu créer membres_roles avant V1 (depuis +-- l'entité Java), OU V1 l'a créé avec membre_id. Les deux cas sont gérés. +-- Toutes les opérations sont défensives (IF EXISTS / DO blocks). +-- ============================================================================ + +-- 1. Rendre membre_id nullable si la colonne existe encore (cas V1-first) +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'membres_roles' AND column_name = 'membre_id' + ) THEN + ALTER TABLE membres_roles ALTER COLUMN membre_id DROP NOT NULL; + END IF; +END $$; + +-- 2. Ajouter membre_organisation_id si absente +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS membre_organisation_id UUID + REFERENCES membres_organisations(id) ON DELETE CASCADE; + +-- 3. Ajouter organisation_id si absente +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS organisation_id UUID + REFERENCES organisations(id) ON DELETE CASCADE; + +-- 4. Ajouter date_debut / date_fin / commentaire si absents +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS date_debut DATE; +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS date_fin DATE; +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS commentaire VARCHAR(500); + +-- 5. Ajouter les colonnes BaseEntity manquantes +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS date_modification TIMESTAMP; +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS version BIGINT DEFAULT 0; +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS cree_par VARCHAR(255); +ALTER TABLE membres_roles ADD COLUMN IF NOT EXISTS modifie_par VARCHAR(255); + +-- 6. Supprimer l'ancienne contrainte unique V1 (membre_id, role_id) si présente +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM pg_constraint + WHERE conname = 'uk_membre_role' AND conrelid = 'membres_roles'::regclass + ) THEN + ALTER TABLE membres_roles DROP CONSTRAINT uk_membre_role; + END IF; +END $$; + +-- 7. Ajouter la contrainte unique (membre_organisation_id, role_id) si absente +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint + WHERE conname = 'uk_mr_membre_org_role' AND conrelid = 'membres_roles'::regclass + ) THEN + ALTER TABLE membres_roles + ADD CONSTRAINT uk_mr_membre_org_role + UNIQUE (membre_organisation_id, role_id); + END IF; +END $$; + +-- 8. Index de performance (IF NOT EXISTS — idempotent) +CREATE INDEX IF NOT EXISTS idx_mr_membre_org ON membres_roles (membre_organisation_id); +CREATE INDEX IF NOT EXISTS idx_mr_organisation ON membres_roles (organisation_id); +CREATE INDEX IF NOT EXISTS idx_mr_role ON membres_roles (role_id); +CREATE INDEX IF NOT EXISTS idx_mr_actif ON membres_roles (actif); diff --git a/src/main/resources/db/migration/V31__Fix_Notifications_Legacy_NotNull_Columns.sql b/src/main/resources/db/migration/V31__Fix_Notifications_Legacy_NotNull_Columns.sql new file mode 100644 index 0000000..e452e57 --- /dev/null +++ b/src/main/resources/db/migration/V31__Fix_Notifications_Legacy_NotNull_Columns.sql @@ -0,0 +1,54 @@ +-- ============================================================================ +-- V31 — Corrige les colonnes legacy NOT NULL de la table notifications +-- +-- V1 a créé les colonnes suivantes avec NOT NULL : +-- - destinataire_id UUID +-- - titre VARCHAR(255) +-- +-- L'entité Java Notification utilise désormais membre_id et sujet/corps, mais +-- les anciennes colonnes sont restées NOT NULL → les INSERTs depuis l'entité +-- échouent avec 23502 (violation NOT NULL). +-- +-- Fix : rendre ces colonnes nullables (on ne les utilise plus depuis l'entité). +-- ============================================================================ + +-- 1. destinataire_id : rendre nullable +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'notifications' + AND column_name = 'destinataire_id' + AND is_nullable = 'NO' + ) THEN + ALTER TABLE notifications ALTER COLUMN destinataire_id DROP NOT NULL; + END IF; +END $$; + +-- 2. titre : rendre nullable (remplacé par sujet) +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'notifications' + AND column_name = 'titre' + AND is_nullable = 'NO' + ) THEN + ALTER TABLE notifications ALTER COLUMN titre DROP NOT NULL; + END IF; +END $$; + +-- 3. nombre_tentatives : rendre nullable (défaut 0 déjà présent, mais NOT NULL bloque si l'entité ne le met pas) +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'notifications' + AND column_name = 'nombre_tentatives' + AND is_nullable = 'NO' + ) THEN + -- Garder le default mais enlever NOT NULL pour éviter les crashes si l'entité ne définit pas la valeur + ALTER TABLE notifications ALTER COLUMN nombre_tentatives DROP NOT NULL; + ALTER TABLE notifications ALTER COLUMN nombre_tentatives SET DEFAULT 0; + END IF; +END $$;