-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathdatabase.sql
More file actions
151 lines (130 loc) · 4.63 KB
/
database.sql
File metadata and controls
151 lines (130 loc) · 4.63 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
-- Enable necessary extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Create boards table
CREATE TABLE IF NOT EXISTS boards (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
description TEXT,
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create lists table
CREATE TABLE IF NOT EXISTS lists (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
board_id UUID NOT NULL REFERENCES boards(id) ON DELETE CASCADE,
position INTEGER NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create cards table
CREATE TABLE IF NOT EXISTS cards (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
description TEXT,
list_id UUID NOT NULL REFERENCES lists(id) ON DELETE CASCADE,
position INTEGER NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Enable Row Level Security
ALTER TABLE boards ENABLE ROW LEVEL SECURITY;
ALTER TABLE lists ENABLE ROW LEVEL SECURITY;
ALTER TABLE cards ENABLE ROW LEVEL SECURITY;
-- RLS Policies for boards
CREATE POLICY "Users can view their own boards" ON boards
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own boards" ON boards
FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own boards" ON boards
FOR UPDATE USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own boards" ON boards
FOR DELETE USING (auth.uid() = user_id);
-- RLS Policies for lists
CREATE POLICY "Users can view lists from their boards" ON lists
FOR SELECT USING (
EXISTS (
SELECT 1 FROM boards
WHERE boards.id = lists.board_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can insert lists to their boards" ON lists
FOR INSERT WITH CHECK (
EXISTS (
SELECT 1 FROM boards
WHERE boards.id = lists.board_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can update lists from their boards" ON lists
FOR UPDATE USING (
EXISTS (
SELECT 1 FROM boards
WHERE boards.id = lists.board_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete lists from their boards" ON lists
FOR DELETE USING (
EXISTS (
SELECT 1 FROM boards
WHERE boards.id = lists.board_id
AND boards.user_id = auth.uid()
)
);
-- RLS Policies for cards
CREATE POLICY "Users can view cards from their lists" ON cards
FOR SELECT USING (
EXISTS (
SELECT 1 FROM lists
JOIN boards ON boards.id = lists.board_id
WHERE lists.id = cards.list_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can insert cards to their lists" ON cards
FOR INSERT WITH CHECK (
EXISTS (
SELECT 1 FROM lists
JOIN boards ON boards.id = lists.board_id
WHERE lists.id = cards.list_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can update cards from their lists" ON cards
FOR UPDATE USING (
EXISTS (
SELECT 1 FROM lists
JOIN boards ON boards.id = lists.board_id
WHERE lists.id = cards.list_id
AND boards.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete cards from their lists" ON cards
FOR DELETE USING (
EXISTS (
SELECT 1 FROM lists
JOIN boards ON boards.id = lists.board_id
WHERE lists.id = cards.list_id
AND boards.user_id = auth.uid()
)
);
-- Function to update updated_at timestamp
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create triggers for updated_at
CREATE TRIGGER update_boards_updated_at BEFORE UPDATE ON boards
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_lists_updated_at BEFORE UPDATE ON lists
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_cards_updated_at BEFORE UPDATE ON cards
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Note: Sample data will be created automatically when you first log in
-- The app will create a default board with sample cards for new users