| | 477 | |
| | 478 | |
| | 479 | |
| | 480 | == Оставање рецензија за купен производ |
| | 481 | |
| | 482 | Оваа секција овозможува корисниците да остават рецензија за прозивод што го купиле. |
| | 483 | |
| | 484 | = Функција: fn_can_user_review_product |
| | 485 | |
| | 486 | Функцијата проверува дали корисникот има право да остави рецензија за одреден производ. |
| | 487 | |
| | 488 | Корисник може да остави рецензија на производ ако ги исполнува следните услови: |
| | 489 | |
| | 490 | * Нема веќе има оставено рецензија за истиот производ. |
| | 491 | * Има успешна нарачка што содржи го производот. |
| | 492 | * Статусот на нарачката е DELIVERED, односно производот е испорачан. |
| | 493 | |
| | 494 | {{{ |
| | 495 | CREATE OR REPLACE FUNCTION fn_can_user_review_product( |
| | 496 | p_user_id INT, |
| | 497 | p_product_id INT |
| | 498 | ) |
| | 499 | RETURNS INT |
| | 500 | LANGUAGE plpgsql |
| | 501 | AS $$ |
| | 502 | BEGIN |
| | 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 | |
| | 526 | END; |
| | 527 | $$; |
| | 528 | |
| | 529 | }}} |
| | 530 | |
| | 531 | |
| | 532 | = Процедура: sp_add_review |
| | 533 | |
| | 534 | Процедурата се користи за додавање нова рецензија за производ. |
| | 535 | |
| | 536 | {{{ |
| | 537 | CREATE 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 | ) |
| | 543 | LANGUAGE plpgsql |
| | 544 | AS $$ |
| | 545 | DECLARE |
| | 546 | v_seller_id INT; |
| | 547 | BEGIN |
| | 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 | |
| | 567 | END; |
| | 568 | $$; |
| | 569 | }}} |