feat(product): implement sprint 9 product engagement module
This commit is contained in:
@@ -49,6 +49,54 @@ Tenant rule:
|
||||
Must not change:
|
||||
- item identifiers/price semantics relied on frontend checkout/cart logic.
|
||||
|
||||
## /products/{id}/rating
|
||||
Purpose:
|
||||
- return product rating aggregate for engagement UI.
|
||||
|
||||
High-level response shape:
|
||||
- average rating
|
||||
- total reviews
|
||||
- star distribution (5..1)
|
||||
|
||||
Tenant rule:
|
||||
- aggregate must be computed only from tenant-visible reviews.
|
||||
|
||||
## /products/{id}/reviews
|
||||
Purpose:
|
||||
- paginated review feed for product page.
|
||||
|
||||
High-level response shape:
|
||||
- review list
|
||||
- page/pageSize/total metadata
|
||||
|
||||
Tenant rule:
|
||||
- only tenant-allowed and moderation-approved reviews.
|
||||
|
||||
## /products/{id}/questions
|
||||
Purpose:
|
||||
- paginated questions and answers feed for product page.
|
||||
|
||||
High-level response shape:
|
||||
- question list with answers
|
||||
- page/pageSize/total metadata
|
||||
|
||||
Tenant rule:
|
||||
- only tenant-visible questions/answers.
|
||||
|
||||
## /products/{id}/reviews (POST)
|
||||
Purpose:
|
||||
- create review (rating/title/text/anonymous).
|
||||
|
||||
Must not change:
|
||||
- request validation semantics expected by frontend engagement form.
|
||||
|
||||
## /products/{id}/questions (POST)
|
||||
Purpose:
|
||||
- create product question (text/anonymous).
|
||||
|
||||
Must not change:
|
||||
- acknowledgement contract expected by frontend engagement form.
|
||||
|
||||
## /categories
|
||||
Purpose:
|
||||
- category tree retrieval
|
||||
|
||||
@@ -296,6 +296,23 @@
|
||||
"enabled": true
|
||||
}
|
||||
],
|
||||
"productPage": {
|
||||
"rating": { "enabled": true },
|
||||
"reviews": {
|
||||
"enabled": true,
|
||||
"pageSize": 5,
|
||||
"showSummary": true
|
||||
},
|
||||
"questions": {
|
||||
"enabled": true,
|
||||
"pageSize": 5
|
||||
},
|
||||
"tabs": {
|
||||
"enabled": true,
|
||||
"items": ["description", "specifications", "reviews", "questions", "delivery", "warranty"]
|
||||
},
|
||||
"relatedProducts": { "enabled": true }
|
||||
},
|
||||
"pages": [
|
||||
{
|
||||
"id": "page-home",
|
||||
|
||||
@@ -54,6 +54,7 @@ Bootstrap JSON является главным конфигурационным
|
||||
- branding
|
||||
- navigation
|
||||
- footer
|
||||
- productPage
|
||||
- staticPages
|
||||
- widgetRegistry
|
||||
- visibility
|
||||
@@ -69,6 +70,18 @@ Bootstrap JSON является главным конфигурационным
|
||||
- Для виджетов допустимы metadata поля: order, padding, visibility.desktop/tablet/mobile.
|
||||
- Для footer links/legal/payout icons источник истины — bootstrap JSON.
|
||||
- Для staticPages контент поддерживается в формате multilingual HTML и рендерится только через safe sanitizer.
|
||||
- Для productPage допускаются только feature-конфиги (enabled/pageSize/tabs/showSummary), без доменных данных отзывов и вопросов.
|
||||
|
||||
### Product Engagement Config (опционально)
|
||||
- productPage.rating.enabled: boolean
|
||||
- productPage.reviews.enabled: boolean
|
||||
- productPage.reviews.pageSize: number
|
||||
- productPage.reviews.showSummary: boolean
|
||||
- productPage.questions.enabled: boolean
|
||||
- productPage.questions.pageSize: number
|
||||
- productPage.tabs.enabled: boolean
|
||||
- productPage.tabs.items: array (description/specifications/reviews/questions/delivery/warranty)
|
||||
- productPage.relatedProducts.enabled: boolean
|
||||
|
||||
## Пример полного минимального bootstrap
|
||||
```json
|
||||
|
||||
@@ -24,6 +24,21 @@
|
||||
- В ответах на списки должна поддерживаться пагинация.
|
||||
- Ошибки API должны быть машиночитаемыми и локализуемыми на frontend.
|
||||
|
||||
## Product Engagement API (ожидаемый контракт)
|
||||
- GET /products/{id}/rating
|
||||
- возвращает агрегированную оценку и распределение по звездам.
|
||||
- GET /products/{id}/reviews
|
||||
- поддерживает пагинацию (page/pageSize).
|
||||
- GET /products/{id}/questions
|
||||
- поддерживает пагинацию (page/pageSize).
|
||||
- POST /products/{id}/reviews
|
||||
- принимает rating/title/text/anonymous.
|
||||
- POST /products/{id}/questions
|
||||
- принимает text/anonymous.
|
||||
|
||||
Правило:
|
||||
- Feature UI не вызывает API напрямую; запросы идут через ProductFacade -> domain service -> provider/repository.
|
||||
|
||||
## Пример API ответа: категории
|
||||
```json
|
||||
{
|
||||
|
||||
@@ -25,11 +25,30 @@
|
||||
- stockStatus
|
||||
- rating
|
||||
|
||||
## Product Engagement Models
|
||||
- RatingSummary
|
||||
- average: number
|
||||
- totalReviews: number
|
||||
- distribution: [{ stars, count, share }]
|
||||
- Review
|
||||
- id, rating, title, text, author, anonymous, verifiedPurchase, createdAt
|
||||
- likes/dislikes placeholders
|
||||
- photos: string[] (reserved for future uploads)
|
||||
- Question
|
||||
- id, text, author, createdAt, likes, dislikes
|
||||
- answers: Answer[]
|
||||
- Answer
|
||||
- id, text, author, createdAt
|
||||
- isOfficialSeller, isAccepted
|
||||
|
||||
## Строгие правила
|
||||
- Цена и валюта должны передаваться как валидная пара.
|
||||
- Скрытые товары не участвуют в публичных витринах.
|
||||
- categoryID должен ссылаться на существующую категорию.
|
||||
- Виджет не изменяет товарные данные, только отображает.
|
||||
- Frontend feature-слой работает только через ProductFacade.
|
||||
- DTO/API shape не импортируется в feature components.
|
||||
- reviews/questions не хранятся в bootstrap, только их feature-конфиг.
|
||||
|
||||
## Пример JSON товара
|
||||
```json
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- Выдача bootstrap.json для tenant.
|
||||
- API категорий, товаров, карточек, поисковых выборок.
|
||||
- Выдача навигации, статических страниц и feature flags.
|
||||
- Product Engagement API для рейтинга, отзывов и вопросов.
|
||||
|
||||
### Контракт статических страниц
|
||||
Backend должен поддерживать формат:
|
||||
@@ -26,8 +27,19 @@ Backend должен поддерживать формат:
|
||||
- Bootstrap контракт со schemaVersion.
|
||||
- Категории: id/title/parentId/visible/priority.
|
||||
- Товары: itemID/name/price/currency/categoryID/visible.
|
||||
- Product Engagement:
|
||||
- RatingSummary (average, totalReviews, distribution)
|
||||
- Review (id, rating, text, createdAt, author)
|
||||
- Question (id, text, createdAt, answers)
|
||||
- Унифицированный формат ошибок API.
|
||||
|
||||
## Обязательные Product Engagement endpoints
|
||||
- GET /products/{id}/rating
|
||||
- GET /products/{id}/reviews?page={n}&pageSize={n}
|
||||
- GET /products/{id}/questions?page={n}&pageSize={n}
|
||||
- POST /products/{id}/reviews
|
||||
- POST /products/{id}/questions
|
||||
|
||||
## Опциональные JSON-контракты
|
||||
- Персонализированные рекомендации.
|
||||
- Расширенные facets/filters.
|
||||
|
||||
Reference in New Issue
Block a user