-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.sql
More file actions
93 lines (73 loc) · 2.49 KB
/
Copy pathdatabase.sql
File metadata and controls
93 lines (73 loc) · 2.49 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
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role VARCHAR(10) NOT NULL
CHECK (role IN ('admin', 'user')),
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_by_admin_id INTEGER,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_user_creator
FOREIGN KEY (created_by_admin_id)
REFERENCES users(id)
ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS messages (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
admin_id INTEGER NOT NULL,
attachment_filename VARCHAR(255),
attachment_stored_filename VARCHAR(255),
attachment_content_type VARCHAR(100),
attachment_size BIGINT,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_message_admin
FOREIGN KEY (admin_id)
REFERENCES users(id)
ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS message_recipients (
id SERIAL PRIMARY KEY,
message_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
is_read BOOLEAN NOT NULL DEFAULT FALSE,
read_at TIMESTAMPTZ,
CONSTRAINT fk_recipient_message
FOREIGN KEY (message_id)
REFERENCES messages(id)
ON DELETE CASCADE,
CONSTRAINT fk_recipient_user
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE,
CONSTRAINT unique_message_user
UNIQUE (message_id, user_id),
CONSTRAINT valid_read_status
CHECK (
(is_read = FALSE AND read_at IS NULL)
OR
(is_read = TRUE AND read_at IS NOT NULL)
)
);
CREATE INDEX IF NOT EXISTS idx_messages_admin_id
ON messages(admin_id);
CREATE INDEX IF NOT EXISTS idx_messages_created_at
ON messages(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_recipients_user_id
ON message_recipients(user_id);
CREATE INDEX IF NOT EXISTS idx_recipients_user_read
ON message_recipients(user_id, is_read);
ALTER TABLE users
ADD COLUMN IF NOT EXISTS created_by_admin_id INTEGER;
ALTER TABLE messages
ADD COLUMN IF NOT EXISTS attachment_filename VARCHAR(255);
ALTER TABLE messages
ADD COLUMN IF NOT EXISTS attachment_stored_filename VARCHAR(255);
ALTER TABLE messages
ADD COLUMN IF NOT EXISTS attachment_content_type VARCHAR(100);
ALTER TABLE messages
ADD COLUMN IF NOT EXISTS attachment_size BIGINT;
INSERT INTO users (username, password_hash, role)
VALUES ('admin', 'admin123', 'admin')
ON CONFLICT (username) DO NOTHING;