cargagep-v2/db/migrations/20260823210000_create_units.sql
Antoine Pelletier 7e958b89c6 feat: add oidc
2026-08-23 22:20:27 +02:00

56 lines
2.3 KiB
SQL

-- migrate:up
-- A unit (an AGEPoly committee or commission) is a row of its own rather than a
-- string repeated on every membership: it can be renamed, and per-unit data can
-- be hung off it later without touching anything else. `name` is the Whiskey
-- group name and stays the key we match the provider on.
CREATE TABLE units (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
-- Everything that already named a unit becomes a row
INSERT INTO units ("name")
SELECT DISTINCT unit_name FROM units_users
UNION
SELECT DISTINCT unit FROM reservations
ON CONFLICT ("name") DO NOTHING;
-- units_users: unit_name -> unit_id
ALTER TABLE units_users
ADD COLUMN unit_id INTEGER REFERENCES units (id) ON DELETE CASCADE;
UPDATE units_users uu SET unit_id = u.id FROM units u WHERE u."name" = uu.unit_name;
ALTER TABLE units_users ALTER COLUMN unit_id SET NOT NULL;
ALTER TABLE units_users DROP CONSTRAINT units_users_pkey;
ALTER TABLE units_users DROP COLUMN unit_name;
ALTER TABLE units_users ADD PRIMARY KEY (unit_id, user_id);
CREATE INDEX units_users_user_id_idx ON units_users (user_id);
-- reservations: unit -> unit_id
ALTER TABLE reservations ADD COLUMN unit_id INTEGER REFERENCES units (id);
UPDATE reservations r SET unit_id = u.id FROM units u WHERE u."name" = r.unit;
ALTER TABLE reservations ALTER COLUMN unit_id SET NOT NULL;
DROP INDEX reservations_unit_idx;
ALTER TABLE reservations DROP COLUMN unit;
CREATE INDEX reservations_unit_id_idx ON reservations (unit_id);
-- migrate:down
ALTER TABLE reservations ADD COLUMN unit TEXT;
UPDATE reservations r SET unit = u."name" FROM units u WHERE u.id = r.unit_id;
ALTER TABLE reservations ALTER COLUMN unit SET NOT NULL;
DROP INDEX reservations_unit_id_idx;
ALTER TABLE reservations DROP COLUMN unit_id;
CREATE INDEX reservations_unit_idx ON reservations (unit);
ALTER TABLE units_users ADD COLUMN unit_name TEXT;
UPDATE units_users uu SET unit_name = u."name" FROM units u WHERE u.id = uu.unit_id;
ALTER TABLE units_users ALTER COLUMN unit_name SET NOT NULL;
ALTER TABLE units_users DROP CONSTRAINT units_users_pkey;
DROP INDEX units_users_user_id_idx;
ALTER TABLE units_users DROP COLUMN unit_id;
ALTER TABLE units_users ADD PRIMARY KEY (user_id, unit_name);
CREATE INDEX units_users_unit_name_idx ON units_users (unit_name);
DROP TABLE units;