# 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.