| | 1 | = Преглед на рецензии за услуга |
| | 2 | |
| | 3 | == Актери |
| | 4 | * Најавен или ненајавен корисник |
| | 5 | |
| | 6 | == Чекор 1 |
| | 7 | Корисникот се наоѓа на страницата за |
| | 8 | [https://develop.finki.ukim.mk/projects/venusbeauty/wiki/ShowServices Преглед на услуги] |
| | 9 | и избира конкретна услуга, по што кликнува на копчето „View reviews“. |
| | 10 | |
| | 11 | == Чекор 2 |
| | 12 | Системот ја пронаоѓа избраната услуга во веќе вчитаните податоци според `service_id` и го зема полето `reviews` за таа услуга. |
| | 13 | |
| | 14 | Секоја рецензија во ова поле содржи: |
| | 15 | * `rating` – оценка, |
| | 16 | * `comment` – текст на рецензијата, |
| | 17 | * `created_at` – датум и време на креирање, |
| | 18 | * `reviewer` – корисник кој ја оставил рецензијата. |
| | 19 | |
| | 20 | Податоците за рецензиите се генерираат во базата преку следниот SQL поглед: |
| | 21 | |
| | 22 | {{{ |
| | 23 | CREATE OR REPLACE VIEW v_services_grouped_by_category AS |
| | 24 | SELECT |
| | 25 | c.category_id, |
| | 26 | c.name AS category_name, |
| | 27 | COALESCE( |
| | 28 | jsonb_agg( |
| | 29 | jsonb_build_object( |
| | 30 | 'service_id', s.service_id, |
| | 31 | 'name', s.name, |
| | 32 | 'price', s.price, |
| | 33 | 'duration_minutes', s.duration_minutes, |
| | 34 | 'avg_rating', COALESCE(svc.avg_rating, 0), |
| | 35 | 'review_count', COALESCE(svc.review_count, 0), |
| | 36 | 'reviews', COALESCE(svc.reviews, '[]'::jsonb) |
| | 37 | ) |
| | 38 | ORDER BY s.service_id |
| | 39 | ) FILTER (WHERE s.service_id IS NOT NULL), |
| | 40 | '[]'::jsonb |
| | 41 | ) AS services |
| | 42 | FROM category c |
| | 43 | LEFT JOIN service s ON s.category_id = c.category_id |
| | 44 | LEFT JOIN LATERAL ( |
| | 45 | SELECT |
| | 46 | ROUND(AVG(r.rating)::numeric, 1) AS avg_rating, |
| | 47 | COUNT(r.review_id) AS review_count, |
| | 48 | COALESCE( |
| | 49 | jsonb_agg( |
| | 50 | jsonb_build_object( |
| | 51 | 'review_id', r.review_id, |
| | 52 | 'rating', r.rating, |
| | 53 | 'comment', r.comment, |
| | 54 | 'created_at', r.created_at, |
| | 55 | 'reviewer', u.full_name |
| | 56 | ) |
| | 57 | ORDER BY r.created_at DESC |
| | 58 | ) FILTER (WHERE r.review_id IS NOT NULL), |
| | 59 | '[]'::jsonb |
| | 60 | ) AS reviews |
| | 61 | FROM appointmentservice aps |
| | 62 | JOIN appointment a ON a.appointment_id = aps.appointment_id |
| | 63 | JOIN payment p ON p.appointment_id = a.appointment_id |
| | 64 | JOIN review r ON r.payment_id = p.payment_id |
| | 65 | JOIN "User" u ON u.user_id = a.user_id |
| | 66 | WHERE aps.service_id = s.service_id |
| | 67 | AND p.status = 'PAID' |
| | 68 | ) svc ON true |
| | 69 | GROUP BY c.category_id, c.name; |
| | 70 | }}} |
| | 71 | |
| | 72 | == Чекор 3 |
| | 73 | Системот ги прикажува сите рецензии за избраната услуга, вклучувајќи: |
| | 74 | * оценка, |
| | 75 | * име на рецензентот, |
| | 76 | * датум и време, |
| | 77 | * текст на коментарот. |
| | 78 | |
| | 79 | Корисникот може да ги прегледа сите рецензии и повторно да го затвори делот со кликнување на „View reviews“. |
| | 80 | |
| | 81 | [[Image(showreviews-1.jpg, width=600px)]] |