-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadd_functions.sql
More file actions
184 lines (162 loc) · 4.53 KB
/
add_functions.sql
File metadata and controls
184 lines (162 loc) · 4.53 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
\c tdl;
\set AUTOCOMMIT off
BEGIN;
CREATE OR REPLACE FUNCTION select_user_id_by_username(VARCHAR) RETURNS TABLE (
id BIGINT
)
AS
$$
BEGIN
RETURN QUERY
SELECT user_account.id FROM user_account
WHERE user_account.username = $1;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION validate_password(BIGINT, VARCHAR) RETURNS TABLE (
id BIGINT
)
AS
$$
BEGIN
RETURN QUERY
SELECT user_account.id FROM user_account
WHERE user_account.id = $1 AND user_account.password = $2;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION create_user(VARCHAR, VARCHAR) RETURNS VOID AS
$$
BEGIN
IF NOT EXISTS (SELECT id FROM select_user_id_by_username($1)) THEN
INSERT INTO user_account (username, password)
VALUES (
$1,
$2
);
INSERT INTO user_additional_info (user_id)
VALUES (
(SELECT id FROM user_account WHERE username = $1)
);
END IF;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION delete_user(BIGINT) RETURNS VOID AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM user_account WHERE user_account.id = $1) THEN
DELETE FROM note
WHERE note.user_id = $1;
DELETE FROM user_additional_info
WHERE user_additional_info.user_id = (SELECT id FROM user_account WHERE id = $1);
DELETE FROM user_account
WHERE user_account.id = $1;
END IF;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION create_note(BIGINT, VARCHAR, BIGINT) RETURNS VOID AS
$$
DECLARE
new_prio BIGINT := $3;
max_prio BIGINT := (SELECT COUNT(*) FROM note WHERE note.user_id = $1);
BEGIN
IF EXISTS (SELECT 1 FROM user_account WHERE user_account.id = $1) THEN
IF new_prio > max_prio THEN
new_prio = max_prio + 1;
ELSIF new_prio <= 0 THEN
new_prio = 1;
END IF;
UPDATE note SET priority = priority + 1
WHERE user_id = $1 AND priority >= new_prio;
INSERT INTO note (user_id, headline, priority) VALUES (
(SELECT id FROM user_account WHERE id = $1),
$2,
new_prio
);
END IF;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION delete_note(BIGINT, BIGINT) RETURNS VOID AS
$$
DECLARE
old_prio BIGINT := (SELECT priority FROM note WHERE note.user_id = $1 AND note.id = $2);
BEGIN
IF EXISTS (SELECT 1 FROM user_account WHERE user_account.id = $1) THEN
DELETE FROM note
WHERE note.user_id = $1 AND note.id = $2;
UPDATE note SET priority = priority - 1
WHERE user_id = $1 AND priority >= old_prio;
END IF;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION show_user_notes(BIGINT)
RETURNS TABLE (
user_id BIGINT,
username VARCHAR,
note_id BIGINT,
headline VARCHAR,
priority BIGINT,
status BOOL,
date_created TIMESTAMPTZ
)
AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM user_account WHERE user_account.id = $1) THEN
RETURN QUERY
SELECT
user_account.id,
user_account.username,
note.id,
note.headline,
note.priority,
note.status,
note.date_created
FROM user_account
INNER JOIN note
ON user_account.id = note.user_id
WHERE user_account.id = $1
ORDER BY note.priority ASC;
END IF;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION update_priority(BIGINT, BIGINT, BIGINT) RETURNS VOID AS
$$
DECLARE
new_prio BIGINT := $3;
max_prio BIGINT := (SELECT COUNT(*) FROM note WHERE note.user_id = $1);
old_prio BIGINT := (SELECT priority FROM note WHERE note.user_id = $1 AND note.id = $2);
BEGIN
IF new_prio > max_prio THEN
new_prio = max_prio;
ELSIF new_prio <= 0 THEN
new_prio = 1;
END IF;
UPDATE note SET priority = priority - 1
WHERE user_id = $1 AND priority > old_prio AND priority <= new_prio;
UPDATE note SET priority = priority + 1
WHERE user_id = $1 AND priority >= new_prio AND priority < old_prio;
UPDATE note SET priority = new_prio
WHERE user_id = $1 AND id = $2;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION select_max_priority(BIGINT) RETURNS TABLE (
priority BIGINT
)
AS
$$
BEGIN
RETURN QUERY
SELECT note.priority FROM note
WHERE note.user_id = $1
ORDER BY priority DESC
LIMIT 1;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION change_status(BIGINT, BIGINT) RETURNS VOID
AS
$$
BEGIN
UPDATE note SET status = NOT status
WHERE user_id = $1 AND id = $2;
END
$$ LANGUAGE plpgsql;
COMMIT;