Changes between Version 1 and Version 2 of DatabaseProgramming


Ignore:
Timestamp:
06/08/26 10:26:59 (10 days ago)
Author:
231062
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v1 v2  
    350350        WHERE resource_edition_isbn = p_isbn
    351351    );
     352END;
     353$$;
     354}}}
     355
     356Leave review
     357{{{
     358CREATE OR REPLACE FUNCTION fn_leave_review(
     359    p_user_id BIGINT,
     360    p_edition_isbn VARCHAR(20),
     361    p_rating INT,
     362    p_review_text TEXT
     363)
     364RETURNS BIGINT
     365LANGUAGE plpgsql
     366AS $$
     367DECLARE
     368    v_review_id BIGINT;
     369BEGIN
     370    IF p_rating NOT BETWEEN 1 AND 5 THEN
     371        RAISE EXCEPTION 'Rating must be between 1 and 5';
     372    END IF;
     373
     374    IF NOT EXISTS (
     375        SELECT 1
     376        FROM Rental r
     377        JOIN Membership m
     378            ON m.id = r.membership_id
     379        JOIN ResourceCopy rc
     380            ON rc.id = r.resource_copy_id
     381        WHERE m.user_id = p_user_id
     382          AND rc.edition_isbn = p_edition_isbn
     383          AND r.returned_at IS NOT NULL
     384    ) THEN
     385        RAISE EXCEPTION
     386            'User has not completed a rental of this edition';
     387    END IF;
     388
     389    IF EXISTS (
     390        SELECT 1
     391        FROM Review
     392        WHERE user_id = p_user_id
     393          AND resource_edition_isbn = p_edition_isbn
     394    ) THEN
     395        RAISE EXCEPTION
     396            'User has already reviewed this edition';
     397    END IF;
     398
     399    INSERT INTO Review (
     400        user_id,
     401        resource_edition_isbn,
     402        rating,
     403        review_text,
     404        created_at,
     405        updated_at
     406    )
     407    VALUES (
     408        p_user_id,
     409        p_edition_isbn,
     410        p_rating,
     411        p_review_text,
     412        NOW(),
     413        NOW()
     414    )
     415    RETURNING id INTO v_review_id;
     416
     417    RETURN v_review_id;
    352418END;
    353419$$;