forked from Venkat-Kolasani/FutureStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterview-prep-migration.sql
More file actions
263 lines (228 loc) · 9.85 KB
/
Copy pathinterview-prep-migration.sql
File metadata and controls
263 lines (228 loc) · 9.85 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
-- =============================================================================
-- FutureTracker Interview Preparation Migration
-- Interview preparation workspace for internships
-- =============================================================================
-- =============================================================================
-- Interview Prep main table (linked to opportunities where category = 'internship')
-- =============================================================================
CREATE TABLE IF NOT EXISTS interview_prep (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
opportunity_id UUID REFERENCES opportunities(id) ON DELETE CASCADE NOT NULL UNIQUE,
user_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL,
company_research TEXT,
reflection_notes TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enable RLS on interview_prep table
ALTER TABLE interview_prep ENABLE ROW LEVEL SECURITY;
-- Users can only view their own interview prep
CREATE POLICY "Users can view own interview_prep" ON interview_prep
FOR SELECT USING (
user_id IN (SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub')
);
-- Users can create interview prep for their own internships
CREATE POLICY "Users can create own interview_prep" ON interview_prep
FOR INSERT WITH CHECK (
user_id IN (SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub')
AND opportunity_id IN (
SELECT id FROM opportunities
WHERE user_id = interview_prep.user_id
AND category = 'internship'
)
);
-- Users can update their own interview prep
CREATE POLICY "Users can update own interview_prep" ON interview_prep
FOR UPDATE USING (
user_id IN (SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub')
);
-- Users can delete their own interview prep
CREATE POLICY "Users can delete own interview_prep" ON interview_prep
FOR DELETE USING (
user_id IN (SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub')
);
-- =============================================================================
-- Interview Questions table
-- =============================================================================
CREATE TABLE IF NOT EXISTS interview_questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prep_id UUID REFERENCES interview_prep(id) ON DELETE CASCADE NOT NULL,
question TEXT NOT NULL,
answer TEXT,
is_prepared BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enable RLS on interview_questions table
ALTER TABLE interview_questions ENABLE ROW LEVEL SECURITY;
-- Users can view questions for their own prep
CREATE POLICY "Users can view own interview_questions" ON interview_questions
FOR SELECT USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can create questions for their own prep
CREATE POLICY "Users can create own interview_questions" ON interview_questions
FOR INSERT WITH CHECK (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can update questions for their own prep
CREATE POLICY "Users can update own interview_questions" ON interview_questions
FOR UPDATE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can delete questions from their own prep
CREATE POLICY "Users can delete own interview_questions" ON interview_questions
FOR DELETE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- =============================================================================
-- Technical Topics table
-- =============================================================================
CREATE TABLE IF NOT EXISTS technical_topics (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prep_id UUID REFERENCES interview_prep(id) ON DELETE CASCADE NOT NULL,
topic TEXT NOT NULL,
priority TEXT CHECK (priority IN ('low', 'medium', 'high')) DEFAULT 'medium',
priority_order INTEGER DEFAULT 2,
is_reviewed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enable RLS on technical_topics table
ALTER TABLE technical_topics ENABLE ROW LEVEL SECURITY;
-- Users can view topics for their own prep
CREATE POLICY "Users can view own technical_topics" ON technical_topics
FOR SELECT USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can create topics for their own prep
CREATE POLICY "Users can create own technical_topics" ON technical_topics
FOR INSERT WITH CHECK (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can update topics for their own prep
CREATE POLICY "Users can update own technical_topics" ON technical_topics
FOR UPDATE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can delete topics from their own prep
CREATE POLICY "Users can delete own technical_topics" ON technical_topics
FOR DELETE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- =============================================================================
-- Behavioral Prep table (STAR method)
-- =============================================================================
CREATE TABLE IF NOT EXISTS behavioral_prep (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prep_id UUID REFERENCES interview_prep(id) ON DELETE CASCADE NOT NULL,
question TEXT NOT NULL,
situation TEXT,
task TEXT,
action TEXT,
result TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enable RLS on behavioral_prep table
ALTER TABLE behavioral_prep ENABLE ROW LEVEL SECURITY;
-- Users can view behavioral prep for their own prep
CREATE POLICY "Users can view own behavioral_prep" ON behavioral_prep
FOR SELECT USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can create behavioral prep for their own prep
CREATE POLICY "Users can create own behavioral_prep" ON behavioral_prep
FOR INSERT WITH CHECK (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can update behavioral prep for their own prep
CREATE POLICY "Users can update own behavioral_prep" ON behavioral_prep
FOR UPDATE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- Users can delete behavioral prep from their own prep
CREATE POLICY "Users can delete own behavioral_prep" ON behavioral_prep
FOR DELETE USING (
prep_id IN (
SELECT id FROM interview_prep WHERE user_id IN (
SELECT id FROM users WHERE clerk_id = current_setting('request.jwt.claims', true)::json->>'sub'
)
)
);
-- =============================================================================
-- Indexes for performance
-- =============================================================================
CREATE INDEX IF NOT EXISTS idx_interview_prep_opportunity_id ON interview_prep(opportunity_id);
CREATE INDEX IF NOT EXISTS idx_interview_prep_user_id ON interview_prep(user_id);
CREATE INDEX IF NOT EXISTS idx_interview_questions_prep_id ON interview_questions(prep_id);
CREATE INDEX IF NOT EXISTS idx_technical_topics_prep_id ON technical_topics(prep_id);
CREATE INDEX IF NOT EXISTS idx_technical_topics_priority_order ON technical_topics(priority_order);
CREATE INDEX IF NOT EXISTS idx_behavioral_prep_prep_id ON behavioral_prep(prep_id);
-- =============================================================================
-- Updated_at triggers
-- =============================================================================
DROP TRIGGER IF EXISTS update_interview_prep_updated_at ON interview_prep;
CREATE TRIGGER update_interview_prep_updated_at
BEFORE UPDATE ON interview_prep
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_interview_questions_updated_at ON interview_questions;
CREATE TRIGGER update_interview_questions_updated_at
BEFORE UPDATE ON interview_questions
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_technical_topics_updated_at ON technical_topics;
CREATE TRIGGER update_technical_topics_updated_at
BEFORE UPDATE ON technical_topics
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_behavioral_prep_updated_at ON behavioral_prep;
CREATE TRIGGER update_behavioral_prep_updated_at
BEFORE UPDATE ON behavioral_prep
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();