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