aboutsummaryrefslogtreecommitdiffstats
path: root/internal/db/migrations/control/00001_init.sql
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db/migrations/control/00001_init.sql')
-rw-r--r--internal/db/migrations/control/00001_init.sql55
1 files changed, 6 insertions, 49 deletions
diff --git a/internal/db/migrations/control/00001_init.sql b/internal/db/migrations/control/00001_init.sql
index e27dad4..0b26b37 100644
--- a/internal/db/migrations/control/00001_init.sql
+++ b/internal/db/migrations/control/00001_init.sql
@@ -1,4 +1,6 @@
-- +goose Up
+-- The control database: accounts and the list of blogs. Everything a blog
+-- contains lives in its own database (see migrations/blog).
CREATE TABLE users (
id bigserial PRIMARY KEY,
username text NOT NULL UNIQUE,
@@ -9,60 +11,15 @@ CREATE TABLE users (
created_at timestamptz NOT NULL DEFAULT now()
);
+-- "blog_" + subdomain must fit a 63-char Postgres identifier, hence 58.
CREATE TABLE blogs (
id bigserial PRIMARY KEY,
owner_id bigint NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
- subdomain text NOT NULL UNIQUE CHECK (subdomain ~ '^[a-z0-9](-?[a-z0-9]){0,62}$'),
- title text NOT NULL,
- tagline text NOT NULL DEFAULT '',
- theme jsonb NOT NULL DEFAULT '{}'::jsonb,
- created_at timestamptz NOT NULL DEFAULT now(),
- updated_at timestamptz NOT NULL DEFAULT now()
+ subdomain text NOT NULL UNIQUE CHECK (subdomain ~ '^[a-z0-9](-?[a-z0-9]){0,57}$'),
+ db_name text NOT NULL UNIQUE,
+ created_at timestamptz NOT NULL DEFAULT now()
);
-CREATE TABLE pages (
- id bigserial PRIMARY KEY,
- blog_id bigint NOT NULL REFERENCES blogs(id) ON DELETE CASCADE,
- slug text NOT NULL,
- title text NOT NULL,
- intro_md text NOT NULL DEFAULT '',
- intro_html text NOT NULL DEFAULT '',
- nav_order integer NOT NULL DEFAULT 0,
- show_in_nav boolean NOT NULL DEFAULT true,
- is_home boolean NOT NULL DEFAULT false,
- created_at timestamptz NOT NULL DEFAULT now(),
- UNIQUE (blog_id, slug)
-);
-CREATE UNIQUE INDEX pages_one_home_per_blog ON pages (blog_id) WHERE is_home;
-
-CREATE TABLE posts (
- id bigserial PRIMARY KEY,
- page_id bigint NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
- slug text NOT NULL,
- title text NOT NULL,
- body_md text NOT NULL DEFAULT '',
- body_html text NOT NULL DEFAULT '',
- published boolean NOT NULL DEFAULT true,
- created_at timestamptz NOT NULL DEFAULT now(),
- updated_at timestamptz NOT NULL DEFAULT now(),
- UNIQUE (page_id, slug)
-);
-CREATE INDEX posts_page_created ON posts (page_id, created_at DESC);
-
-CREATE TABLE images (
- id uuid PRIMARY KEY,
- blog_id bigint NOT NULL REFERENCES blogs(id) ON DELETE CASCADE,
- filename text NOT NULL,
- content_type text NOT NULL,
- size integer NOT NULL,
- data bytea NOT NULL,
- created_at timestamptz NOT NULL DEFAULT now()
-);
-CREATE INDEX images_blog ON images (blog_id, created_at DESC);
-
-- +goose Down
-DROP TABLE images;
-DROP TABLE posts;
-DROP TABLE pages;
DROP TABLE blogs;
DROP TABLE users;