-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
148 lines (131 loc) · 3.91 KB
/
Copy pathschema.sql
File metadata and controls
148 lines (131 loc) · 3.91 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
-- =====================================================
-- PORTFOLIO DATABASE SCHEMA
-- =====================================================
-- Enable necessary extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- PROJECTS TABLE
CREATE TABLE IF NOT EXISTS projects (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
year INTEGER NOT NULL,
company TEXT NOT NULL,
role TEXT NOT NULL,
description TEXT,
lessons TEXT,
image_url TEXT,
order_index INTEGER DEFAULT 0,
category TEXT,
is_unlocked BOOLEAN DEFAULT true,
published BOOLEAN DEFAULT false,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-- Detailed project fields
phase TEXT,
project_type TEXT,
situation TEXT,
task TEXT,
result TEXT,
contributions JSONB,
key_results JSONB,
tags TEXT[],
metrics JSONB,
-- URL fields
company_url TEXT,
project_url TEXT,
report_url TEXT,
demo_url TEXT,
company_label TEXT,
project_label TEXT,
report_label TEXT,
demo_label TEXT,
company_urls JSONB,
project_urls JSONB,
report_urls JSONB,
demo_urls JSONB,
video_poster TEXT,
video_fallback TEXT
);
-- COLLABORATORS TABLE
CREATE TABLE IF NOT EXISTS collaborators (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
name TEXT NOT NULL,
linkedin_url TEXT,
profile_image_url TEXT,
role TEXT,
order_index INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- FAILURES TABLE (Mirror structure for specific tracking)
CREATE TABLE IF NOT EXISTS failures (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
year INTEGER NOT NULL,
company TEXT,
role TEXT,
description TEXT,
lessons TEXT,
image_url TEXT,
order_index INTEGER DEFAULT 0,
category TEXT,
is_unlocked BOOLEAN DEFAULT true,
published BOOLEAN DEFAULT false,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-- Additional fields
phase TEXT,
project_type TEXT,
situation TEXT,
task TEXT,
result TEXT,
contributions JSONB,
key_results JSONB,
tags TEXT[],
metrics JSONB,
-- URL fields
company_url TEXT,
project_url TEXT,
report_url TEXT,
demo_url TEXT,
company_label TEXT,
project_label TEXT,
report_label TEXT,
demo_label TEXT,
company_urls JSONB,
project_urls JSONB,
report_urls JSONB,
demo_urls JSONB,
video_poster TEXT,
video_fallback TEXT
);
-- SECURITY (Row Level Security)
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
ALTER TABLE collaborators ENABLE ROW LEVEL SECURITY;
ALTER TABLE failures ENABLE ROW LEVEL SECURITY;
-- POLICIES
CREATE POLICY "Public read access to published projects" ON projects
FOR SELECT USING (published = true);
CREATE POLICY "Public read access to collaborators" ON collaborators
FOR SELECT USING (true);
CREATE POLICY "Public read access to published failures" ON failures
FOR SELECT USING (published = true);
-- INDEXES
CREATE INDEX IF NOT EXISTS idx_projects_published ON projects(published);
CREATE INDEX IF NOT EXISTS idx_projects_year ON projects(year DESC);
CREATE INDEX IF NOT EXISTS idx_collaborators_project_id ON collaborators(project_id);
CREATE INDEX IF NOT EXISTS idx_failures_published ON failures(published);
-- 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_collaborators_updated_at BEFORE UPDATE ON collaborators
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_failures_updated_at BEFORE UPDATE ON failures
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();