0004_create_orgs_teams_sqlite.up.sql

  1CREATE TABLE IF NOT EXISTS handles (
  2  id INTEGER PRIMARY KEY AUTOINCREMENT,
  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 INTEGER PRIMARY KEY AUTOINCREMENT,
 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 INTEGER PRIMARY KEY AUTOINCREMENT,
 23  org_id INTEGER NOT NULL,
 24  user_id INTEGER NOT NULL,
 25  access_level INTEGER NOT NULL,
 26  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 27  updated_at TIMESTAMP NOT NULL,
 28  UNIQUE (org_id, user_id),
 29  CONSTRAINT org_id_fk
 30  FOREIGN KEY(org_id) REFERENCES organizations(id)
 31  ON DELETE CASCADE
 32  ON UPDATE CASCADE,
 33  CONSTRAINT user_id_fk
 34  FOREIGN KEY(user_id) REFERENCES users(id)
 35  ON DELETE CASCADE
 36  ON UPDATE CASCADE
 37);
 38
 39CREATE TABLE IF NOT EXISTS teams (
 40  id INTEGER PRIMARY KEY AUTOINCREMENT,
 41  name TEXT NOT NULL,
 42  org_id INTEGER NOT NULL,
 43  access_level INTEGER NOT NULL,
 44  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 45  updated_at TIMESTAMP NOT NULL,
 46  UNIQUE (name, org_id),
 47  CONSTRAINT org_id_fk
 48  FOREIGN KEY(org_id) REFERENCES organizations(id)
 49  ON DELETE CASCADE
 50  ON UPDATE CASCADE
 51);
 52
 53CREATE TABLE IF NOT EXISTS team_members (
 54  id INTEGER PRIMARY KEY AUTOINCREMENT,
 55  team_id INTEGER NOT NULL,
 56  user_id INTEGER NOT NULL,
 57  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 58  updated_at TIMESTAMP NOT NULL,
 59  UNIQUE (team_id, user_id),
 60  CONSTRAINT team_id_fk
 61  FOREIGN KEY(team_id) REFERENCES teams(id)
 62  ON DELETE CASCADE
 63  ON UPDATE CASCADE,
 64  CONSTRAINT user_id_fk
 65  FOREIGN KEY(user_id) REFERENCES users(id)
 66  ON DELETE CASCADE
 67  ON UPDATE CASCADE
 68);
 69
 70CREATE TABLE IF NOT EXISTS user_emails (
 71  id INTEGER PRIMARY KEY AUTOINCREMENT,
 72  user_id INTEGER NOT NULL,
 73  email TEXT NOT NULL UNIQUE,
 74  is_primary BOOLEAN NOT NULL DEFAULT false,
 75  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 76  updated_at TIMESTAMP NOT NULL,
 77  CONSTRAINT user_id_fk
 78  FOREIGN KEY(user_id) REFERENCES users(id)
 79  ON DELETE CASCADE
 80  ON UPDATE CASCADE
 81);
 82
 83-- Create unique index for primary email
 84CREATE UNIQUE INDEX user_emails_user_id_is_primary_idx ON user_emails (user_id) WHERE is_primary;
 85
 86ALTER TABLE users RENAME TO _users_old;
 87
 88CREATE TABLE IF NOT EXISTS users (
 89  id INTEGER PRIMARY KEY AUTOINCREMENT,
 90  name TEXT,
 91  handle_id INTEGER NOT NULL UNIQUE,
 92  admin BOOLEAN NOT NULL,
 93  password TEXT,
 94  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 95  updated_at DATETIME NOT NULL,
 96  CONSTRAINT handle_id_fk
 97  FOREIGN KEY(handle_id) REFERENCES handles(id)
 98  ON DELETE CASCADE
 99  ON UPDATE CASCADE
100);
101
102-- Migrate user username to handles
103INSERT INTO handles (handle, updated_at) SELECT username, updated_at FROM _users_old;
104
105-- Migrate users
106INSERT INTO users (id, handle_id, admin, password, created_at, updated_at) SELECT id, (
107  SELECT id FROM handles WHERE handle = _users_old.username
108), admin, password, created_at, updated_at FROM _users_old;
109
110-- Drop old table
111DROP TABLE _users_old;
112
113ALTER TABLE repos RENAME TO _repos_old;
114
115CREATE TABLE IF NOT EXISTS repos (
116  id INTEGER PRIMARY KEY AUTOINCREMENT,
117  name TEXT NOT NULL UNIQUE,
118  project_name TEXT NOT NULL,
119  description TEXT NOT NULL,
120  private BOOLEAN NOT NULL,
121  mirror BOOLEAN NOT NULL,
122  hidden BOOLEAN NOT NULL,
123  user_id INTEGER,
124  org_id INTEGER,
125  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
126  updated_at DATETIME NOT NULL,
127  CONSTRAINT user_id_fk
128  FOREIGN KEY(user_id) REFERENCES users(id)
129  ON DELETE CASCADE
130  ON UPDATE CASCADE,
131  CONSTRAINT org_id_fk
132  FOREIGN KEY(org_id) REFERENCES organizations(id)
133  ON DELETE CASCADE
134  ON UPDATE CASCADE,
135  CONSTRAINT user_id_org_id_not_null
136  CHECK (user_id IS NULL <> org_id IS NULL)
137);
138
139-- Migrate repos
140INSERT INTO repos (id, name, project_name, description, private, mirror, hidden, user_id, created_at, updated_at)
141SELECT id, name, project_name, description, private, mirror, hidden, user_id, created_at, updated_at
142FROM _repos_old;
143
144-- Drop old table
145DROP TABLE _repos_old;
146
147-- Alter collabs table
148ALTER TABLE collabs RENAME TO _collabs_old;
149
150CREATE TABLE IF NOT EXISTS collabs (
151  id INTEGER PRIMARY KEY AUTOINCREMENT,
152  user_id INTEGER,
153  team_id INTEGER,
154  repo_id INTEGER NOT NULL,
155  access_level INTEGER NOT NULL,
156  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
157  updated_at DATETIME NOT NULL,
158  UNIQUE (user_id, team_id, repo_id),
159  CONSTRAINT user_id_fk
160  FOREIGN KEY(user_id) REFERENCES users(id)
161  ON DELETE CASCADE
162  ON UPDATE CASCADE,
163  CONSTRAINT team_id_fk
164  FOREIGN KEY(team_id) REFERENCES teams(id)
165  ON DELETE CASCADE
166  ON UPDATE CASCADE,
167  CONSTRAINT repo_id_fk
168  FOREIGN KEY(repo_id) REFERENCES repos(id)
169  ON DELETE CASCADE
170  ON UPDATE CASCADE,
171  CONSTRAINT user_id_team_id_not_null
172  CHECK (user_id IS NULL <> team_id IS NULL)
173);
174
175-- Migrate collabs
176INSERT INTO collabs (id, user_id, team_id, repo_id, access_level, created_at, updated_at)
177SELECT id, user_id, NULL, repo_id, access_level, created_at, updated_at
178FROM _collabs_old;
179
180-- Drop old table
181DROP TABLE _collabs_old;