0004_create_orgs_teams_postgres.up.sql

  1CREATE TABLE IF NOT EXISTS handles (
  2  id SERIAL PRIMARY KEY,
  3  handle TEXT NOT NULL UNIQUE,
  4  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  5  updated_at TIMESTAMP NOT NULL
  6);
  7
  8CREATE TABLE IF NOT EXISTS organizations (
  9  id SERIAL PRIMARY KEY,
 10  name TEXT,
 11  contact_email TEXT NOT NULL,
 12  handle_id INTEGER NOT NULL,
 13  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 14  updated_at TIMESTAMP NOT NULL,
 15  CONSTRAINT handle_id_fk
 16  FOREIGN KEY(handle_id) REFERENCES handles(id)
 17  ON DELETE CASCADE
 18  ON UPDATE CASCADE
 19);
 20
 21CREATE TABLE IF NOT EXISTS organization_members (
 22  id SERIAL PRIMARY KEY,
 23  org_id INTEGER NOT NULL,
 24  user_id INTEGER NOT NULL,
 25  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 26  updated_at TIMESTAMP NOT NULL,
 27  UNIQUE (org_id, user_id),
 28  CONSTRAINT org_id_fk
 29  FOREIGN KEY(org_id) REFERENCES organizations(id)
 30  ON DELETE CASCADE
 31  ON UPDATE CASCADE,
 32  CONSTRAINT user_id_fk
 33  FOREIGN KEY(user_id) REFERENCES users(id)
 34  ON DELETE CASCADE
 35  ON UPDATE CASCADE
 36);
 37
 38CREATE TABLE IF NOT EXISTS teams (
 39  id SERIAL PRIMARY KEY,
 40  name TEXT NOT NULL,
 41  org_id INTEGER NOT NULL,
 42  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 43  updated_at TIMESTAMP NOT NULL,
 44  UNIQUE (name, org_id),
 45  CONSTRAINT org_id_fk
 46  FOREIGN KEY(org_id) REFERENCES organizations(id)
 47  ON DELETE CASCADE
 48  ON UPDATE CASCADE
 49);
 50
 51CREATE TABLE IF NOT EXISTS team_members (
 52  id SERIAL PRIMARY KEY,
 53  team_id INTEGER NOT NULL,
 54  user_id INTEGER NOT NULL,
 55  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 56  updated_at TIMESTAMP NOT NULL,
 57  UNIQUE (team_id, user_id),
 58  CONSTRAINT team_id_fk
 59  FOREIGN KEY(team_id) REFERENCES teams(id)
 60  ON DELETE CASCADE
 61  ON UPDATE CASCADE,
 62  CONSTRAINT user_id_fk
 63  FOREIGN KEY(user_id) REFERENCES users(id)
 64  ON DELETE CASCADE
 65  ON UPDATE CASCADE
 66);
 67
 68CREATE TABLE IF NOT EXISTS user_emails (
 69  id SERIAL PRIMARY KEY,
 70  user_id INTEGER NOT NULL,
 71  email TEXT NOT NULL UNIQUE,
 72  is_primary BOOLEAN NOT NULL,
 73  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 74  updated_at TIMESTAMP NOT NULL,
 75  CONSTRAINT user_id_fk
 76  FOREIGN KEY(user_id) REFERENCES users(id)
 77  ON DELETE CASCADE
 78  ON UPDATE CASCADE
 79);
 80
 81-- Add name to users table
 82ALTER TABLE users ADD COLUMN name TEXT;
 83
 84-- Add handle_id to users table
 85ALTER TABLE users ADD COLUMN handle_id INTEGER;
 86ALTER TABLE users ADD CONSTRAINT handle_id_fk
 87  FOREIGN KEY(handle_id) REFERENCES handles(id)
 88  ON DELETE CASCADE
 89  ON UPDATE CASCADE;
 90
 91-- Migrate user username to handles
 92INSERT INTO handles (handle, updated_at) SELECT username, updated_at FROM users;
 93
 94-- Update handle_id for users
 95UPDATE users SET handle_id = handles.id FROM handles WHERE handles.handle = users.username;
 96
 97-- Make handle_id not null and unique
 98ALTER TABLE users ALTER COLUMN handle_id SET NOT NULL;
 99ALTER TABLE users ADD CONSTRAINT handle_id_unique UNIQUE (handle_id);
100
101-- Drop username from users
102ALTER TABLE users DROP COLUMN username;
103
104-- Add org_id to repos table
105ALTER TABLE repos ADD COLUMN org_id INTEGER;
106ALTER TABLE repos ADD CONSTRAINT org_id_fk
107  FOREIGN KEY(org_id) REFERENCES organizations(id)
108  ON DELETE CASCADE
109  ON UPDATE CASCADE;
110
111-- Alter user_id nullness in repos table
112ALTER TABLE repos ALTER COLUMN user_id DROP NOT NULL;
113
114-- Check that both user_id and org_id can't be null
115ALTER TABLE repos ADD CONSTRAINT user_id_org_id_not_null CHECK (user_id IS NULL <> org_id IS NULL);
116
117-- Add team_id to collabs table
118ALTER TABLE collabs ADD COLUMN team_id INTEGER;
119ALTER TABLE collabs ADD CONSTRAINT team_id_fk
120  FOREIGN KEY(team_id) REFERENCES teams(id)
121  ON DELETE CASCADE
122  ON UPDATE CASCADE;
123
124-- Alter user_id nullness in collabs table
125ALTER TABLE collabs ALTER COLUMN user_id DROP NOT NULL;
126
127-- Check that both user_id and team_id can't be null
128ALTER TABLE collabs ADD CONSTRAINT user_id_team_id_not_null CHECK (user_id IS NULL <> team_id IS NULL);
129
130-- Alter unique constraint on collabs table
131ALTER TABLE collabs DROP CONSTRAINT collabs_user_id_repo_id_key;
132ALTER TABLE collabs ADD CONSTRAINT collabs_user_id_repo_id_team_id_key UNIQUE (user_id, repo_id, team_id);