Вот все тестовые запросы и ожидаемые ответы с заменой `your-domain.com` на `easysite102.ru`:

---

## 1. Аутентификация (Auth)

### 1.1 Регистрация

**Запрос:**
```http
POST https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/auth/logout
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):**
```json
{
  "message": "Successfully logged out"
}
```

### 1.5 Запрос сброса пароля

**Запрос:**
```http
POST https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/account
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):**
```json
{
  "message": "Account deleted successfully"
}
```

### 2.6 Список аккаунтов (админ/модератор)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/objects/101
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (204 No Content)**

### 3.5 Список объектов (с фильтрацией)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/objects/owner/42?page=1&page_size=10
```

**Ожидаемый ответ (200):** `ObjectListResponse`

### 3.7 Поиск объектов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/objects/search?q=кофе&page=1&page_size=10
```

**Ожидаемый ответ (200):** `ObjectListResponse`

### 3.8 Ближайшие объекты

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/feedbacks/501
```

**Ожидаемый ответ (200):** `FeedbackResponse`

### 4.3 Обновление отзыва

**Запрос:**
```http
PUT https://easysite102.ru/api_yal/api/v1/feedbacks/501
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "rating": 4,
  "text": "Обновленный текст: место хорошее, но кофе мог бы быть и получше."
}
```

**Ожидаемый ответ (200):** `FeedbackResponse`

### 4.4 Удаление отзыва

**Запрос:**
```http
DELETE https://easysite102.ru/api_yal/api/v1/feedbacks/501
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (204 No Content)**

### 4.5 Список отзывов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/feedbacks?offset=0&limit=20
```

**Ожидаемый ответ (200):** `FeedbackListResponse`

### 4.6 Мои отзывы

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/feedbacks/my
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** `FeedbackListResponse`

### 4.7 Отзывы по объекту

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/feedbacks/platform/tourist?offset=0&limit=20
```

**Ожидаемый ответ (200):** `FeedbackListResponse`

### 4.9 Поиск отзывов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/feedbacks/search?q=атмосферное
```

**Ожидаемый ответ (200):** `FeedbackListResponse`

### 4.10 Статистика отзывов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/feedbacks/501/comments
```

**Ожидаемый ответ (200):** `CommentListResponse`

### 4.12 Добавление комментария к отзыву

**Запрос:**
```http
POST https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/feedbacks/501/comments/201
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (204 No Content)**

---

## 5. Обращения (Appeals)

### 5.1 Создание обращения

**Запрос:**
```http
POST https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/appeals/301
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** `AppealResponse`

### 5.3 Обновление обращения

**Запрос:**
```http
PUT https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/appeals/301
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (204 No Content)**

### 5.5 Список обращений (админ/модератор)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/appeals?offset=0&limit=20&status=new&type=complaint
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** `ListAppealsResponse`

### 5.6 Мои обращения

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/appeals/me
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** `ListAppealsResponse`

### 5.7 Обращения пользователя (админ)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/appeals/user/42
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** `ListAppealsResponse`

### 5.8 Обновление статуса обращения

**Запрос:**
```http
PATCH https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/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_yal/api/v1/appeals/301/history
```

**Ожидаемый ответ (200):** `ListHistoryResponse`

### 5.12 Статистика обращений (админ)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/comments/201
```

**Ожидаемый ответ (200):** `CommentResponse`

### 6.3 Обновление комментария

**Запрос:**
```http
PUT https://easysite102.ru/api_yal/api/v1/comments/201
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "text": "Обновленный текст комментария"
}
```

**Ожидаемый ответ (200):** `CommentResponse`

### 6.4 Удаление комментария

**Запрос:**
```http
DELETE https://easysite102.ru/api_yal/api/v1/comments/201
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):**
```json
{
  "message": "Comment deleted successfully"
}
```

### 6.5 Список комментариев (с фильтрацией)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/comments/my
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):** (тот же формат, что и список)

### 6.7 Комментарии по отзыву

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/comments/feedback/501?page=1&page_size=20
```

**Ожидаемый ответ (200):** (тот же формат, что и список)

### 6.8 Ответы на комментарий

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/comments/replies/201?page=1&page_size=20
```

**Ожидаемый ответ (200):** (тот же формат, что и список)

### 6.9 Верификация комментария (админ)

**Запрос:**
```http
PUT https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/ratings
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "object_id": 101,
  "platform": "tourist"
}
```

**Ожидаемый ответ (201):** `RatingResponse`

### 7.2 Получение рейтинга по ID

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/ratings/1
```

**Ожидаемый ответ (200):** `RatingResponse`

### 7.3 Получение рейтинга объекта по платформе

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/ratings/object/101/platform/tourist
```

**Ожидаемый ответ (200):** `RatingResponse`

### 7.4 Список рейтингов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/ratings?page=1&page_size=20&platform=tourist&object_id=101
```

**Ожидаемый ответ (200):** `ListRatingsResponse`

### 7.5 Голосование

**Запрос:**
```http
POST https://easysite102.ru/api_yal/api/v1/ratings/1/vote/tourist
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "score": 5
}
```

**Ожидаемый ответ (200):** `RatingResponse`

### 7.6 Мой голос

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/ratings/1/my-vote/tourist
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (200):**
```json
{
  "has_voted": true,
  "user_score": 5
}
```

### 7.7 Обновление моего голоса

**Запрос:**
```http
PUT https://easysite102.ru/api_yal/api/v1/ratings/1/my-vote/tourist
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "score": 4
}
```

**Ожидаемый ответ (200):** `RatingResponse`

### 7.8 Удаление моего голоса

**Запрос:**
```http
DELETE https://easysite102.ru/api_yal/api/v1/ratings/1/my-vote/tourist
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (204 No Content)**

### 7.9 Статистика рейтингов

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/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_yal/api/v1/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_yal/api/v1/account/profile
```

**Ожидаемый ответ (401):**
```json
{
  "error": "Missing or invalid authorization token"
}
```

### Доступ запрещен (403)

**Запрос (обычный пользователь пытается получить список всех аккаунтов):**
```http
GET https://easysite102.ru/api_yal/api/v1/admin/accounts
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

**Ожидаемый ответ (403):**
```json
{
  "error": "Insufficient permissions. Admin role required."
}
```

### Ресурс не найден (404)

**Запрос:**
```http
GET https://easysite102.ru/api_yal/api/v1/objects/999999
```

**Ожидаемый ответ (404):**
```json
{
  "error": "Object with ID 999999 not found"
}
```

### Конфликт (409)

**Запрос (регистрация с уже существующим email):**
```http
POST https://easysite102.ru/api_yal/api/v1/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`.