review_service¶
1. Назначение¶
review_service хранит отзывы пользователей по товарам, формирует статистику по рейтингам и ограничивает создание отзывов бизнес-условиями покупки.
2. API-каталог¶
Базовый префикс: /api/.
| Метод | Путь | Auth | Назначение |
|---|---|---|---|
| GET | /reviews/ |
AllowAny | Список отзывов |
| POST | /reviews/ |
IsAuthenticated | Создание отзыва |
| GET | /reviews/{id}/ |
AllowAny | Чтение отзыва |
| PUT/PATCH | /reviews/{id}/ |
Owner | Обновление |
| DELETE | /reviews/{id}/ |
Owner или staff | Удаление |
| GET | /reviews/by_model/ |
AllowAny | Отзывы по товару |
| GET | /reviews/statistics/ |
AllowAny | Агрегированная статистика |
| GET | /reviews/seller_reviews/ |
IsAuthenticated | Отзывы по товарам продавца |
3. Модель данных¶
Review¶
model_3d_iduserFK ->auth_app.Userrating(1..5)textcreated_at,updated_atunique_together: (model_3d_id,user)
4. Бизнес-правила¶
- Запрещен self-review продавца на свой товар.
- Оставить отзыв может только покупатель с доставленным и оплаченным заказом.
- Один пользователь может оставить только один отзыв на товар.
5. Интеграции¶
product_service: определение продавца товара и имени.order_service: проверка факта покупки/доставки.admin_service: best-effort создание уведомления.
6. Ошибки и edge-cases¶
400при отсутствии обязательных query/body полей.403при нарушении бизнес-правил авторства/покупки.- Возможна ошибка из-за некорректного использования
permissions.PermissionDeniedв коде. - Для
seller_reviewsтребуется проверить фактическое применение permission-декларации.
7. Диаграмма проверки права на отзыв¶
sequenceDiagram
participant U as User
participant R as review_service
participant P as product_service_data
participant O as order_service_data
U->>R: POST /api/reviews
R->>P: check seller ownership
alt user_is_seller
R-->>U: 403
else user_not_seller
R->>O: check paid+delivered order
alt no_order
R-->>U: 403
else valid_order
R-->>U: 201
end
end
8. Дополнительная детализация внутренних функций (append-only)¶
8.1 Функции допуска к созданию отзыва¶
ReviewViewSet.is_user_product_seller(user, model_3d_id)¶
- Источник:
review_service/review_app/views.py - Назначение: проверить, является ли пользователь продавцом указанного товара.
- Вход:
user;model_3d_id.- Выход:
bool.- Side effects:
- direct import модели product-service;
- при недоступности импорта используется SQL fallback-запрос к таблице продукта.
- Edge-cases:
- при ошибках проверки применяется fail-secure (
False), чтобы не разрешить self-review.
ReviewViewSet.has_user_purchased_product(user, model_3d_id)¶
- Назначение: подтвердить факт покупки товара пользователем.
- Вход:
user,model_3d_id.- Выход:
bool.- Условия valid purchase:
- заказ в статусе оплаты
paid; - заказ в статусе
delivered. - Side effects:
- direct import
order_appлибо SQL fallback.
8.2 ReviewViewSet.perform_create(self, serializer)¶
- Источник:
review_service/review_app/views.py - Назначение: централизованная проверка бизнес-условий перед сохранением отзыва.
- Вход:
- валидированный serializer.
- Выход:
- созданный отзыв в стандартном DRF flow.
- Side effects:
- запись
Reviewв БД; - best-effort создание уведомления в
admin_app.Notification. - Ошибки:
PermissionDenied, если пользователь пытается оставить отзыв на свой товар;PermissionDenied, если не подтверждена покупка.
8.3 Агрегирующие функции статистики¶
ReviewViewSet.by_model(self, request)¶
- Вход:
- query param
model_3d_id. - Выход:
- список отзывов по товару;
average_rating;total_reviews.- Ошибки:
400при отсутствииmodel_3d_id.
ReviewViewSet.statistics(self, request)¶
- Вход:
- query param
model_3d_id. - Выход:
- агрегаты рейтинга и распределение оценок 1..5.
ReviewViewSet.seller_reviews(self, request)¶
- Вход:
- optional filters:
product_id,rating,date_from,date_to,search. - Выход:
- отзывы по товарам продавца;
- агрегаты
by_ratingиby_product. - Edge-cases:
- формат дат для фильтров должен быть согласован с DRF parsing (рекомендуется фиксировать ISO-формат в интеграционном контуре).
8.4 Контракт serializer-уровня¶
ReviewSerializer.create(self, validated_data)¶
- Источник:
review_service/review_app/serializers.py - Назначение: закрепить автора отзыва за текущим пользователем запроса.
- Side effects:
- поле
userне принимается напрямую из клиента, а задается сервером из контекста request.
9. Соответствие master-документации¶
Источник верхнего уровня: Master-документация проекта.
| Контроль | Требование | Проверка | Артефакт |
|---|---|---|---|
| Ownership control | Изменение/удаление отзыва разрешено только owner/staff | проверка permission сценариев | integration tests |
| Data quality | Агрегаты и фильтры seller_reviews воспроизводимы | проверка дат/рейтингов и подсчетов | QA report |
| API consistency | Контракты review endpoint-ов стабильны для frontend | контрактные smoke тесты | release checklist |
| Risk capture | Ограничения формата дат и edge-cases документированы | ревью секции ограничений | docs review |