ls-deno/db-migrations.ts
2022-10-01 14:03:15 -05:00

75 lines
1.8 KiB
TypeScript

import { query } from "@/db.ts";
const id = "id uuid primary key default uuid_generate_v4()";
interface TableSpec {
columns: string[];
additionalStatements?: string[];
prepStatements?: string[];
}
const timestamps = [
"created_at timestamptz not null default now()",
"updated_at timestamptz not null default now()",
];
const tables: Record<string, TableSpec> = {
"note": {
columns: [id, "content text not null", ...timestamps],
},
"user": {
columns: [
id,
"username text not null unique",
"hashed_password text not null",
"name text",
...timestamps,
],
},
"team": {
columns: [
id,
"name text not null",
...timestamps,
],
additionalStatements: [
'create index name_idx on team ("name")',
],
},
"team_user": {
prepStatements: [
"drop type if exists team_user_status",
"create type team_user_status as enum ('invited', 'accepted', 'owner')",
],
columns: [
"team_id uuid",
"user_id uuid",
"status team_user_status",
...timestamps,
],
additionalStatements: [
"create index team_user_idx on team_user (team_id) include (user_id)",
"create index team_idx on team_user (team_id)",
"create index user_idx on team_user (user_id)",
"create index status_idx on team_user (status)",
],
},
};
const tableStatements = Object.entries(tables).map(([name, meta]) => `
${(meta.prepStatements || []).map((s) => `${s};`).join("\n")}
-- TABLE ${name}
drop table if exists "${name}";
create table "${name}" (
${meta.columns.join(",\n ")}
);
${(meta.additionalStatements || []).map((s) => `${s};`).join("\n")}
`);
const queryString = `
create extension if not exists "uuid-ossp";
${tableStatements.map((s) => s.trim()).join("\n\n")}
`;
console.log(queryString);
await query(queryString);