brewlog/migrations/0002_coffee.sql
Jon Seager b5e91d9d0d
refactor(db): consolidate 21 migrations into 4 clean files
No production instances exist, so safe to rewrite from scratch.
Drops columns that were added then removed (notes, password_hash,
cup rating), standardises timestamp format and primary key style,
and creates all tables in their final form without incremental
ALTER TABLE churn.
2026-02-05 21:06:37 +00:00

51 lines
1.7 KiB
SQL

-- Coffee supply chain and equipment tables
CREATE TABLE roasters (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
country TEXT NOT NULL,
city TEXT,
homepage TEXT,
slug TEXT,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
CREATE UNIQUE INDEX idx_roasters_slug ON roasters(slug);
CREATE TABLE roasts (
id INTEGER PRIMARY KEY,
roaster_id INTEGER NOT NULL REFERENCES roasters(id) ON DELETE CASCADE,
name TEXT NOT NULL,
origin TEXT,
region TEXT,
producer TEXT,
process TEXT,
tasting_notes TEXT,
slug TEXT,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
CREATE INDEX idx_roasts_roaster_id ON roasts(roaster_id);
CREATE UNIQUE INDEX idx_roasts_roaster_slug ON roasts(roaster_id, slug);
CREATE TABLE bags (
id INTEGER PRIMARY KEY,
roast_id INTEGER NOT NULL REFERENCES roasts(id) ON DELETE CASCADE,
roast_date TEXT,
amount REAL NOT NULL,
remaining REAL NOT NULL,
closed BOOLEAN NOT NULL DEFAULT FALSE,
finished_at TEXT,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
CREATE INDEX idx_bags_roast_id ON bags(roast_id);
CREATE INDEX idx_bags_closed ON bags(closed);
CREATE TABLE gear (
id INTEGER PRIMARY KEY,
category TEXT NOT NULL CHECK (category IN ('grinder', 'brewer', 'filter_paper')),
make TEXT NOT NULL,
model TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
CREATE INDEX idx_gear_category ON gear(category);