1.4 KiB
1.4 KiB
Architect — F-025 Reviews module
Feature
F-025 adds verified-purchase reviews with moderation and rating aggregates.
Design
Module boundaries
Create project/src/modules/reviews/ with domain/application/infrastructure/api/tests. Reviews owns review persistence and aggregates. Catalog is the source of product truth.
Data model
Add migration 019_reviews.js:
reviews_reviews: id, user_id, product_id, order_id uuid, order_item_id uuid, rating int 1..5, title, body, status text default 'pending', created_at, updated_at.- CHECK
status IN ('pending','published','rejected')andrating BETWEEN 1 AND 5. - UNIQUE
(order_item_id)to allow one review per order item. - Index
(product_id, status)for public listing.
Use cases
submitReview(userId, input)requires an order owned by the user whose items contain the target order item and whose state is DELIVERED. Otherwise 403.moderateReview(reviewId, status)admin-only, transitions pending -> published or rejected.listPublishedForProduct(productId)public, returns only published reviews plus aggregateaverageRatingandcount.
API
POST /reviewsauthenticated, returns 201/403.GET /reviews?productId=returns published reviews and aggregate.PATCH /reviews/:id/moderateadmin-only.
Acceptance trace
- No delivered order item -> 403.
- Second review on same order item -> 409 (unique constraint).
- Pending reviews never appear on product listing.