require "./database" module Guff MIGRATIONS = [{ id: "0-null", sql: %w{}, }, { id: "1-create-metadata", sql: [%{ CREATE TABLE metadata ( name TEXT PRIMARY KEY, value TEXT NOT NULL ) }], }, { id: "2-create-sites", sql: [%{ CREATE TABLE sites ( -- site id site_id INTEGER PRIMARY KEY, -- name of site name TEXT UNIQUE NOT NULL CHECK (LENGTH(name) > 0), -- is this the default site? is_default BOOLEAN NOT NULL DEFAULT false ) }, %{ INSERT INTO sites(name, is_default) VALUES ('Default', 1) }, %{ CREATE TABLE domains ( -- domain domain TEXT PRIMARY KEY CHECK ( LENGTH(domain) > 0 AND domain = LOWER(domain) ), -- site id site_id INTEGER NOT NULL REFERENCES sites(site_id) ) }], }, { id: "3-create-posts", sql: [%{ CREATE TABLE post_states ( state INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL ) }, %{ INSERT INTO post_states(state, name) VALUES (0, 'draft'), (1, 'posted'), (2, 'deleted') }, %{ CREATE TABLE posts ( -- unique id post_id INTEGER PRIMARY KEY, site_id INTEGER NOT NULL REFERENCES sites(site_id), state INTEGER NOT NULL DEFAULT 0 REFERENCES post_states(state), -- when this post was created created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- when this post was posted -- (that is, the draft status was removed) posted_at TIMESTAMP WITH TIME ZONE DEFAULT NULL, -- title of post name TEXT NOT NULL CHECK (LENGTH(name) > 0), -- slug of post (url fragment) slug TEXT NOT NULL CHECK (LENGTH(slug) > 0), -- raw body (raw text before filters) raw_body TEXT NOT NULL CHECK (LENGTH(raw_body) > 0), -- generated html (after filters) body TEXT NOT NULL CHECK (LENGTH(body) > 0) ) }, %{ CREATE INDEX in_posts_site_id ON posts(site_id) }, %{ CREATE INDEX in_posts_slug ON posts(slug) }, %{ CREATE INDEX in_posts_state ON posts(state) }, %{ CREATE INDEX in_posts_posted_at ON posts(posted_at) }], }, { id: "4-create-tags", sql: [%{ CREATE TABLE tags ( tag_id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL ) }, %{ CREATE INDEX in_tags_name ON tags(name) }, %{ CREATE TABLE post_tags ( tag_id INTEGER NOT NULL REFERENCES tags(tag_id), post_id INTEGER NOT NULL REFERENCES posts(post_id), UNIQUE(tag_id, post_id) ) }, %{ CREATE INDEX in_post_tags_tag_id ON post_tags(tag_id) }, %{ CREATE INDEX in_post_tags_post_id ON post_tags(post_id) }], }, { id: "5-sessions", sql: [%{ CREATE TABLE sessions ( session_id TEXT PRIMARY KEY, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, data TEXT NOT NULL DEFAULT '' ) }, %{ CREATE INDEX in_sessions_sid on sessions(session_id) }], }] end