-- +brant Up CREATE TYPE visibility AS ENUM ( 'PUBLIC', 'PRIVATE', 'UNLISTED' ); CREATE TYPE user_type AS ENUM ( 'PENDING', 'USER', 'ADMIN', 'SUSPENDED' ); CREATE TYPE access_mode AS ENUM ( 'RO', 'RW' ); CREATE TABLE "user" ( id integer PRIMARY KEY, username varchar(256) UNIQUE, created timestamp NOT NULL, updated timestamp NOT NULL, email varchar(256) NOT NULL UNIQUE, user_type user_type NOT NULL, url varchar(256), location varchar(256), bio varchar(4096), suspension_notice varchar(4096) ); CREATE INDEX ix_user_username ON "user"(username); CREATE TABLE repository ( id serial PRIMARY KEY, created timestamp NOT NULL, updated timestamp NOT NULL, name varchar(64) NOT NULL, description varchar(1024), owner_id integer NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, path varchar(1024) NOT NULL UNIQUE, visibility visibility NOT NULL, CONSTRAINT uq_repo_owner_id_name UNIQUE (owner_id, name) ); CREATE TABLE access ( id serial PRIMARY KEY, created timestamp NOT NULL, updated timestamp NOT NULL, repo_id integer NOT NULL REFERENCES repository(id) ON DELETE CASCADE, user_id integer NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, mode access_mode NOT NULL, CONSTRAINT uq_access_user_id_repo_id UNIQUE (user_id, repo_id) ); CREATE TABLE dolt_key ( id serial PRIMARY KEY, created timestamp NOT NULL, user_id integer NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, kid varchar(64) NOT NULL UNIQUE, pubkey bytea NOT NULL, comment varchar(256), last_used timestamp ); -- +brant Down DROP TABLE dolt_key; DROP TABLE access; DROP TABLE repository; DROP TABLE "user"; DROP TYPE access_mode; DROP TYPE user_type; DROP TYPE visibility;