| | 3 | |
| | 4 | === Проверка дали даден топик имат уникатно име во парент threadот |
| | 5 | {{{ |
| | 6 | CREATE OR REPLACE FUNCTION fn_validate_topic_title() |
| | 7 | RETURNS TRIGGER |
| | 8 | LANGUAGE plpgsql |
| | 9 | AS |
| | 10 | $$ |
| | 11 | BEGIN |
| | 12 | IF new.title IN |
| | 13 | (SELECT title |
| | 14 | FROM topic_thread |
| | 15 | AS t |
| | 16 | WHERE t.parent_id = new.parent_id |
| | 17 | OR (t.parent_id IS NULL AND new.parent_id IS NULL) |
| | 18 | ) |
| | 19 | THEN |
| | 20 | RAISE EXCEPTION 'There already exists a topic with title % in parent topic with id %',new.title,new.parent_id; |
| | 21 | END IF; |
| | 22 | RETURN new; |
| | 23 | END; |
| | 24 | $$; |
| | 25 | }}} |
| | 26 | {{{ |
| | 27 | CREATE OR REPLACE TRIGGER tr_check_topic_name --RADI |
| | 28 | BEFORE INSERT OR UPDATE |
| | 29 | ON topic_thread |
| | 30 | FOR EACH ROW |
| | 31 | EXECUTE FUNCTION fn_validate_topic_title(); |
| | 32 | }}} |
| | 33 | |
| | 34 | === При креирање на топик, креаторот се внесува како модератор |
| | 35 | {{{ |
| | 36 | CREATE OR REPLACE FUNCTION fn_insert_topics_creator_as_moderator() |
| | 37 | RETURNS TRIGGER |
| | 38 | LANGUAGE plpgsql |
| | 39 | AS |
| | 40 | $$ |
| | 41 | DECLARE |
| | 42 | v_user_id INT; |
| | 43 | BEGIN |
| | 44 | SELECT v_topic_thread.user_id |
| | 45 | INTO v_user_id |
| | 46 | FROM v_topic_thread |
| | 47 | WHERE v_topic_thread.id = new.id; |
| | 48 | IF not check_if_user_exists_in('moderator', 'id', v_user_id::text) THEN |
| | 49 | INSERT INTO moderator values (v_user_id); |
| | 50 | END IF; |
| | 51 | INSERT INTO topic_threads_moderators(thread_id, user_id) VALUES (new.id, v_user_id); |
| | 52 | RETURN NEW; |
| | 53 | END |
| | 54 | $$; |
| | 55 | }}} |
| | 56 | {{{ |
| | 57 | CREATE OR REPLACE TRIGGER tr_insert_topics_creator_as_moderator |
| | 58 | AFTER INSERT |
| | 59 | ON topic_thread |
| | 60 | FOR EACH ROW |
| | 61 | EXECUTE FUNCTION fn_insert_topics_creator_as_moderator(); |
| | 62 | }}} |
| | 63 | |
| | 64 | === При бришење на topic, проверка дали модераторот сеуште модерира topicци |
| | 65 | {{{ |
| | 66 | CREATE OR REPLACE FUNCTION fn_remove_orphan_moderator() |
| | 67 | RETURNS trigger |
| | 68 | LANGUAGE plpgsql |
| | 69 | AS $function$ |
| | 70 | BEGIN |
| | 71 | IF not exists ( |
| | 72 | select 1 |
| | 73 | from topic_threads_moderators t |
| | 74 | where t.user_id = OLD.user_id |
| | 75 | ) |
| | 76 | THEN |
| | 77 | DELETE FROM moderator where id=OLD.user_id; |
| | 78 | END IF; |
| | 79 | IF not exists ( |
| | 80 | select 1 |
| | 81 | from topic_threads_moderators t |
| | 82 | where t.thread_id = OLD.thread_id |
| | 83 | ) |
| | 84 | THEN |
| | 85 | delete from discussion_thread where parent_id=OLD.thread_id; |
| | 86 | DELETE FROM topic_thread where id = OLD.thread_id; |
| | 87 | -- delete from thread where id = OLD.thread_id; |
| | 88 | END IF; |
| | 89 | RETURN OLD; |
| | 90 | END; |
| | 91 | }}} |
| | 92 | |
| | 93 | {{{ |
| | 94 | CREATE OR REPLACE TRIGGER tr_remove_orphan_moderator |
| | 95 | AFTER DELETE |
| | 96 | ON topic_threads_moderators |
| | 97 | FOR EACH ROW |
| | 98 | EXECUTE FUNCTION fn_remove_orphan_moderator(); |
| | 99 | }}} |
| | 100 | |
| | 101 | === При креирање на проект, креаторот се внесува како PROJECT_OWNER |
| | 102 | {{{ |
| | 103 | CREATE OR REPLACE FUNCTION fn_insert_project_manager() |
| | 104 | RETURNS TRIGGER |
| | 105 | LANGUAGE plpgsql |
| | 106 | AS |
| | 107 | $$ |
| | 108 | DECLARE |
| | 109 | usrId INT; |
| | 110 | new_project_id INT; |
| | 111 | BEGIN |
| | 112 | SELECT user_id, id |
| | 113 | into usrId,new_project_id |
| | 114 | FROM v_project_thread p |
| | 115 | WHERE NEW.id = p.id; |
| | 116 | IF not EXISTS( |
| | 117 | select 1 |
| | 118 | from developer_associated_with_project dawp |
| | 119 | where dawp.project_id=new_project_id and dawp.developer_id=usrId |
| | 120 | ) THEN |
| | 121 | INSERT INTO developer_associated_with_project(project_id, developer_id, started_at) |
| | 122 | values (new_project_id, usrId, NOW()); |
| | 123 | end if; |
| | 124 | IF not check_if_user_exists_in('project_manager', 'id', usrId::text) THEN |
| | 125 | INSERT INTO project_manager VALUES (usrId); |
| | 126 | end if; |
| | 127 | RETURN NEW; |
| | 128 | END |
| | 129 | $$; |
| | 130 | }}} |
| | 131 | |
| | 132 | {{{ |
| | 133 | CREATE OR REPLACE TRIGGER tr_a_insert_project_manager --RADI |
| | 134 | AFTER INSERT |
| | 135 | ON project_thread |
| | 136 | FOR EACH ROW |
| | 137 | EXECUTE FUNCTION fn_insert_project_manager(); |
| | 138 | }}} |
| | 139 | |
| | 140 | |
| | 141 | === Бришење на не користени тагови |
| | 142 | |
| | 143 | {{{ |
| | 144 | create or replace function fn_delete_dangling_tags() |
| | 145 | RETURNS trigger |
| | 146 | LANGUAGE plpgsql |
| | 147 | AS $$ |
| | 148 | BEGIN |
| | 149 | IF NOT EXISTS(select 1 |
| | 150 | from tag_threads |
| | 151 | where tag_name = OLD.tag_name |
| | 152 | group by tag_name) THEN |
| | 153 | delete from tag where name = OLD.tag_name; |
| | 154 | end if; |
| | 155 | RETURN OLD; |
| | 156 | END; |
| | 157 | $$; |
| | 158 | }}} |
| | 159 | |
| | 160 | {{{ |
| | 161 | create or replace trigger tr_delete_dangling_tags |
| | 162 | after delete |
| | 163 | on tag_threads |
| | 164 | for each row |
| | 165 | execute function fn_delete_dangling_tags(); |
| | 166 | }}} |
| | 167 | |
| | 168 | === Внесување на даден корисник како developer, откако ќе стани дел од даден проект |
| | 169 | {{{ |
| | 170 | create or replace function fn_add_dev_if_not_exist() |
| | 171 | returns trigger |
| | 172 | language plpgsql |
| | 173 | as $$ |
| | 174 | BEGIN |
| | 175 | IF NOT check_if_user_exists_in('developer','id',new.developer_id::text) THEN |
| | 176 | INSERT INTO developer values (NEW.developer_id); |
| | 177 | end if; |
| | 178 | RETURN new; |
| | 179 | end; |
| | 180 | $$; |
| | 181 | |
| | 182 | }}} |
| | 183 | |
| | 184 | {{{ |
| | 185 | create or replace trigger tr_add_dev_if_not_exist |
| | 186 | before insert on developer_associated_with_project |
| | 187 | for each row |
| | 188 | execute function fn_add_dev_if_not_exist(); |
| | 189 | }}} |
| | 190 | |
| | 191 | === Креирање на General канал, при креирање на даден проект |
| | 192 | {{{ |
| | 193 | create or replace function fn_insert_general_for_project() |
| | 194 | returns trigger |
| | 195 | language plpgsql |
| | 196 | as $$ |
| | 197 | DECLARE |
| | 198 | developer_id INT; |
| | 199 | project_resource_id INT; |
| | 200 | BEGIN |
| | 201 | select user_id |
| | 202 | into developer_id |
| | 203 | from thread t |
| | 204 | where t.id=NEW.id; |
| | 205 | insert into project_resource default values returning id into project_resource_id; |
| | 206 | |
| | 207 | insert into channel(name,description,project_id,developer_id,project_resource_id) |
| | 208 | values ('General','General',NEW.id,developer_id,project_resource_id); |
| | 209 | |
| | 210 | return new; |
| | 211 | end; |
| | 212 | $$; |
| | 213 | }}} |
| | 214 | |
| | 215 | {{{ |
| | 216 | create or replace trigger tr_insert_general_for_project |
| | 217 | after insert on project_thread |
| | 218 | for each row |
| | 219 | execute function fn_insert_general_for_project(); |
| | 220 | }}} |
| | 221 | |
| | 222 | === Сите 'pending' пријави за даден корисник стануваат 'accepted', при додавање на тој корисник во 'blacklist' листата. |
| | 223 | {{{ |
| | 224 | CREATE OR REPLACE FUNCTION fn_change_status_on_pending_reports() |
| | 225 | RETURNS TRIGGER |
| | 226 | LANGUAGE plpgsql |
| | 227 | AS $$ |
| | 228 | BEGIN |
| | 229 | RAISE NOTICE 'user_id: %, topic_id: %', NEW.user_id, NEW.topic_id; |
| | 230 | |
| | 231 | UPDATE submission |
| | 232 | SET status = 'ACCEPTED' |
| | 233 | WHERE id in ( |
| | 234 | select id |
| | 235 | from report r |
| | 236 | where r.for_user_id = NEW.user_id and r.thread_id = NEW.topic_id |
| | 237 | ); |
| | 238 | |
| | 239 | RETURN NEW; |
| | 240 | END; |
| | 241 | $$; |
| | 242 | }}} |
| | 243 | |
| | 244 | {{{ |
| | 245 | CREATE OR REPLACE TRIGGER tr_change_status_on_pending_reports |
| | 246 | AFTER INSERT |
| | 247 | ON blacklisted_user |
| | 248 | FOR EACH ROW |
| | 249 | EXECUTE FUNCTION fn_change_status_on_pending_reports(); |
| | 250 | }}} |
| | 251 | |
| | 252 | === Оневозможувено повторно додавање на корисник во 'blacklist' листата, доколку е веќе присутен на неа |
| | 253 | |
| | 254 | {{{ |
| | 255 | create or replace function fn_add_blacklisted_user() |
| | 256 | RETURNS trigger |
| | 257 | LANGUAGE plpgsql |
| | 258 | AS $$ |
| | 259 | BEGIN |
| | 260 | IF NOT EXISTS( |
| | 261 | select 1 |
| | 262 | from blacklisted_user |
| | 263 | where topic_id = NEW.topic_id and user_id = NEW.user_id and end_date is NULL |
| | 264 | ) |
| | 265 | THEN |
| | 266 | RETURN NEW; |
| | 267 | END IF; |
| | 268 | RETURN NULL; |
| | 269 | END; |
| | 270 | $$; |
| | 271 | }}} |
| | 272 | |
| | 273 | {{{ |
| | 274 | create or replace trigger tr_add_blacklisted_user |
| | 275 | before insert on blacklisted_user |
| | 276 | for each row |
| | 277 | execute function fn_add_blacklisted_user(); |
| | 278 | }}} |
| | 279 | |
| | 280 | === Автоматско додавање на project_resource, при додавање на канал |
| | 281 | {{{ |
| | 282 | create or replace function fn_add_project_resource() |
| | 283 | returns trigger |
| | 284 | language plpgsql |
| | 285 | as $$ |
| | 286 | DECLARE |
| | 287 | project_resource_id INT; |
| | 288 | BEGIN |
| | 289 | insert into project_resource default values returning id into project_resource_id; |
| | 290 | new.project_resource_id := project_resource_id; |
| | 291 | return new; |
| | 292 | end; |
| | 293 | $$; |
| | 294 | }}} |
| | 295 | |
| | 296 | {{{ |
| | 297 | create or replace trigger tr_add_project_resource_channel |
| | 298 | before insert |
| | 299 | on channel |
| | 300 | for each row |
| | 301 | execute function fn_add_project_resource(); |
| | 302 | }}} |
| | 303 | |