Changes between Version 2 and Version 3 of AdvancedApplicationDevelopment


Ignore:
Timestamp:
09/21/25 21:55:14 (36 hours ago)
Author:
225144
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDevelopment

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