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);