docs: a to-do app as the example schema in the docs, fixtures and tests
This commit is contained in:
@@ -10,13 +10,13 @@ CREATE TABLE demo.users (
|
||||
manager_id integer REFERENCES demo.users (id)
|
||||
);
|
||||
|
||||
CREATE TABLE demo.assets (
|
||||
CREATE TABLE demo.todos (
|
||||
id integer PRIMARY KEY,
|
||||
name text NOT NULL,
|
||||
status text NOT NULL,
|
||||
owner_id integer REFERENCES demo.users (id),
|
||||
cost numeric(10, 2),
|
||||
active boolean NOT NULL DEFAULT true,
|
||||
estimate numeric(10, 2),
|
||||
pinned boolean NOT NULL DEFAULT true,
|
||||
created_at timestamptz NOT NULL
|
||||
);
|
||||
|
||||
@@ -25,18 +25,18 @@ CREATE TABLE demo.tags (
|
||||
name text NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
CREATE TABLE demo.asset_tags (
|
||||
asset_id integer NOT NULL REFERENCES demo.assets (id),
|
||||
CREATE TABLE demo.todo_tags (
|
||||
todo_id integer NOT NULL REFERENCES demo.todos (id),
|
||||
tag_id integer NOT NULL REFERENCES demo.tags (id),
|
||||
PRIMARY KEY (asset_id, tag_id)
|
||||
PRIMARY KEY (todo_id, tag_id)
|
||||
);
|
||||
|
||||
CREATE TABLE demo.incidents (
|
||||
CREATE TABLE demo.steps (
|
||||
id integer PRIMARY KEY,
|
||||
title text NOT NULL,
|
||||
asset_id integer NOT NULL REFERENCES demo.assets (id),
|
||||
severity integer NOT NULL,
|
||||
opened_on date NOT NULL
|
||||
todo_id integer NOT NULL REFERENCES demo.todos (id),
|
||||
priority integer NOT NULL,
|
||||
due_on date NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO demo.users (id, name, email, password_hash, "limit", manager_id) VALUES
|
||||
@@ -44,27 +44,27 @@ INSERT INTO demo.users (id, name, email, password_hash, "limit", manager_id) VAL
|
||||
(2, 'Grace', 'grace@example.com', 'x', NULL, 1),
|
||||
(3, 'Linus', NULL, 'x', 2, 1);
|
||||
|
||||
INSERT INTO demo.assets (id, name, status, owner_id, cost, active, created_at) VALUES
|
||||
(1, 'vpn gateway', 'open', 1, 1200.50, true, '2026-01-02T10:00:00Z'),
|
||||
(2, 'mail relay', 'open', 2, 300.00, true, '2026-01-05T09:30:00Z'),
|
||||
(3, 'old wiki', 'retired', NULL, NULL, false, '2025-06-01T00:00:00Z'),
|
||||
(4, 'payroll db', 'open', 3, 4000.00, true, '2026-02-11T16:45:00Z');
|
||||
INSERT INTO demo.todos (id, name, status, owner_id, estimate, pinned, created_at) VALUES
|
||||
(1, 'water plants', 'open', 1, 2.50, true, '2026-01-02T10:00:00Z'),
|
||||
(2, 'file taxes', 'open', 2, 1.00, true, '2026-01-05T09:30:00Z'),
|
||||
(3, 'fix bike', 'done', NULL, NULL, false, '2025-06-01T00:00:00Z'),
|
||||
(4, 'pay rent', 'open', 3, 4.00, true, '2026-02-11T16:45:00Z');
|
||||
|
||||
INSERT INTO demo.tags (id, name) VALUES (1, 'pci'), (2, 'gdpr'), (3, 'internal');
|
||||
INSERT INTO demo.tags (id, name) VALUES (1, 'work'), (2, 'home'), (3, 'urgent');
|
||||
|
||||
INSERT INTO demo.asset_tags (asset_id, tag_id) VALUES (1, 1), (1, 3), (2, 2), (4, 1), (4, 2);
|
||||
INSERT INTO demo.todo_tags (todo_id, tag_id) VALUES (1, 1), (1, 3), (2, 2), (4, 1), (4, 2);
|
||||
|
||||
INSERT INTO demo.incidents (id, title, asset_id, severity, opened_on) VALUES
|
||||
(1, 'VPN outage', 1, 3, '2026-01-10'),
|
||||
(2, 'Spoofed mail', 2, 2, '2026-02-01'),
|
||||
(3, 'Brute force', 1, 4, '2026-03-05');
|
||||
INSERT INTO demo.steps (id, title, todo_id, priority, due_on) VALUES
|
||||
(1, 'Water the ferns', 1, 3, '2026-01-10'),
|
||||
(2, 'Find the receipts', 2, 2, '2026-02-01'),
|
||||
(3, 'Buy a watering can', 1, 4, '2026-03-05');
|
||||
|
||||
CREATE FUNCTION demo.retire_asset(asset integer, reason text DEFAULT NULL) RETURNS integer
|
||||
LANGUAGE sql AS $$ UPDATE demo.assets SET status = 'retired' WHERE id = asset RETURNING id $$;
|
||||
CREATE FUNCTION demo.complete_todo(todo integer, note text DEFAULT NULL) RETURNS integer
|
||||
LANGUAGE sql AS $$ UPDATE demo.todos SET status = 'done' WHERE id = todo RETURNING id $$;
|
||||
|
||||
CREATE FUNCTION demo.assets_tagged(tag text) RETURNS SETOF demo.assets
|
||||
CREATE FUNCTION demo.todos_tagged(tag text) RETURNS SETOF demo.todos
|
||||
LANGUAGE sql STABLE AS $$
|
||||
SELECT a.* FROM demo.assets a JOIN demo.asset_tags t ON t.asset_id = a.id JOIN demo.tags g ON g.id = t.tag_id
|
||||
SELECT a.* FROM demo.todos a JOIN demo.todo_tags t ON t.todo_id = a.id JOIN demo.tags g ON g.id = t.tag_id
|
||||
WHERE g.name = tag ORDER BY a.id $$;
|
||||
|
||||
CREATE TABLE demo.notes (
|
||||
|
||||
Reference in New Issue
Block a user