| 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 | |