feat(ADM-018): completed feature
This commit is contained in:
31
work/artifacts/F-025/architect.md
Normal file
31
work/artifacts/F-025/architect.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# 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')` and `rating 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 aggregate `averageRating` and `count`.
|
||||
|
||||
### API
|
||||
- `POST /reviews` authenticated, returns 201/403.
|
||||
- `GET /reviews?productId=` returns published reviews and aggregate.
|
||||
- `PATCH /reviews/:id/moderate` admin-only.
|
||||
|
||||
## Acceptance trace
|
||||
- No delivered order item -> 403.
|
||||
- Second review on same order item -> 409 (unique constraint).
|
||||
- Pending reviews never appear on product listing.
|
||||
Reference in New Issue
Block a user