-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsupabase-setup.sql
More file actions
330 lines (290 loc) · 10.3 KB
/
Copy pathsupabase-setup.sql
File metadata and controls
330 lines (290 loc) · 10.3 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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
-- Supabase Database Setup for 4D BIM Application
--
-- This file contains the SQL commands to set up the database schema
-- Run these commands in your Supabase SQL Editor
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================
-- PROJECTS TABLE
-- ============================================
CREATE TABLE IF NOT EXISTS projects (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
description TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL
);
-- Create index on user_id for faster queries
CREATE INDEX IF NOT EXISTS idx_projects_user_id ON projects(user_id);
-- Enable Row Level Security
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
-- RLS Policies for projects
CREATE POLICY "Users can view their own projects"
ON projects FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can create their own projects"
ON projects FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own projects"
ON projects FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own projects"
ON projects FOR DELETE
USING (auth.uid() = user_id);
-- ============================================
-- TASKS TABLE
-- ============================================
CREATE TABLE IF NOT EXISTS tasks (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
task_id TEXT NOT NULL,
name TEXT NOT NULL,
start_date TIMESTAMPTZ NOT NULL,
end_date TIMESTAMPTZ NOT NULL,
duration NUMERIC DEFAULT 0,
percent_complete NUMERIC DEFAULT 0,
predecessors TEXT[],
resources TEXT[],
notes TEXT,
outline_level INTEGER DEFAULT 1,
outline_number TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(project_id, task_id)
);
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id);
CREATE INDEX IF NOT EXISTS idx_tasks_outline_number ON tasks(outline_number);
-- Enable Row Level Security
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
-- RLS Policies for tasks
CREATE POLICY "Users can view tasks in their projects"
ON tasks FOR SELECT
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = tasks.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can create tasks in their projects"
ON tasks FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = tasks.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can update tasks in their projects"
ON tasks FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = tasks.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete tasks in their projects"
ON tasks FOR DELETE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = tasks.project_id
AND projects.user_id = auth.uid()
)
);
-- ============================================
-- IFC MODELS TABLE
-- ============================================
CREATE TABLE IF NOT EXISTS ifc_models (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
name TEXT NOT NULL,
version INTEGER DEFAULT 1,
file_url TEXT,
file_hash TEXT,
uploaded_at TIMESTAMPTZ DEFAULT NOW(),
is_current BOOLEAN DEFAULT TRUE,
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL
);
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_ifc_models_project_id ON ifc_models(project_id);
CREATE INDEX IF NOT EXISTS idx_ifc_models_is_current ON ifc_models(is_current);
-- Enable Row Level Security
ALTER TABLE ifc_models ENABLE ROW LEVEL SECURITY;
-- RLS Policies for ifc_models
CREATE POLICY "Users can view IFC models in their projects"
ON ifc_models FOR SELECT
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = ifc_models.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can create IFC models in their projects"
ON ifc_models FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = ifc_models.project_id
AND projects.user_id = auth.uid()
)
AND auth.uid() = user_id
);
CREATE POLICY "Users can update IFC models in their projects"
ON ifc_models FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = ifc_models.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete IFC models in their projects"
ON ifc_models FOR DELETE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = ifc_models.project_id
AND projects.user_id = auth.uid()
)
);
-- ============================================
-- TASK ENTITY LINKS TABLE
-- ============================================
CREATE TABLE IF NOT EXISTS task_entity_links (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
task_id TEXT NOT NULL,
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
ifc_model_id UUID REFERENCES ifc_models(id) ON DELETE CASCADE NOT NULL,
entity_global_id TEXT NOT NULL,
entity_express_id INTEGER NOT NULL,
entity_type TEXT NOT NULL,
entity_name TEXT,
link_type TEXT CHECK (link_type IN ('manual', 'rule')) DEFAULT 'manual',
created_at TIMESTAMPTZ DEFAULT NOW(),
created_by UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL,
UNIQUE(task_id, project_id, entity_express_id)
);
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_task_entity_links_task_id ON task_entity_links(task_id);
CREATE INDEX IF NOT EXISTS idx_task_entity_links_project_id ON task_entity_links(project_id);
CREATE INDEX IF NOT EXISTS idx_task_entity_links_ifc_model_id ON task_entity_links(ifc_model_id);
CREATE INDEX IF NOT EXISTS idx_task_entity_links_entity_global_id ON task_entity_links(entity_global_id);
-- Enable Row Level Security
ALTER TABLE task_entity_links ENABLE ROW LEVEL SECURITY;
-- RLS Policies for task_entity_links
CREATE POLICY "Users can view task links in their projects"
ON task_entity_links FOR SELECT
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = task_entity_links.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can create task links in their projects"
ON task_entity_links FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = task_entity_links.project_id
AND projects.user_id = auth.uid()
)
AND auth.uid() = created_by
);
CREATE POLICY "Users can update task links in their projects"
ON task_entity_links FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = task_entity_links.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete task links in their projects"
ON task_entity_links FOR DELETE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = task_entity_links.project_id
AND projects.user_id = auth.uid()
)
);
-- ============================================
-- LINK RULES TABLE
-- ============================================
CREATE TABLE IF NOT EXISTS link_rules (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
task_id TEXT NOT NULL,
rule_type TEXT CHECK (rule_type IN ('property_match', 'name_pattern', 'type_filter')) NOT NULL,
rule_config JSONB NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
created_by UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL
);
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_link_rules_project_id ON link_rules(project_id);
CREATE INDEX IF NOT EXISTS idx_link_rules_task_id ON link_rules(task_id);
CREATE INDEX IF NOT EXISTS idx_link_rules_is_active ON link_rules(is_active);
-- Enable Row Level Security
ALTER TABLE link_rules ENABLE ROW LEVEL SECURITY;
-- RLS Policies for link_rules
CREATE POLICY "Users can view link rules in their projects"
ON link_rules FOR SELECT
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = link_rules.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can create link rules in their projects"
ON link_rules FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = link_rules.project_id
AND projects.user_id = auth.uid()
)
AND auth.uid() = created_by
);
CREATE POLICY "Users can update link rules in their projects"
ON link_rules FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = link_rules.project_id
AND projects.user_id = auth.uid()
)
);
CREATE POLICY "Users can delete link rules in their projects"
ON link_rules FOR DELETE
USING (
EXISTS (
SELECT 1 FROM projects
WHERE projects.id = link_rules.project_id
AND projects.user_id = auth.uid()
)
);
-- ============================================
-- TRIGGERS FOR UPDATED_AT
-- ============================================
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_projects_updated_at BEFORE UPDATE ON projects
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_tasks_updated_at BEFORE UPDATE ON tasks
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_link_rules_updated_at BEFORE UPDATE ON link_rules
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();