diff options
| author | grm <grm@eyesin.space> | 2026-09-14 00:51:19 +0300 |
|---|---|---|
| committer | grm <grm@eyesin.space> | 2026-09-14 00:51:19 +0300 |
| commit | 282d2ab3e0fb3a74f32160a231225773001acd14 (patch) | |
| tree | b15c105c0c5d79467d3b815af4c67f5bf4a02d9d /internal/db/migrations/control/00001_init.sql | |
| parent | 0de17af2318134549fa6f4db822ba6921b35f12f (diff) | |
| download | blogspace-282d2ab3e0fb3a74f32160a231225773001acd14.tar.gz blogspace-282d2ab3e0fb3a74f32160a231225773001acd14.tar.bz2 blogspace-282d2ab3e0fb3a74f32160a231225773001acd14.zip | |
Drop the single-database split and re-baseline the control migrations
Every deployment has been through the per-blog split, so the code that
performed it (split.go, control migrations 00002–00007) is dead weight, and a
fresh install replaying six migrations only to drop the tables again was
silly. The control chain is now a single 00001_init.sql with the final users
and blogs shape, matching the blog chain.
Goose ignores versions recorded in the database that no longer exist in the
source, but refuses a future migration numbered below the database's highest
version. Databases that went through the split therefore need
`DELETE FROM goose_db_version WHERE version_id > 1` once; README and
AGENTS.md say so.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sd8UPWrvyYCLj97JexNw3A
Diffstat (limited to 'internal/db/migrations/control/00001_init.sql')
| -rw-r--r-- | internal/db/migrations/control/00001_init.sql | 55 |
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; |
