All checks were successful
Build and Push Docker Images / build-and-push (push) Successful in 3m10s
Dodaje wspólny kalendarz wydarzeń grupy (zakres dat/godzin, cały dzień, notatki, lokalizacja, uczestnicy z gospodarstwa + goście zewnętrzni) oraz listy zakupów (wiele list, dodawanie/edycja/odznaczanie/usuwanie produktów). Nowe tabele w schemacie SQLite są czysto addytywne (CREATE TABLE IF NOT EXISTS), więc nie ruszają istniejących danych. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
128 lines
4.4 KiB
SQL
128 lines
4.4 KiB
SQL
CREATE TABLE IF NOT EXISTS users (
|
|
id TEXT PRIMARY KEY,
|
|
email TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
avatar_emoji TEXT NOT NULL DEFAULT '🙂',
|
|
email_notifications INTEGER NOT NULL DEFAULT 1,
|
|
language TEXT NOT NULL DEFAULT 'pl',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS password_resets (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
token TEXT UNIQUE NOT NULL,
|
|
expires_at TEXT NOT NULL,
|
|
used_at TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS households (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
currency TEXT NOT NULL DEFAULT 'PLN',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS household_members (
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
joined_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
PRIMARY KEY (household_id, user_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS invites (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
code TEXT UNIQUE NOT NULL,
|
|
created_by TEXT NOT NULL REFERENCES users(id),
|
|
expires_at TEXT NOT NULL,
|
|
used_at TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS categories (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
icon TEXT NOT NULL DEFAULT '🛒',
|
|
color TEXT NOT NULL DEFAULT '#6b7280'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS expenses (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
payer_id TEXT NOT NULL REFERENCES users(id),
|
|
amount REAL NOT NULL,
|
|
title TEXT NOT NULL,
|
|
category_id TEXT REFERENCES categories(id) ON DELETE SET NULL,
|
|
expense_date TEXT NOT NULL,
|
|
split_type TEXT NOT NULL CHECK (split_type IN ('equal', 'exact', 'full')),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS expense_shares (
|
|
expense_id TEXT NOT NULL REFERENCES expenses(id) ON DELETE CASCADE,
|
|
user_id TEXT NOT NULL REFERENCES users(id),
|
|
share_amount REAL NOT NULL,
|
|
PRIMARY KEY (expense_id, user_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS settlements (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
from_user_id TEXT NOT NULL REFERENCES users(id),
|
|
to_user_id TEXT NOT NULL REFERENCES users(id),
|
|
amount REAL NOT NULL,
|
|
settled_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS events (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
created_by TEXT NOT NULL REFERENCES users(id),
|
|
title TEXT NOT NULL,
|
|
notes TEXT,
|
|
location TEXT,
|
|
all_day INTEGER NOT NULL DEFAULT 0,
|
|
start_at TEXT NOT NULL,
|
|
end_at TEXT NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS event_attendees (
|
|
id TEXT PRIMARY KEY,
|
|
event_id TEXT NOT NULL REFERENCES events(id) ON DELETE CASCADE,
|
|
user_id TEXT REFERENCES users(id) ON DELETE CASCADE,
|
|
guest_name TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS shopping_lists (
|
|
id TEXT PRIMARY KEY,
|
|
household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
created_by TEXT NOT NULL REFERENCES users(id),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS shopping_list_items (
|
|
id TEXT PRIMARY KEY,
|
|
list_id TEXT NOT NULL REFERENCES shopping_lists(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
quantity TEXT,
|
|
checked INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_expenses_household ON expenses(household_id);
|
|
CREATE INDEX IF NOT EXISTS idx_expense_shares_expense ON expense_shares(expense_id);
|
|
CREATE INDEX IF NOT EXISTS idx_settlements_household ON settlements(household_id);
|
|
CREATE INDEX IF NOT EXISTS idx_events_household ON events(household_id);
|
|
CREATE INDEX IF NOT EXISTS idx_event_attendees_event ON event_attendees(event_id);
|
|
CREATE INDEX IF NOT EXISTS idx_shopping_lists_household ON shopping_lists(household_id);
|
|
CREATE INDEX IF NOT EXISTS idx_shopping_list_items_list ON shopping_list_items(list_id);
|