Files
WellShe/docs/api_specification.md

13 KiB
Raw Permalink Blame History

Описание API и способы взаимодействия с ним

Промпт для ИИ

Ты — технический документатор API для микросервисной архитектуры приложения женской безопасности. Твоя задача — предоставить четкое, точное и полное описание API для разработчиков клиентского приложения. Основывайся на представленной ниже спецификации API и отвечай на запросы разработчиков по интеграции с бэкендом.

Общая информация об API

Бэкенд приложения построен на микросервисной архитектуре с использованием FastAPI, что обеспечивает высокую производительность и масштабируемость. Все запросы к API проходят через API Gateway (шлюз), который направляет их в соответствующие микросервисы.

Базовый URL

https://api.womensafety.app/api/v1/

В среде разработки:

http://localhost:8001/api/v1/

Формат данных

API принимает и отправляет данные в формате JSON. При отправке запроса необходимо указать заголовок:

Content-Type: application/json

Аутентификация

API использует JWT (JSON Web Tokens) для аутентификации. После успешной авторизации вы получаете два токена:

  • access_token — для авторизации запросов (срок действия: 30 минут)
  • refresh_token — для обновления access_token (срок действия: 7 дней)

Для авторизованных запросов необходимо добавлять заголовок:

Authorization: Bearer {access_token}

Сервис авторизации (User Service)

Регистрация нового пользователя

Эндпоинт: POST /auth/register

Тело запроса:

{
  "email": "user@example.com",
  "username": "username",
  "password": "SecurePassword123!",
  "first_name": "Имя",
  "last_name": "Фамилия",
  "phone": "+79991234567"
}

Ответ при успехе (201 Created):

{
  "status": "success",
  "message": "User registered successfully",
  "data": {
    "user_id": "uuid-string",
    "username": "username",
    "email": "user@example.com"
  }
}

Возможные ошибки:

  • 400 Bad Request: Некорректные данные
  • 409 Conflict: Пользователь с таким email или username уже существует

Авторизация пользователя

Эндпоинт: POST /auth/login

Тело запроса (вариант 1):

{
  "username": "username",
  "password": "SecurePassword123!"
}

Тело запроса (вариант 2):

{
  "email": "user@example.com",
  "password": "SecurePassword123!"
}

Ответ при успехе (200 OK):

{
  "status": "success",
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "bearer",
    "expires_in": 1800
  }
}

Возможные ошибки:

  • 401 Unauthorized: Неверный логин или пароль
  • 403 Forbidden: Аккаунт заблокирован

Обновление токена

Эндпоинт: POST /auth/refresh

Тело запроса:

{
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Ответ при успехе (200 OK):

{
  "status": "success",
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "bearer",
    "expires_in": 1800
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный refresh_token

Выход из системы

Эндпоинт: POST /auth/logout

Заголовки:

Authorization: Bearer {access_token}

Ответ при успехе (200 OK):

{
  "status": "success",
  "message": "Successfully logged out"
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен

Получение профиля пользователя

Эндпоинт: GET /users/me

Заголовки:

Authorization: Bearer {access_token}

Ответ при успехе (200 OK):

{
  "status": "success",
  "data": {
    "user_id": "uuid-string",
    "username": "username",
    "email": "user@example.com",
    "first_name": "Имя",
    "last_name": "Фамилия",
    "phone": "+79991234567",
    "created_at": "2025-10-16T10:30:00Z",
    "is_verified": true
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен

Сервис экстренных оповещений (Emergency Service)

Создание экстренного оповещения

Эндпоинт: POST /emergency/alert

Заголовки:

Authorization: Bearer {access_token}

Тело запроса:

{
  "location": {
    "latitude": 55.7558,
    "longitude": 37.6173
  },
  "message": "Нуждаюсь в помощи. Преследование.",
  "battery_level": 42,
  "contact_ids": ["uuid1", "uuid2"]
}

Ответ при успехе (201 Created):

{
  "status": "success",
  "data": {
    "alert_id": "alert-uuid-string",
    "created_at": "2025-10-16T15:30:00Z",
    "status": "active",
    "message": "Экстренное оповещение активировано"
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен
  • 400 Bad Request: Неверные координаты или другие данные

Получение статуса экстренного оповещения

Эндпоинт: GET /emergency/alert/{alert_id}

Заголовки:

Authorization: Bearer {access_token}

Ответ при успехе (200 OK):

{
  "status": "success",
  "data": {
    "alert_id": "alert-uuid-string",
    "created_at": "2025-10-16T15:30:00Z",
    "status": "active",
    "location": {
      "latitude": 55.7558,
      "longitude": 37.6173,
      "updated_at": "2025-10-16T15:35:00Z"
    },
    "notified_contacts": [
      {
        "contact_id": "uuid1",
        "status": "notified",
        "notified_at": "2025-10-16T15:31:00Z"
      },
      {
        "contact_id": "uuid2",
        "status": "pending",
        "notified_at": null
      }
    ],
    "emergency_services_notified": true,
    "emergency_services_notified_at": "2025-10-16T15:32:00Z"
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен
  • 403 Forbidden: Нет доступа к данному оповещению
  • 404 Not Found: Оповещение не найдено

Обновление местоположения при активном оповещении

Эндпоинт: PUT /emergency/alert/{alert_id}/location

Заголовки:

Authorization: Bearer {access_token}

Тело запроса:

{
  "latitude": 55.7560,
  "longitude": 37.6175,
  "accuracy": 10.5,
  "battery_level": 38
}

Ответ при успехе (200 OK):

{
  "status": "success",
  "message": "Location updated successfully",
  "data": {
    "updated_at": "2025-10-16T15:40:00Z"
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен
  • 403 Forbidden: Нет доступа к данному оповещению
  • 404 Not Found: Оповещение не найдено или не активно

Отмена экстренного оповещения

Эндпоинт: POST /emergency/alert/{alert_id}/cancel

Заголовки:

Authorization: Bearer {access_token}

Тело запроса:

{
  "reason": "Ложная тревога",
  "details": "Случайно нажала кнопку"
}

Ответ при успехе (200 OK):

{
  "status": "success",
  "message": "Alert cancelled successfully",
  "data": {
    "alert_id": "alert-uuid-string",
    "cancelled_at": "2025-10-16T15:45:00Z",
    "status": "cancelled"
  }
}

Возможные ошибки:

  • 401 Unauthorized: Недействительный токен
  • 403 Forbidden: Нет доступа к данному оповещению
  • 404 Not Found: Оповещение не найдено
  • 409 Conflict: Оповещение уже отменено

Рекомендации по работе с API

Обработка ошибок

Все ошибки API возвращаются в едином формате:

{
  "status": "error",
  "code": "ERROR_CODE",
  "message": "Описание ошибки",
  "details": {
    "field": ["Детальное описание ошибки для конкретного поля"]
  }
}

Управление токенами

  1. После получения access_token и refresh_token сохраните их в безопасном хранилище.
  2. Для каждого запроса, требующего авторизацию, добавляйте access_token в заголовок.
  3. Если API возвращает ошибку 401, попробуйте обновить токен через эндпоинт /auth/refresh.
  4. Если и это не помогает, перенаправьте пользователя на страницу входа.

Оптимизация работы с сетью

  1. Используйте кэширование для уменьшения количества запросов.
  2. Реализуйте механизм повторных попыток для нестабильных соединений.
  3. При отправке экстренных оповещений учитывайте возможную нестабильность сети — сохраняйте данные локально до получения подтверждения от сервера.

Работа с геолокацией

  1. Запрашивайте у пользователя разрешение на постоянный доступ к геолокации.
  2. Оптимизируйте частоту обновления координат для экономии батареи.
  3. При активном экстренном оповещении увеличивайте частоту обновления координат.

Тестирование API

Для облегчения интеграции с API доступна песочница:

https://api-sandbox.womensafety.app/api/v1/

Тестовые учетные записи:

  • Пользователь: test_user/Test123!
  • Администратор: test_admin/Admin123!

Работа с реальными устройствами

Для корректной работы с API на реальных устройствах учитывайте:

  1. Ограничения режима энергосбережения на некоторых устройствах.
  2. Различную точность GPS на разных моделях телефонов.
  3. Возможность потери соединения в некоторых зонах.

Реализуйте механизм, который будет накапливать данные локально при отсутствии сети и отправлять их, когда соединение восстановится.

Безопасность

  1. Никогда не храните пароли в открытом виде.
  2. Не сохраняйте токены в незащищенном хранилище.
  3. Всегда проверяйте SSL-сертификаты при подключении к API.
  4. Реализуйте защиту от подбора пароля, ограничивая количество попыток входа.

Поддержка

При возникновении проблем с интеграцией можно обратиться: