Changes between Initial Version and Version 1 of DatabaseProgramming


Ignore:
Timestamp:
06/15/26 20:18:16 (6 days ago)
Author:
231067
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v1 v1  
     1= Database Programming
     2
     3Во оваа фаза се изработени функции, процедури и тригери за основните операции потребни за правилно функционирање на системот.
     4
     5== Процедури
     6
     7Процедурата `sp_request_mentorship` служи за процесирање и одобрување на барања за менторство помеѓу студент и ментор. На почеток, таа врши валидација за тоа дали постојат корисниците и избраниот тип на менторство, а истовремено проверува дали предложената тема е слободна и дали му припаѓа на соодветниот ментор. Процедурата осигурува дека студентот навистина го слуша предметот на кој припаѓа темата и наметнува строги лимити, така што му дозволува на студентот да има само едно активно менторство, а на менторот максимум пет активни менторства во исто време. Доколку сите овие услови се исполнети, процедурата го запишува менторството, ја означува темата како зафатена, автоматски отвора нов чет помеѓу учесниците и испраќа системска нотификација до менторот.
     8
     9{{{
     10CREATE OR REPLACE PROCEDURE sp_request_mentorship(
     11    p_student_id BIGINT,
     12    p_mentor_id BIGINT,
     13    p_topic_id BIGINT,
     14    p_type_id BIGINT
     15)
     16LANGUAGE plpgsql
     17AS $$
     18DECLARE
     19    v_subject_id BIGINT;
     20    v_mentor_active_count INT;
     21    v_student_active_count INT;
     22    v_new_mentorship_id BIGINT;
     23    v_new_chat_id BIGINT;
     24BEGIN
     25    -- 1. Валидација на ентитети
     26    IF NOT EXISTS (SELECT 1 FROM "User" WHERE ID = p_student_id) THEN
     27        RAISE EXCEPTION 'ГРЕШКА: Студент со ID % не постои!', p_student_id;
     28    END IF;
     29    IF NOT EXISTS (SELECT 1 FROM "User" WHERE ID = p_mentor_id) THEN
     30        RAISE EXCEPTION 'ГРЕШКА: Ментор со ID % не постои!', p_mentor_id;
     31    END IF;
     32    IF NOT EXISTS (SELECT 1 FROM MentorshipType WHERE ID = p_type_id) THEN
     33        RAISE EXCEPTION 'ГРЕШКА: Типот на менторство (%) е невалиден!', p_type_id;
     34    END IF;
     35
     36    -- 2. Валидација на темата
     37    SELECT SubjectID INTO v_subject_id FROM TopicSuggestion WHERE ID = p_topic_id AND isAvailable = true AND MentorID = p_mentor_id;
     38    IF v_subject_id IS NULL THEN
     39        RAISE EXCEPTION 'ГРЕШКА: Темата % не е слободна, не постои, или не припаѓа на овој ментор!', p_topic_id;
     40    END IF;
     41
     42    -- 3. Дали студентот го слуша предметот?
     43    IF NOT EXISTS (SELECT 1 FROM User_Subject WHERE UserID = p_student_id AND SubjectID = v_subject_id) THEN
     44        RAISE EXCEPTION 'ОДБИЕНО: Студентот мора да биде запишан на предметот за да ја земе темата!';
     45    END IF;
     46
     47    -- 4. Лимит за Студент (макс 1 активно менторство)
     48    SELECT COUNT(*) INTO v_student_active_count FROM Mentorship m
     49    WHERE m.StudentID = p_student_id AND EXISTS (SELECT 1 FROM Task t WHERE t.MentorshipID = m.ID AND t.Status != 1);
     50    IF v_student_active_count > 0 THEN
     51        RAISE EXCEPTION 'ОДБИЕНО: Студентот веќе има активно менторство. Мора прво да го заврши!';
     52    END IF;
     53
     54    -- 5. Лимит за Ментор (макс 5 активни менторства)
     55    SELECT COUNT(*) INTO v_mentor_active_count FROM Mentorship m
     56    WHERE m.MentorID = p_mentor_id AND EXISTS (SELECT 1 FROM Task t WHERE t.MentorshipID = m.ID AND t.Status != 1);
     57    IF v_mentor_active_count >= 5 THEN
     58        RAISE EXCEPTION 'ОДБИЕНО: Менторот го има достигнато максимумот од 5 активни студенти!';
     59    END IF;
     60
     61    -- Извршување
     62    INSERT INTO Mentorship (StudentID, MentorID, TopicSuggestionID, MentorshipTypeID)
     63    VALUES (p_student_id, p_mentor_id, p_topic_id, p_type_id)
     64    RETURNING ID INTO v_new_mentorship_id;
     65
     66    UPDATE TopicSuggestion SET isAvailable = false WHERE ID = p_topic_id;
     67
     68    -- Автоматско отворање на разговор
     69    INSERT INTO Chat (Title, Topic, Status, "Date", StudentID, MentorID)
     70    VALUES ('Официјален чет за менторство #' || v_new_mentorship_id, 'Комуникација за тема ' || p_topic_id, 1, NOW(), p_student_id, p_mentor_id)
     71    RETURNING ID INTO v_new_chat_id;
     72
     73    -- Системска нотификација
     74    INSERT INTO Message (Content, isRead, Timestamp, ChatID, UserID)
     75    VALUES ('Нотификација: Менторството е успешно започнато!', false, NOW(), v_new_chat_id, p_mentor_id);
     76   
     77END;
     78$$;
     79
     80
     81CALL sp_request_mentorship(1, 2, 3, 1);
     82}}}
     83
     84----
     85
     86Процедурата `sp_submit_mentorship_evaluation` овозможува поднесување на оцена и коментар од страна на студентот за неговиот ментор по завршување на менторскиот процес. Таа прво ја контролира внесената оцена која мора да биде во опсег од 1 до 5, по што проверува дали наведеното менторство воопшто постои и дали студентот е дел од него. Клучен услов за извршување е сите задачи поврзани со тоа менторство да бидат комплетно завршени, со што се спречува предвремено оценување. На крај, со цел да се зачува интегритетот на податоците, процедурата проверува дали студентот веќе оставил оцена за тој ментор, и доколку нема дупликат, успешно ја запишува новата евалуација во табелата за мислења и коментари.
     87
     88{{{
     89CREATE OR REPLACE PROCEDURE sp_submit_mentorship_evaluation(
     90    p_mentorship_id BIGINT,
     91    p_student_id BIGINT,
     92    p_rating INT,
     93    p_comment TEXT
     94)
     95LANGUAGE plpgsql
     96AS $$
     97DECLARE
     98    v_mentor_id BIGINT;
     99    v_incomplete_tasks INT;
     100BEGIN
     101    -- 1. Валидација на оцена
     102    IF p_rating < 1 OR p_rating > 5 THEN
     103        RAISE EXCEPTION 'ГРЕШКА: Оцената на менторот мора да биде помеѓу 1 и 5.';
     104    END IF;
     105
     106    -- 2. Валидација на менторството
     107    SELECT MentorID INTO v_mentor_id FROM Mentorship WHERE ID = p_mentorship_id AND StudentID = p_student_id;
     108    IF v_mentor_id IS NULL THEN
     109        RAISE EXCEPTION 'ГРЕШКА: Менторството не постои или студентот не е дел од него!';
     110    END IF;
     111
     112    -- 3. Дали е навистина завршено? (Сите задачи мора да се Status = 1)
     113    SELECT COUNT(*) INTO v_incomplete_tasks FROM Task WHERE MentorshipID = p_mentorship_id AND Status != 1;
     114    IF v_incomplete_tasks > 0 THEN
     115        RAISE EXCEPTION 'ОДБИЕНО: Не можете да оцените менторство додека има % незавршени задачи!', v_incomplete_tasks;
     116    END IF;
     117
     118    -- 4. Спречување дупликат оценки
     119    IF EXISTS (SELECT 1 FROM CommentOpinion WHERE StudentID = p_student_id AND MentorID = v_mentor_id) THEN
     120        RAISE EXCEPTION 'ОДБИЕНО: Веќе имате оставено оцена за овој ментор!';
     121    END IF;
     122
     123    -- Внес на оцената
     124    INSERT INTO CommentOpinion (Comment, MentorRating, Timestamp, Status, StudentID, MentorID)
     125    VALUES (p_comment, p_rating, NOW(), 1, p_student_id, v_mentor_id);
     126END;
     127$$;
     128
     129
     130CALL sp_submit_mentorship_evaluation(1,1, 5, 'Одличен ментор, премногу ми помогна во целиот процес.');
     131}}}
     132
     133----
     134
     135Процедурата `sp_audit_inactive_tasks` служи за автоматска ревизија на неактивните и задоцнетите задачи во базата на податоци. Таа поминува низ сите задачи кои се сè уште во почетен статус, но чиј краен рок е надминат за повеќе од 30 дена во однос на тековниот датум. За секоја пронајдена задоцнета задача, процедурата автоматски го менува нејзиниот статус во пропадната или истечена и истовремено генерира и испраќа предупредувачка нотификација до соодветниот ментор за затворањето на задачата. По завршувањето на целиот циклус, процедурата печати системски извештај во форма на известување кој го прикажува вкупниот број на успешно ревидирани и затворени задачи.
     136
     137{{{
     138CREATE OR REPLACE PROCEDURE sp_audit_inactive_tasks()
     139LANGUAGE plpgsql
     140AS $$
     141DECLARE
     142    rec RECORD;
     143    v_count INT := 0;
     144BEGIN
     145    FOR rec IN
     146        SELECT t.ID, t.MentorshipID, m.MentorID, m.StudentID
     147        FROM Task t
     148        JOIN Mentorship m ON t.MentorshipID = m.ID
     149        WHERE t.Status = 0 AND t.EndDate < (CURRENT_DATE - INTERVAL '30 days')
     150    LOOP
     151        -- Означи како пропадната
     152        UPDATE Task SET Status = 3 WHERE ID = rec.ID;
     153       
     154        -- Прати предупредување до менторот
     155        INSERT INTO Notification (Content, Timestamp, isRead, UserToNotifyID, MessageID, CommentOpinionID)
     156        VALUES ('ПРЕДУПРЕДУВАЊЕ: Задачата #' || rec.ID || ' доцни повеќе од 30 дена и е автоматски затворена!', NOW(), false, rec.MentorID, 1, 1);
     157       
     158        v_count := v_count + 1;
     159    END LOOP;
     160   
     161    RAISE NOTICE 'СИСТЕМСКИ ИЗВЕШТАЈ: % задачи се означени како истечени поради пречекорување на дозволеното време.', v_count;
     162END;
     163$$;
     164
     165
     166CALL sp_audit_inactive_tasks();
     167}}}
     168
     169== Фунцкии
     170
     171== Тригери