diff --git a/main_dc/yalarba/api_yal/documentation/TEST_REST_API_REQUESTS.md b/main_dc/yalarba/api_yal/documentation/TEST_REST_API_REQUESTS.md new file mode 100644 index 0000000..124deac --- /dev/null +++ b/main_dc/yalarba/api_yal/documentation/TEST_REST_API_REQUESTS.md @@ -0,0 +1,1485 @@ +Вот все тестовые запросы и ожидаемые ответы с заменой `your-domain.com` на `easysite102.ru`: + +--- + +## 1. Аутентификация (Auth) + +### 1.1 Регистрация + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/register +Content-Type: application/json + +{ + "email": "test@example.com", + "password": "securePass123", + "first_name": "Петр", + "last_name": "Петров" +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "expires_at": "2025-01-01T12:00:00Z", + "user": { + "id": 42, + "email": "test@example.com", + "first_name": "Петр", + "last_name": "Петров", + "full_name": "Петр Петров", + "role": "user" + } +} +``` + +### 1.2 Вход + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/login +Content-Type: application/json + +{ + "email": "test@example.com", + "password": "securePass123" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "expires_at": "2025-01-01T12:00:00Z", + "user": { + "id": 42, + "email": "test@example.com", + "first_name": "Петр", + "last_name": "Петров", + "full_name": "Петр Петров", + "role": "user" + } +} +``` + +### 1.3 Обновление токена + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/refresh +Cookie: refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.new...", + "expires_at": "2025-01-01T13:00:00Z", + "user": { + "id": 42, + "email": "test@example.com", + "first_name": "Петр", + "last_name": "Петров", + "full_name": "Петр Петров", + "role": "user" + } +} +``` + +### 1.4 Выход из системы + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/logout +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Successfully logged out" +} +``` + +### 1.5 Запрос сброса пароля + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/password-reset/request +Content-Type: application/json + +{ + "email": "test@example.com" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Password reset link has been sent to your email", + "token": "reset_token_abc123def456" +} +``` + +### 1.6 Подтверждение сброса пароля + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/password-reset/confirm +Content-Type: application/json + +{ + "token": "reset_token_abc123def456", + "new_password": "newStrongPass789" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Password has been successfully reset" +} +``` + +### 1.7 Вход для мобильных приложений + +**Запрос:** +```http +POST https://easysite102.ru/api/auth/mobile/login +Content-Type: application/json + +{ + "email": "test@example.com", + "password": "securePass123" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "refresh_token": "refresh_token_string_xyz789", + "expires_at": "2025-01-01T12:00:00Z", + "user": { + "id": 42, + "email": "test@example.com", + "first_name": "Петр", + "last_name": "Петров", + "full_name": "Петр Петров", + "role": "user" + } +} +``` + +--- + +## 2. Аккаунт (Account) + +### 2.1 Получение профиля пользователя + +**Запрос:** +```http +GET https://easysite102.ru/api/account/profile +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "id": 42, + "created_at": "2024-01-15T10:30:00Z", + "updated_at": "2024-01-20T14:25:00Z", + "email": "test@example.com", + "full_name": "Петр Петров", + "first_name": "Петр", + "last_name": "Петров", + "phone": "+79001234567", + "city": "Москва", + "organization_form": "ООО", + "organization_name": "Ромашка", + "organization_short": "ООО Ромашка", + "inn": "7701234567", + "personal_inn": "", + "is_active": true, + "is_verified": false, + "role": "user", + "stats": { + "objects_count": 3, + "feedbacks_count": 7, + "comments_count": 12, + "ratings_count": 4, + "appeals_count": 1 + } +} +``` + +### 2.2 Получение аккаунта по ID (свой профиль) + +**Запрос:** +```http +GET https://easysite102.ru/api/account +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "id": 42, + "created_at": "2024-01-15T10:30:00Z", + "updated_at": "2024-01-20T14:25:00Z", + "email": "test@example.com", + "full_name": "Петр Петров", + "first_name": "Петр", + "last_name": "Петров", + "phone": "+79001234567", + "city": "Москва", + "is_active": true, + "is_verified": false, + "role": "user" +} +``` + +### 2.3 Обновление аккаунта + +**Запрос:** +```http +PUT https://easysite102.ru/api/account +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "full_name": "Петр Сергеевич Петров", + "first_name": "Петр", + "last_name": "Петров", + "phone": "+79009998877", + "city": "Санкт-Петербург", + "organization_form": "ИП", + "organization_name": "ИП Петров", + "organization_short": "ИП Петров", + "inn": "123456789012", + "personal_inn": "123456789012" +} +``` + +**Ожидаемый ответ (200):** (тот же формат, что и `AccountResponse`) + +### 2.4 Смена пароля + +**Запрос:** +```http +POST https://easysite102.ru/api/account/change-password +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "current_password": "securePass123", + "new_password": "newStrongPass456" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Password changed successfully" +} +``` + +### 2.5 Удаление аккаунта + +**Запрос:** +```http +DELETE https://easysite102.ru/api/account +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Account deleted successfully" +} +``` + +### 2.6 Список аккаунтов (админ/модератор) + +**Запрос:** +```http +GET https://easysite102.ru/api/admin/accounts?page=1&page_size=20&role=user&is_active=true +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "items": [ + { + "id": 42, + "email": "test@example.com", + "full_name": "Петр Петров", + "role": "user", + "is_active": true, + "is_verified": false + } + ], + "total": 100, + "page": 1, + "page_size": 20, + "total_pages": 5 +} +``` + +### 2.7 Верификация аккаунта (админ) + +**Запрос:** +```http +PUT https://easysite102.ru/api/admin/accounts/verify?id=42 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "is_verified": true +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Account verified successfully" +} +``` + +### 2.8 Обновление статуса аккаунта (админ) + +**Запрос:** +```http +PUT https://easysite102.ru/api/admin/accounts/status?id=42 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "is_active": true, + "role": "moderator" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Account status updated successfully" +} +``` + +--- + +## 3. Объекты (Objects) + +### 3.1 Создание объекта + +**Запрос:** +```http +POST https://easysite102.ru/api/objects +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "short_name": "Кофе & Книги", + "long_name": "Кофе & Книги на Арбате", + "type": "cafe", + "phone": "+74951234567", + "email": "cafe@knigi.ru", + "site": "https://cafe-knigi.ru", + "short_description": "Кофейня с книжным магазином", + "description": "Уютное место, где можно выпить кофе и почитать книгу", + "address": "Москва, ул. Арбат, 10", + "latitude": 55.751244, + "longitude": 37.591396, + "is_active": true, + "is_verified": false +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "id": 101, + "created_at": "2024-06-10T09:15:00Z", + "updated_at": "2024-06-10T09:15:00Z", + "deleted_at": null, + "owner_id": 42, + "owner": { + "id": 42, + "email": "test@example.com", + "full_name": "Петр Петров", + "first_name": "Петр", + "last_name": "Петров" + }, + "short_name": "Кофе & Книги", + "long_name": "Кофе & Книги на Арбате", + "type": "cafe", + "phone": "+74951234567", + "email": "cafe@knigi.ru", + "site": "https://cafe-knigi.ru", + "short_description": "Кофейня с книжным магазином", + "description": "Уютное место, где можно выпить кофе и почитать книгу", + "address": "Москва, ул. Арбат, 10", + "latitude": 55.751244, + "longitude": 37.591396, + "is_active": true, + "is_verified": false, + "feedback_count": 0, + "tourist_rating": null, + "entrepreneur_rating": null, + "feedbacks": [] +} +``` + +### 3.2 Получение объекта по ID + +**Запрос:** +```http +GET https://easysite102.ru/api/objects/101 +``` + +**Ожидаемый ответ (200):** +```json +{ + "id": 101, + "created_at": "2024-06-10T09:15:00Z", + "updated_at": "2024-06-10T09:15:00Z", + "deleted_at": null, + "owner_id": 42, + "owner": { + "id": 42, + "email": "test@example.com", + "full_name": "Петр Петров", + "first_name": "Петр", + "last_name": "Петров" + }, + "short_name": "Кофе & Книги", + "long_name": "Кофе & Книги на Арбате", + "type": "cafe", + "phone": "+74951234567", + "email": "cafe@knigi.ru", + "site": "https://cafe-knigi.ru", + "short_description": "Кофейня с книжным магазином", + "description": "Уютное место, где можно выпить кофе и почитать книгу", + "address": "Москва, ул. Арбат, 10", + "latitude": 55.751244, + "longitude": 37.591396, + "is_active": true, + "is_verified": false, + "feedback_count": 3, + "tourist_rating": { + "id": 1, + "created_at": "2024-06-10T10:00:00Z", + "platform": "tourist", + "average_score": 4.8, + "total_votes": 25, + "vote_breakdown": { + "1": 0, + "2": 1, + "3": 2, + "4": 5, + "5": 17 + } + }, + "entrepreneur_rating": null, + "feedbacks": [] +} +``` + +### 3.3 Обновление объекта + +**Запрос:** +```http +PUT https://easysite102.ru/api/objects/101 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "short_name": "Кофе & Книги Обновленный", + "description": "Обновленное описание кафе", + "is_active": true +} +``` + +**Ожидаемый ответ (200):** `ObjectResponse` + +### 3.4 Удаление объекта + +**Запрос:** +```http +DELETE https://easysite102.ru/api/objects/101 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (204 No Content)** + +### 3.5 Список объектов (с фильтрацией) + +**Запрос:** +```http +GET https://easysite102.ru/api/objects?type=cafe&q=кофе&page=2&page_size=5&is_active=true +``` + +**Ожидаемый ответ (200):** +```json +{ + "items": [ + { + "id": 101, + "short_name": "Кофе & Книги", + "long_name": "Кофе & Книги на Арбате", + "type": "cafe", + "address": "Москва, ул. Арбат, 10", + "latitude": 55.751244, + "longitude": 37.591396, + "is_active": true, + "is_verified": false, + "feedback_count": 3 + } + ], + "total": 12, + "page": 2, + "page_size": 5, + "total_pages": 3 +} +``` + +### 3.6 Объекты пользователя + +**Запрос:** +```http +GET https://easysite102.ru/api/objects/owner/42?page=1&page_size=10 +``` + +**Ожидаемый ответ (200):** `ObjectListResponse` + +### 3.7 Поиск объектов + +**Запрос:** +```http +GET https://easysite102.ru/api/objects/search?q=кофе&page=1&page_size=10 +``` + +**Ожидаемый ответ (200):** `ObjectListResponse` + +### 3.8 Ближайшие объекты + +**Запрос:** +```http +GET https://easysite102.ru/api/objects/nearby?lat=55.751244&lng=37.591396&radius=500&page=1&page_size=10 +``` + +**Ожидаемый ответ (200):** `ObjectListResponse` + +### 3.9 Создание отзыва об объекте + +**Запрос:** +```http +POST https://easysite102.ru/api/objects/101/feedbacks +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "platform": "tourist", + "score": 5, + "text": "Очень атмосферное место! Кофе отличный, книги интересные." +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "id": 501, + "object_id": 101, + "author_id": 42, + "rating": 5, + "text": "Очень атмосферное место! Кофе отличный, книги интересные.", + "platform": "tourist", + "media_urls": [], + "created_at": "2024-06-10T10:00:00Z", + "updated_at": "2024-06-10T10:00:00Z", + "author": { + "id": 42, + "full_name": "Петр Петров" + } +} +``` + +### 3.10 Голосование за объект + +**Запрос:** +```http +POST https://easysite102.ru/api/objects/101/ratings +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "platform": "tourist", + "score": 5 +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "id": 1, + "object_id": 101, + "platform": "tourist", + "average_score": 4.8, + "total_votes": 26, + "vote_breakdown": { + "1": 0, + "2": 1, + "3": 2, + "4": 5, + "5": 18 + }, + "user_score": 5 +} +``` + +--- + +## 4. Отзывы (Feedbacks) + +### 4.1 Создание отзыва + +**Запрос:** +```http +POST https://easysite102.ru/api/feedbacks +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "object_id": 101, + "rating": 5, + "text": "Отличное место! Обязательно вернусь сюда еще.", + "platform": "tourist", + "media_urls": ["https://easysite102.ru/uploads/photo1.jpg"] +} +``` + +**Ожидаемый ответ (201):** `FeedbackResponse` + +### 4.2 Получение отзыва по ID + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/501 +``` + +**Ожидаемый ответ (200):** `FeedbackResponse` + +### 4.3 Обновление отзыва + +**Запрос:** +```http +PUT https://easysite102.ru/api/feedbacks/501 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "rating": 4, + "text": "Обновленный текст: место хорошее, но кофе мог бы быть и получше." +} +``` + +**Ожидаемый ответ (200):** `FeedbackResponse` + +### 4.4 Удаление отзыва + +**Запрос:** +```http +DELETE https://easysite102.ru/api/feedbacks/501 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (204 No Content)** + +### 4.5 Список отзывов + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks?offset=0&limit=20 +``` + +**Ожидаемый ответ (200):** `FeedbackListResponse` + +### 4.6 Мои отзывы + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/my +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** `FeedbackListResponse` + +### 4.7 Отзывы по объекту + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/object/101?offset=0&limit=10 +``` + +**Ожидаемый ответ (200):** +```json +{ + "items": [ + { + "id": 501, + "object_id": 101, + "rating": 5, + "text": "Очень атмосферное место! Кофе отличный, книги интересные.", + "platform": "tourist", + "created_at": "2024-06-10T10:00:00Z", + "author": { + "id": 42, + "full_name": "Петр Петров" + } + } + ], + "total": 1, + "offset": 0, + "limit": 10 +} +``` + +### 4.8 Отзывы по платформе + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/platform/tourist?offset=0&limit=20 +``` + +**Ожидаемый ответ (200):** `FeedbackListResponse` + +### 4.9 Поиск отзывов + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/search?q=атмосферное +``` + +**Ожидаемый ответ (200):** `FeedbackListResponse` + +### 4.10 Статистика отзывов + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/stats +``` + +**Ожидаемый ответ (200):** +```json +{ + "total_feedbacks": 1000, + "average_rating": 4.2, + "rating_distribution": { + "1": 50, + "2": 100, + "3": 200, + "4": 300, + "5": 350 + }, + "platform_stats": { + "tourist": 600, + "entrepreneur": 400 + } +} +``` + +### 4.11 Комментарии к отзыву + +**Запрос:** +```http +GET https://easysite102.ru/api/feedbacks/501/comments +``` + +**Ожидаемый ответ (200):** `CommentListResponse` + +### 4.12 Добавление комментария к отзыву + +**Запрос:** +```http +POST https://easysite102.ru/api/feedbacks/501/comments +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "text": "Полностью согласен! Тоже был там, отличное место." +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "id": 201, + "feedback_id": 501, + "author_id": 99, + "text": "Полностью согласен! Тоже был там, отличное место.", + "parent_id": null, + "verified": false, + "created_at": "2024-06-10T10:05:00Z", + "updated_at": "2024-06-10T10:05:00Z", + "author": { + "id": 99, + "full_name": "Анна Сидорова" + } +} +``` + +### 4.13 Обновление комментария + +**Запрос:** +```http +PUT https://easysite102.ru/api/feedbacks/501/comments/201 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "text": "Обновленный текст комментария" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "comment updated successfully" +} +``` + +### 4.14 Удаление комментария + +**Запрос:** +```http +DELETE https://easysite102.ru/api/feedbacks/501/comments/201 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (204 No Content)** + +--- + +## 5. Обращения (Appeals) + +### 5.1 Создание обращения + +**Запрос:** +```http +POST https://easysite102.ru/api/appeals +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "type": "complaint", + "title": "Некорректное отображение времени работы", + "message": "В карточке кафе указано время работы до 23:00, но фактически закрываются в 21:00", + "priority": "medium", + "object_id": 101, + "contact_email": "test@example.com", + "category": "data_accuracy" +} +``` + +**Ожидаемый ответ (201):** +```json +{ + "id": 301, + "type": "complaint", + "title": "Некорректное отображение времени работы", + "message": "В карточке кафе указано время работы до 23:00, но фактически закрываются в 21:00", + "priority": "medium", + "status": "new", + "category": "data_accuracy", + "created_at": "2024-06-10T11:20:00Z", + "updated_at": "2024-06-10T11:20:00Z", + "author_id": 42, + "assigned_to_id": null, + "resolved_at": null, + "resolution": null +} +``` + +### 5.2 Получение обращения по ID + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals/301 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** `AppealResponse` + +### 5.3 Обновление обращения + +**Запрос:** +```http +PUT https://easysite102.ru/api/appeals/301 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "title": "Обновленный заголовок", + "message": "Обновленное сообщение", + "priority": "critical", + "category": "billing" +} +``` + +**Ожидаемый ответ (200):** `AppealResponse` + +### 5.4 Удаление обращения + +**Запрос:** +```http +DELETE https://easysite102.ru/api/appeals/301 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (204 No Content)** + +### 5.5 Список обращений (админ/модератор) + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals?offset=0&limit=20&status=new&type=complaint +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** `ListAppealsResponse` + +### 5.6 Мои обращения + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals/me +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** `ListAppealsResponse` + +### 5.7 Обращения пользователя (админ) + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals/user/42 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** `ListAppealsResponse` + +### 5.8 Обновление статуса обращения + +**Запрос:** +```http +PATCH https://easysite102.ru/api/appeals/301/status +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "status": "in_progress", + "comment": "Передано в отдел верификации данных" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Status updated successfully" +} +``` + +### 5.9 Назначение ответственного + +**Запрос:** +```http +POST https://easysite102.ru/api/appeals/301/assign +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "assigned_to_id": 5 +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Assigned successfully" +} +``` + +### 5.10 Решение обращения + +**Запрос:** +```http +POST https://easysite102.ru/api/appeals/301/resolve +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "resolution": "Проблема решена: время работы обновлено в карточке объекта" +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Appeal resolved successfully" +} +``` + +### 5.11 История изменений обращения + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals/301/history +``` + +**Ожидаемый ответ (200):** `ListHistoryResponse` + +### 5.12 Статистика обращений (админ) + +**Запрос:** +```http +GET https://easysite102.ru/api/appeals/statistics +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "total": 1000, + "by_status": { + "new": 50, + "in_progress": 100, + "resolved": 800, + "rejected": 30, + "closed": 20 + }, + "by_type": { + "complaint": 400, + "suggestion": 200, + "wish": 150, + "question": 200, + "other": 50 + }, + "by_priority": { + "low": 200, + "medium": 500, + "high": 250, + "critical": 50 + }, + "by_category": { + "data_accuracy": 100, + "billing": 50, + "technical": 150 + }, + "avg_resolve_time_hours": 24.5 +} +``` + +--- + +## 6. Комментарии (Comments) + +### 6.1 Создание комментария + +**Запрос:** +```http +POST https://easysite102.ru/api/comments +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "feedback_id": 501, + "text": "Отличный отзыв!", + "parent_id": null +} +``` + +**Ожидаемый ответ (201):** `CommentResponse` + +### 6.2 Получение комментария по ID + +**Запрос:** +```http +GET https://easysite102.ru/api/comments/201 +``` + +**Ожидаемый ответ (200):** `CommentResponse` + +### 6.3 Обновление комментария + +**Запрос:** +```http +PUT https://easysite102.ru/api/comments/201 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "text": "Обновленный текст комментария" +} +``` + +**Ожидаемый ответ (200):** `CommentResponse` + +### 6.4 Удаление комментария + +**Запрос:** +```http +DELETE https://easysite102.ru/api/comments/201 +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Comment deleted successfully" +} +``` + +### 6.5 Список комментариев (с фильтрацией) + +**Запрос:** +```http +GET https://easysite102.ru/api/comments?feedback_id=501&page=1&page_size=20&sort_by=created_at&sort_order=desc +``` + +**Ожидаемый ответ (200):** +```json +{ + "data": [ + { + "id": 201, + "feedback_id": 501, + "author_id": 99, + "text": "Полностью согласен! Тоже был там, отличное место.", + "parent_id": null, + "verified": false, + "created_at": "2024-06-10T10:05:00Z", + "updated_at": "2024-06-10T10:05:00Z", + "author": { + "id": 99, + "full_name": "Анна Сидорова" + } + } + ], + "total": 1, + "page": 1, + "page_size": 20, + "total_pages": 1 +} +``` + +### 6.6 Мои комментарии + +**Запрос:** +```http +GET https://easysite102.ru/api/comments/my +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** (тот же формат, что и список) + +### 6.7 Комментарии по отзыву + +**Запрос:** +```http +GET https://easysite102.ru/api/comments/feedback/501?page=1&page_size=20 +``` + +**Ожидаемый ответ (200):** (тот же формат, что и список) + +### 6.8 Ответы на комментарий + +**Запрос:** +```http +GET https://easysite102.ru/api/comments/replies/201?page=1&page_size=20 +``` + +**Ожидаемый ответ (200):** (тот же формат, что и список) + +### 6.9 Верификация комментария (админ) + +**Запрос:** +```http +PUT https://easysite102.ru/api/comments/201/verify +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "verified": true +} +``` + +**Ожидаемый ответ (200):** +```json +{ + "message": "Comment verified successfully" +} +``` + +### 6.10 Статистика комментариев + +**Запрос:** +```http +GET https://easysite102.ru/api/comments/stats +``` + +**Ожидаемый ответ (200):** +```json +{ + "total_comments": 5000, + "verified_comments": 3000, + "unverified_comments": 2000, + "avg_comments_per_feedback": 5.2, + "most_active_users": [ + { + "user_id": 42, + "full_name": "Петр Петров", + "comments_count": 150 + } + ] +} +``` + +--- + +## 7. Рейтинги (Ratings) + +### 7.1 Создание рейтинга + +**Запрос:** +```http +POST https://easysite102.ru/api/ratings +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "object_id": 101, + "platform": "tourist" +} +``` + +**Ожидаемый ответ (201):** `RatingResponse` + +### 7.2 Получение рейтинга по ID + +**Запрос:** +```http +GET https://easysite102.ru/api/ratings/1 +``` + +**Ожидаемый ответ (200):** `RatingResponse` + +### 7.3 Получение рейтинга объекта по платформе + +**Запрос:** +```http +GET https://easysite102.ru/api/ratings/object/101/platform/tourist +``` + +**Ожидаемый ответ (200):** `RatingResponse` + +### 7.4 Список рейтингов + +**Запрос:** +```http +GET https://easysite102.ru/api/ratings?page=1&page_size=20&platform=tourist&object_id=101 +``` + +**Ожидаемый ответ (200):** `ListRatingsResponse` + +### 7.5 Голосование + +**Запрос:** +```http +POST https://easysite102.ru/api/ratings/1/vote/tourist +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "score": 5 +} +``` + +**Ожидаемый ответ (200):** `RatingResponse` + +### 7.6 Мой голос + +**Запрос:** +```http +GET https://easysite102.ru/api/ratings/1/my-vote/tourist +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (200):** +```json +{ + "has_voted": true, + "user_score": 5 +} +``` + +### 7.7 Обновление моего голоса + +**Запрос:** +```http +PUT https://easysite102.ru/api/ratings/1/my-vote/tourist +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +Content-Type: application/json + +{ + "score": 4 +} +``` + +**Ожидаемый ответ (200):** `RatingResponse` + +### 7.8 Удаление моего голоса + +**Запрос:** +```http +DELETE https://easysite102.ru/api/ratings/1/my-vote/tourist +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (204 No Content)** + +### 7.9 Статистика рейтингов + +**Запрос:** +```http +GET https://easysite102.ru/api/ratings/stats +``` + +**Ожидаемый ответ (200):** +```json +{ + "total_ratings": 500, + "total_votes": 5000, + "platform_distribution": { + "tourist": 300, + "entrepreneur": 200 + }, + "average_by_platform": { + "tourist": 4.5, + "entrepreneur": 4.2 + } +} +``` + +--- + +## 8. Примеры ошибок + +### Ошибка валидации (400) + +**Запрос (невалидный email):** +```http +POST https://easysite102.ru/api/auth/register +Content-Type: application/json + +{ + "email": "not-an-email", + "password": "123", + "first_name": "А", + "last_name": "Б" +} +``` + +**Ожидаемый ответ (400):** +```json +{ + "error": "Validation failed", + "fields": [ + "field email is invalid: must be valid email address", + "field password is invalid: minimum length 6 characters", + "field first_name is invalid: required", + "field last_name is invalid: required" + ] +} +``` + +### Не авторизован (401) + +**Запрос без токена:** +```http +GET https://easysite102.ru/api/account/profile +``` + +**Ожидаемый ответ (401):** +```json +{ + "error": "Missing or invalid authorization token" +} +``` + +### Доступ запрещен (403) + +**Запрос (обычный пользователь пытается получить список всех аккаунтов):** +```http +GET https://easysite102.ru/api/admin/accounts +Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Ожидаемый ответ (403):** +```json +{ + "error": "Insufficient permissions. Admin role required." +} +``` + +### Ресурс не найден (404) + +**Запрос:** +```http +GET https://easysite102.ru/api/objects/999999 +``` + +**Ожидаемый ответ (404):** +```json +{ + "error": "Object with ID 999999 not found" +} +``` + +### Конфликт (409) + +**Запрос (регистрация с уже существующим email):** +```http +POST https://easysite102.ru/api/auth/register +Content-Type: application/json + +{ + "email": "existing@example.com", + "password": "pass123", + "first_name": "Иван", + "last_name": "Иванов" +} +``` + +**Ожидаемый ответ (409):** +```json +{ + "error": "User with this email already exists" +} +``` + +### Внутренняя ошибка сервера (500) + +**Ожидаемый ответ (500):** +```json +{ + "error": "Internal server error. Please try again later." +} +``` + +--- + +Все тестовые запросы и ожидаемые ответы теперь используют домен `easysite102.ru`. \ No newline at end of file