phonograph/interim-models/migrations/20250918060948_init.up.sql
2025-10-09 08:01:01 +00:00

112 lines
3.7 KiB
SQL

-- Users --
create table if not exists users (
id uuid not null primary key default uuidv7(),
uid text unique not null,
email text not null
);
create index on users (uid);
-- async_session Browser Sessions --
create table if not exists browser_sessions (
id text not null primary key,
serialized text not null,
created_at timestamptz not null default now(),
expiry timestamptz
);
create index on browser_sessions (expiry);
create index on browser_sessions (created_at);
-- Workspaces --
create table if not exists workspaces (
id uuid not null primary key default uuidv7(),
name text not null default '',
url text not null,
owner_id uuid not null references users(id) on delete restrict
);
create index on workspaces (owner_id);
create table if not exists workspace_user_perms (
id uuid not null primary key default uuidv7(),
workspace_id uuid not null references workspaces(id) on delete cascade,
user_id uuid not null references users(id) on delete cascade,
perm text not null,
unique (workspace_id, user_id, perm)
);
create index on workspace_user_perms (user_id);
create index on workspace_user_perms (workspace_id);
-- Relation Invitations --
create table if not exists rel_invitations (
id uuid not null primary key default uuidv7(),
email text not null,
workspace_id uuid not null references workspaces(id) on delete cascade,
class_oid oid not null,
created_by uuid not null references users(id) on delete restrict,
privilege text not null,
expires_at timestamptz,
unique (email, workspace_id, class_oid, privilege)
);
create index on rel_invitations (workspace_id, class_oid);
create index on rel_invitations (email);
-- Portals --
create table if not exists portals (
id uuid not null primary key default uuidv7(),
name text not null,
workspace_id uuid not null references workspaces(id) on delete cascade,
class_oid oid not null,
table_filter jsonb not null default 'null',
table_order_by jsonb not null default '[]'
);
create index on portals (workspace_id);
create table if not exists fields (
id uuid not null primary key default uuidv7(),
portal_id uuid not null references portals(id) on delete cascade,
name text not null,
presentation jsonb not null,
table_label text,
table_width_px int not null default 200
);
-- Forms --
create table if not exists form_transitions (
id uuid not null primary key default uuidv7(),
source_id uuid not null references portals(id) on delete cascade,
dest_id uuid not null references portals(id) on delete restrict,
condition jsonb not null default 'null'
);
create index on form_transitions (source_id);
create table if not exists field_form_prompts (
id uuid not null primary key default uuidv7(),
field_id uuid not null references fields(id) on delete cascade,
language text not null,
content text not null default '',
unique (field_id, language)
);
create index on field_form_prompts (field_id);
create table if not exists form_sessions (
id uuid not null primary key default uuidv7(),
user_id uuid references users(id) on delete cascade
);
create table if not exists form_touch_points (
id uuid not null primary key default uuidv7(),
-- `on delete restrict` errs on the side of conservatism, but is not known
-- to be crucial.
form_session_id uuid not null references form_sessions(id) on delete restrict,
-- `on delete restrict` errs on the side of conservatism, but is not known
-- to be crucial.
portal_id uuid not null references portals(id) on delete restrict,
-- Points to a row in the portal's backing table, so foreign key constraints
-- do not apply here.
row_id uuid not null
);