1+ -- Add migration script here
2+ CREATE TABLE availability (
3+ id SERIAL PRIMARY KEY ,
4+
5+ user_id INT NOT NULL ,
6+ role_id INT NOT NULL ,
7+ campaign_id INT NOT NULL ,
8+
9+ start_time TIMESTAMPTZ NOT NULL ,
10+ end_time TIMESTAMPTZ NOT NULL ,
11+
12+ CONSTRAINT fk_availability_user
13+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ,
14+
15+ CONSTRAINT fk_availability_role
16+ FOREIGN KEY (role_id) REFERENCES campaign_roles(id) ON DELETE RESTRICT,
17+
18+ CONSTRAINT fk_availability_campaign
19+ FOREIGN KEY (campaign_id) REFERENCES campaigns(id) ON DELETE CASCADE ,
20+
21+ CONSTRAINT chk_availability_time
22+ CHECK (end_time > start_time),
23+
24+ CONSTRAINT unique_user_availability
25+ UNIQUE (user_id, campaign_id, start_time, end_time)
26+ );
27+
28+ CREATE TABLE interview_timeslots (
29+ id SERIAL PRIMARY KEY ,
30+
31+ campaign_id INT NOT NULL ,
32+
33+ start_time TIMESTAMPTZ NOT NULL ,
34+ end_time TIMESTAMPTZ NOT NULL ,
35+
36+ location TEXT ,
37+ description TEXT ,
38+ booked BOOLEAN NOT NULL DEFAULT FALSE,
39+
40+ CONSTRAINT fk_timeslot_campaign
41+ FOREIGN KEY (campaign_id) REFERENCES campaigns(id) ON DELETE CASCADE ,
42+
43+ CONSTRAINT chk_timeslot_time
44+ CHECK (end_time > start_time)
45+ );
46+
47+ CREATE TABLE interview_timeslot_users (
48+ interview_timeslot_id INT NOT NULL ,
49+ user_id INT NOT NULL ,
50+ role_id INT NOT NULL ,
51+
52+ interviewer BOOLEAN NOT NULL DEFAULT FALSE,
53+
54+ PRIMARY KEY (interview_timeslot_id, user_id),
55+
56+ CONSTRAINT fk_timeslot_user_timeslot
57+ FOREIGN KEY (interview_timeslot_id)
58+ REFERENCES interview_timeslots(id)
59+ ON DELETE CASCADE ,
60+
61+ CONSTRAINT fk_timeslot_user_user
62+ FOREIGN KEY (user_id)
63+ REFERENCES users(id)
64+ ON DELETE CASCADE ,
65+
66+ CONSTRAINT fk_timeslot_user_role
67+ FOREIGN KEY (role_id)
68+ REFERENCES campaign_roles(id)
69+ ON DELETE RESTRICT
70+ );
71+
72+ CREATE INDEX idx_availability_campaign
73+ ON availability(campaign_id);
74+
75+ CREATE INDEX idx_availability_user
76+ ON availability(user_id);
77+
78+ CREATE INDEX idx_timeslots_campaign
79+ ON interview_timeslots(campaign_id);
80+
81+ CREATE INDEX idx_timeslot_users_user
82+ ON interview_timeslot_users(user_id);
0 commit comments