-- Migration 2026-04-17 : lier users ↔ contacts ↔ LDAP proprement (FK + index) -- -- Avant : users.itop_person_id (int) pointe vers iTop (pas vers contacts.id) -- -> lien indirect fragile entre users et contacts via itop_id -- -- Apres : users.contact_id (FK propre vers contacts.id) -- contacts.ldap_dn (trace la source AD quand le contact vient d'un import LDAP) -- Les 3 tables sont jointes directement : users.contact_id = contacts.id -- La source LDAP est identifiee par contacts.ldap_dn IS NOT NULL et/ou -- users.auth_type = 'ldap'. BEGIN; -- 1. users.contact_id : FK vers contacts.id ALTER TABLE users ADD COLUMN IF NOT EXISTS contact_id INTEGER; DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_constraint WHERE conname = 'users_contact_id_fkey' ) THEN ALTER TABLE users ADD CONSTRAINT users_contact_id_fkey FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL; END IF; END$$; CREATE INDEX IF NOT EXISTS idx_users_contact_id ON users (contact_id); -- 2. contacts.ldap_dn : trace provenance AD ALTER TABLE contacts ADD COLUMN IF NOT EXISTS ldap_dn varchar(500); CREATE INDEX IF NOT EXISTS idx_contacts_ldap_dn ON contacts (ldap_dn) WHERE ldap_dn IS NOT NULL; -- 3. Backfill users.contact_id depuis users.email <-> contacts.email -- (pour les users deja presents dont l'email matche un contact) UPDATE users u SET contact_id = c.id FROM contacts c WHERE u.contact_id IS NULL AND u.email IS NOT NULL AND lower(u.email) = lower(c.email); COMMENT ON COLUMN users.contact_id IS 'FK vers contacts.id — lien direct user ↔ contact (le meme email)'; COMMENT ON COLUMN contacts.ldap_dn IS 'DN AD d''ou provient ce contact (import LDAP). NULL si import iTop ou saisie manuelle'; COMMIT;