feat(product): implement sprint 9 product engagement module

This commit is contained in:
sdarbinyan
2026-07-09 00:45:36 +04:00
parent 10251f2fc6
commit 3ef0bd711d
59 changed files with 2060 additions and 74 deletions

View File

@@ -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

View File

@@ -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",

View File

@@ -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

View File

@@ -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
{

View File

@@ -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

View File

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