Changes between Version 15 and Version 16 of DatabaseProgramming


Ignore:
Timestamp:
06/14/26 16:35:34 (3 days ago)
Author:
231072
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v15 v16  
    475475$$;
    476476}}}
     477
     478
     479
     480== Оставање рецензија за купен производ
     481
     482Оваа секција овозможува корисниците да остават рецензија за прозивод што го купиле.
     483
     484= Функција: fn_can_user_review_product
     485
     486Функцијата проверува дали корисникот има право да остави рецензија за одреден производ.
     487
     488Корисник може да остави рецензија на производ ако ги исполнува следните услови:
     489
     490* Нема веќе има оставено рецензија за истиот производ.
     491* Има успешна нарачка што содржи го производот.
     492* Статусот на нарачката е DELIVERED, односно производот е испорачан.
     493
     494{{{
     495CREATE OR REPLACE FUNCTION fn_can_user_review_product(
     496    p_user_id INT,
     497    p_product_id INT
     498)
     499RETURNS INT
     500LANGUAGE plpgsql
     501AS $$
     502BEGIN
     503
     504    IF EXISTS (
     505        SELECT 1
     506        FROM review
     507        WHERE buyer_id = p_user_id
     508          AND product_id = p_product_id
     509    ) THEN
     510        RAISE EXCEPTION 'You have already reviewed this product.';
     511    END IF;
     512
     513    IF NOT EXISTS (
     514        SELECT 1
     515        FROM orderitems oi
     516        JOIN "order" o ON o.order_id = oi.order_id
     517        WHERE o.buyer_id = p_user_id
     518          AND oi.product_id = p_product_id
     519          AND o.status = 'DELIVERED'
     520    ) THEN
     521        RAISE EXCEPTION 'Only users who purchased and received the product can leave a review.';
     522    END IF;
     523
     524    RETURN 1;
     525
     526END;
     527$$;
     528
     529}}}
     530
     531
     532= Процедура: sp_add_review
     533
     534Процедурата се користи за додавање нова рецензија за производ.
     535
     536{{{
     537CREATE OR REPLACE PROCEDURE sp_add_review(
     538    p_user_id INT,
     539    p_product_id INT,
     540    p_rating INT,
     541    p_comment TEXT
     542)
     543LANGUAGE plpgsql
     544AS $$
     545DECLARE
     546    v_seller_id INT;
     547BEGIN
     548
     549    PERFORM fn_can_user_review_product(p_user_id, p_product_id);
     550
     551    IF p_rating NOT BETWEEN 1 AND 5 THEN
     552        RAISE EXCEPTION 'Rating must be between 1 and 5.';
     553    END IF;
     554
     555    SELECT seller_id
     556    INTO v_seller_id
     557    FROM product
     558    WHERE product_id = p_product_id;
     559
     560    IF NOT FOUND THEN
     561        RAISE EXCEPTION 'Product with id % does not exist.', p_product_id;
     562    END IF;
     563
     564    INSERT INTO review (product_id, buyer_id, seller_id, rating, comment, created_at)
     565    VALUES (p_product_id, p_user_id,v_seller_id, p_rating, p_comment, NOW());
     566
     567END;
     568$$;
     569}}}