File size: 1,981 Bytes
7351a97 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | -- 1. Uživatelé (s bezpečným hashem)
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
password TEXT NOT NULL, -- Bcrypt hash
plan TEXT NOT NULL DEFAULT 'free',
stripe_cid TEXT,
api_key TEXT,
is_verified BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 2. Sessions (HttpOnly cookie tokeny)
CREATE TABLE sessions (
token TEXT PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
expires_at TIMESTAMPTZ NOT NULL
);
-- 3. Faktury
CREATE TABLE invoices (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
filename TEXT NOT NULL,
vendor TEXT,
inv_number TEXT,
inv_date TEXT,
due_date TEXT,
amount NUMERIC(12,2),
vat_amount NUMERIC(12,2),
total NUMERIC(12,2),
currency TEXT DEFAULT 'USD',
status TEXT DEFAULT 'done',
is_duplicate BOOLEAN DEFAULT FALSE,
confidence NUMERIC(4,3),
raw_json JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 4. Zapnutí Row-Level Security (RLS)
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE sessions ENABLE ROW LEVEL SECURITY;
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
-- 5. Politiky: Uživatel vidí a upravuje POUZE svá data
CREATE POLICY "Users can view own profile" ON users FOR SELECT USING (auth.uid() = id);
CREATE POLICY "Users can update own profile" ON users FOR UPDATE USING (auth.uid() = id);
CREATE POLICY "Users can view own invoices" ON invoices FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Users can insert own invoices" ON invoices FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can delete own invoices" ON invoices FOR DELETE USING (auth.uid() = user_id);
CREATE INDEX idx_invoices_user_month ON invoices(user_id, created_at); |