| | 352 | END; |
| | 353 | $$; |
| | 354 | }}} |
| | 355 | |
| | 356 | Leave review |
| | 357 | {{{ |
| | 358 | CREATE 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 | ) |
| | 364 | RETURNS BIGINT |
| | 365 | LANGUAGE plpgsql |
| | 366 | AS $$ |
| | 367 | DECLARE |
| | 368 | v_review_id BIGINT; |
| | 369 | BEGIN |
| | 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; |