Changes between Version 25 and Version 26 of DatabaseProgramming


Ignore:
Timestamp:
05/13/26 16:14:54 (2 weeks ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v25 v26  
    140140}}}
    141141
     142=== `create_rating`
     143
     144Оваа процедура овозможува внесување оценка само доколку корисникот поседува валиден и нерефундиран билет за настанот. Со ова се спречува лажно оценување и се гарантира веродостојност на повратните информации.
     145
     146{{{
     147
     148CREATE OR REPLACE PROCEDURE create_rating(
     149    p_user_id BIGINT,
     150    p_event_happening_id BIGINT,
     151    p_rating INT,
     152    p_comment TEXT
     153)
     154AS $$
     155BEGIN
     156    IF NOT EXISTS (
     157        SELECT 1
     158        FROM "Ticket_Purchase" tp
     159        JOIN "Ticket" t ON tp.ticket_id = t.ticket_id
     160        LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id
     161        WHERE tp.user_id = p_user_id
     162          AND t.event_happening_id = p_event_happening_id
     163          AND tr.refund_id IS NULL
     164    ) THEN
     165        RAISE EXCEPTION 'Access Denied: You can only rate events you attended and did not refund.';
     166    END IF;
     167
     168    INSERT INTO "Event_Happening_Rating" (rating, comment, event_happening_id, user_id)
     169    VALUES (p_rating, p_comment, p_event_happening_id, p_user_id);
     170
     171    RAISE NOTICE 'Rating successfully submitted.';
     172END;
     173$$ LANGUAGE plpgsql;
     174
     175}}}
     176
    142177== Тригери
    143178
     
    238273
    239274}}}
    240 
    241 === `trg_validate_event_rating`
    242 
    243 Овој тригер овозможува оставање на рејтинг само за корисници кои поседуваат валиден билет за конкретниот настан. Системот проверува дали постои купопродажен запис кој не е поврзан со рефундација, со што се спречува лажно оценување од корисници кои не присуствувале на настанот.
    244 
    245 {{{
    246 
    247 CREATE OR REPLACE FUNCTION trg_validate_event_rating()
    248 RETURNS TRIGGER AS $$
    249 BEGIN
    250     IF NOT EXISTS (
    251         SELECT 1
    252         FROM "Ticket_Purchase" tp
    253         JOIN "Ticket" t ON tp.ticket_id = t.ticket_id
    254         LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id
    255         WHERE tp.user_id = NEW.user_id
    256           AND t.event_happening_id = NEW.event_happening_id
    257           AND tr.refund_id IS NULL
    258     ) THEN
    259         RAISE EXCEPTION 'Access Denied: You can only rate events you attended and did not refund.';
    260     END IF;
    261 
    262     RETURN NEW;
    263 END;
    264 $$ LANGUAGE plpgsql;
    265 
    266 CREATE TRIGGER check_rating_eligibility_before_insert
    267 BEFORE INSERT ON "Event_Happening_Rating"
    268 FOR EACH ROW EXECUTE FUNCTION trg_validate_event_rating();
    269 
    270 }}}