Changes between Initial Version and Version 1 of Triggers


Ignore:
Timestamp:
09/24/25 23:22:30 (3 weeks ago)
Author:
226026
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Triggers

    v1 v1  
     1= Тригери
     2== Проверка дали даден топик имат уникатно име во парент threadот
     3{{{
     4CREATE OR REPLACE FUNCTION fn_validate_topic_title()
     5    RETURNS TRIGGER
     6    LANGUAGE plpgsql
     7AS
     8$$
     9BEGIN
     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;
     21END;
     22$$;
     23}}}
     24{{{
     25CREATE OR REPLACE TRIGGER tr_check_topic_name --RADI
     26    BEFORE INSERT OR UPDATE
     27    ON topic_thread
     28    FOR EACH ROW
     29EXECUTE FUNCTION fn_validate_topic_title();
     30}}}
     31
     32== При креирање на топик, креаторот се внесува како модератор
     33{{{
     34CREATE OR REPLACE FUNCTION fn_insert_topics_creator_as_moderator()
     35    RETURNS TRIGGER
     36    LANGUAGE plpgsql
     37AS
     38$$
     39DECLARE
     40    v_user_id INT;
     41BEGIN
     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;
     51END
     52$$;
     53}}}
     54{{{
     55CREATE OR REPLACE TRIGGER tr_insert_topics_creator_as_moderator
     56    AFTER INSERT
     57    ON topic_thread
     58    FOR EACH ROW
     59EXECUTE FUNCTION fn_insert_topics_creator_as_moderator();
     60}}}
     61
     62== При бришење на topic, проверка дали модераторот сеуште модерира topicци
     63{{{
     64CREATE OR REPLACE FUNCTION fn_remove_orphan_moderator()
     65    RETURNS trigger
     66    LANGUAGE plpgsql
     67AS $function$
     68BEGIN
     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;
     88END;
     89}}}
     90
     91{{{
     92CREATE OR REPLACE TRIGGER tr_remove_orphan_moderator
     93    AFTER DELETE
     94    ON topic_threads_moderators
     95    FOR EACH ROW
     96EXECUTE FUNCTION fn_remove_orphan_moderator();
     97}}}
     98
     99== При креирање на проект, креаторот се внесува како PROJECT_OWNER
     100{{{
     101CREATE OR REPLACE FUNCTION fn_insert_project_manager()
     102    RETURNS TRIGGER
     103    LANGUAGE plpgsql
     104AS
     105$$
     106DECLARE
     107    usrId      INT;
     108    new_project_id INT;
     109BEGIN
     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;
     126END
     127$$;
     128}}}
     129
     130{{{
     131CREATE OR REPLACE TRIGGER tr_a_insert_project_manager --RADI
     132    AFTER INSERT
     133    ON project_thread
     134    FOR EACH ROW
     135EXECUTE FUNCTION fn_insert_project_manager();
     136}}}
     137
     138
     139== Бришење на не користени тагови
     140
     141{{{
     142create or replace function fn_delete_dangling_tags()
     143    RETURNS trigger
     144    LANGUAGE plpgsql
     145AS $$
     146BEGIN
     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;
     154END;
     155$$;
     156}}}
     157
     158{{{
     159create 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{{{
     168create or replace function fn_add_dev_if_not_exist()
     169    returns trigger
     170    language plpgsql
     171as $$
     172BEGIN
     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;
     177end;
     178$$;
     179
     180}}}
     181
     182{{{
     183create or replace trigger tr_add_dev_if_not_exist
     184    before insert on developer_associated_with_project
     185    for each row
     186execute function fn_add_dev_if_not_exist();
     187}}}
     188
     189== Креирање на General канал, при креирање на даден проект
     190{{{
     191create or replace function fn_insert_general_for_project()
     192    returns trigger
     193    language plpgsql
     194as $$
     195DECLARE
     196    developer_id INT;
     197    project_resource_id INT;
     198BEGIN
     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;
     209end;
     210$$;
     211}}}
     212
     213{{{
     214create or replace trigger tr_insert_general_for_project
     215    after insert on project_thread
     216    for each row
     217execute function fn_insert_general_for_project();
     218}}}
     219
     220== Сите 'pending' пријави за даден корисник стануваат 'accepted', при додавање на тој корисник во 'blacklist' листата.
     221{{{
     222CREATE OR REPLACE FUNCTION fn_change_status_on_pending_reports()
     223    RETURNS TRIGGER
     224    LANGUAGE plpgsql
     225AS $$
     226BEGIN
     227    RAISE NOTICE 'user_id: %, topic_id: %', NEW.user_id, NEW.topic_id;
     228
     229UPDATE submission
     230SET status = 'ACCEPTED'
     231WHERE 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
     237RETURN NEW;
     238END;
     239$$;
     240}}}
     241
     242{{{
     243CREATE OR REPLACE TRIGGER tr_change_status_on_pending_reports
     244    AFTER INSERT
     245    ON blacklisted_user
     246    FOR EACH ROW
     247EXECUTE FUNCTION fn_change_status_on_pending_reports();
     248}}}
     249
     250== Оневозможувено повторно додавање на корисник во 'blacklist' листата, доколку е веќе присутен на неа
     251
     252{{{
     253create or replace function fn_add_blacklisted_user()
     254RETURNS trigger
     255LANGUAGE plpgsql
     256AS $$
     257BEGIN
     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;
     265END IF;
     266RETURN NULL;
     267END;
     268$$;
     269}}}
     270
     271{{{
     272create or replace trigger tr_add_blacklisted_user
     273before insert on blacklisted_user
     274for each row
     275execute function fn_add_blacklisted_user();
     276}}}
     277
     278== Автоматско додавање на project_resource, при додавање на канал
     279{{{
     280create or replace function fn_add_project_resource()
     281    returns trigger
     282    language plpgsql
     283as $$
     284DECLARE
     285    project_resource_id INT;
     286BEGIN
     287    insert into project_resource default values returning id into project_resource_id;
     288    new.project_resource_id := project_resource_id;
     289    return new;
     290end;
     291$$;
     292}}}
     293
     294{{{
     295create or replace trigger tr_add_project_resource_channel
     296    before insert
     297    on channel
     298    for each row
     299execute function fn_add_project_resource();
     300}}}