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