101 lines
3.8 KiB
Markdown
101 lines
3.8 KiB
Markdown
# 06. API-контракты
|
||
|
||
## Назначение
|
||
Документ определяет стабильные контракты API для данных маркетплейса. Backend предоставляет только данные, frontend отвечает за представление.
|
||
|
||
## Поведение системы
|
||
- API base URL определяется tenant-конфигурацией.
|
||
- Frontend отправляет запросы через единый API слой и интерсепторы.
|
||
- Ответы маппятся в доменные модели frontend.
|
||
|
||
## Обязательные свойства JSON (ответы API)
|
||
- status или корректный HTTP status code
|
||
- data (основная полезная нагрузка)
|
||
- id для доменных сущностей
|
||
|
||
## Опциональные свойства JSON
|
||
- meta (pagination, total, filters)
|
||
- errors (детализация ошибок)
|
||
- warnings
|
||
|
||
## Строгие правила
|
||
- Backend не должен отдавать HTML для витрины.
|
||
- Контракты должны быть обратно совместимы в пределах одной major-версии.
|
||
- В ответах на списки должна поддерживаться пагинация.
|
||
- Ошибки 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.
|
||
|
||
## Advanced Catalog/Search Expectations
|
||
- Suggestions endpoint (future-ready):
|
||
- GET /search/suggestions?q={term}
|
||
- response: suggestion strings with optional popularity/count metadata.
|
||
- Dynamic filter metadata endpoint (future-ready):
|
||
- GET /catalog/filters?category={id}&q={term}
|
||
- response: filter definitions/options that frontend can render without hardcoded filter schema.
|
||
- Sort extension contract:
|
||
- Backend may introduce new sort IDs via bootstrap `catalog.availableSorts`.
|
||
- Frontend must render unknown sort keys safely if label mapping is provided.
|
||
|
||
## Пример API ответа: категории
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"id": 101,
|
||
"title": "Смартфоны",
|
||
"parentId": null,
|
||
"priority": 1,
|
||
"visible": true
|
||
}
|
||
],
|
||
"meta": {
|
||
"total": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
## Пример API ответа: товары
|
||
```json
|
||
{
|
||
"data": {
|
||
"items": [
|
||
{
|
||
"itemID": 5001,
|
||
"name": "Phone X",
|
||
"price": 49990,
|
||
"currency": "RUB",
|
||
"categoryID": 101,
|
||
"visible": true
|
||
}
|
||
],
|
||
"total": 1,
|
||
"skip": 0,
|
||
"count": 20
|
||
}
|
||
}
|
||
```
|
||
|
||
## Ответственность Frontend
|
||
- Маппинг API DTO в доменные модели.
|
||
- Центральная обработка ошибок и retry-стратегий.
|
||
- Кеширование и переиспользование данных без нарушения актуальности.
|
||
|
||
## Ответственность Backend
|
||
- Гарантировать SLA и стабильность контрактов.
|
||
- Возвращать tenant-correct данные.
|
||
- Поддерживать фильтрацию, пагинацию и сортировку для каталога.
|