# Emergency Service API Документация ## Обзор Emergency Service предоставляет API для работы с экстренными ситуациями, включая создание оповещений, получение статистики и управление чрезвычайными ситуациями. **Базовый URL:** `http://192.168.0.103:8002` **Аутентификация:** Bearer Token (JWT) --- ## Схемы данных (Schemas) ### 1. AlertType (Enum) Типы экстренных ситуаций: ```python GENERAL = "general" # Общая помощь MEDICAL = "medical" # Медицинская помощь VIOLENCE = "violence" # Насилие HARASSMENT = "harassment" # Преследование UNSAFE_AREA = "unsafe_area" # Небезопасная зона ACCIDENT = "accident" # ДТП/авария FIRE = "fire" # Пожар NATURAL_DISASTER = "natural_disaster" # Стихийное бедствие ``` ### 2. AlertStatus (Enum) Статусы оповещений: ```python ACTIVE = "active" # Активно RESOLVED = "resolved" # Решено CANCELLED = "cancelled" # Отменено INVESTIGATING = "investigating" # Расследуется ``` ### 3. ResponseType (Enum) Типы ответов на оповещения: ```python HELP_ON_WAY = "help_on_way" # Помощь в пути CONTACTED_AUTHORITIES = "contacted_authorities" # Связались с властями SAFE_NOW = "safe_now" # Сейчас в безопасности FALSE_ALARM = "false_alarm" # Ложная тревога INVESTIGATING = "investigating" # Расследуется RESOLVED = "resolved" # Решено ``` ### 4. EmergencyAlertCreate Создание экстренного оповещения: ```json { "latitude": 55.7558, // float, координата широты (-90 до 90) "longitude": 37.6176, // float, координата долготы (-180 до 180) "alert_type": "general", // AlertType, тип оповещения "message": "Описание ситуации", // string?, описание (макс 500 символов) "address": "Адрес места", // string?, адрес (макс 500 символов) "contact_emergency_services": true, // bool, связываться ли со службами экстренного реагирования "notify_emergency_contacts": true // bool, уведомлять ли экстренные контакты } ``` ### 5. EmergencyAlertResponse Ответ с данными оповещения: ```json { "id": 123, // int, ID оповещения "uuid": "8ed4fb51-8a90-4b22...", // string, UUID оповещения "user_id": 26, // int, ID пользователя "latitude": 55.7558, // float, широта "longitude": 37.6176, // float, долгота "address": "Красная площадь, Москва", // string?, адрес "alert_type": "general", // AlertType, тип оповещения "status": "active", // AlertStatus, статус "message": "Нужна помощь", // string?, описание "is_resolved": false, // bool, решено ли "resolved_at": null, // datetime?, время решения "resolved_notes": null, // string?, заметки о решении "notified_users_count": 5, // int, количество уведомленных пользователей "responded_users_count": 2, // int, количество ответивших пользователей "created_at": "2024-01-15T10:30:00Z", // datetime, время создания "updated_at": "2024-01-15T10:35:00Z", // datetime?, время обновления "user_name": "Test User", // string?, имя пользователя "user_phone": "+1234567890" // string?, телефон пользователя } ``` ### 6. EmergencyResponseCreate Создание ответа на оповещение: ```json { "response_type": "help_on_way", // ResponseType, тип ответа "message": "Еду к вам!", // string?, сообщение (макс 500 символов) "eta_minutes": 15, // int?, предполагаемое время прибытия в минутах (0-240) "location_sharing": true // bool, делиться ли местоположением } ``` ### 7. EmergencyResponseResponse Ответ с данными отклика: ```json { "id": 456, // int, ID отклика "uuid": "8ed4fb51-8a90-4b22...", // string, UUID отклика "alert_id": 123, // int, ID оповещения "user_id": 27, // int, ID откликнувшегося пользователя "response_type": "help_on_way", // ResponseType, тип отклика "message": "Еду к вам!", // string?, сообщение "eta_minutes": 15, // int?, время прибытия "location_sharing": true, // bool, делиться местоположением "created_at": "2024-01-15T10:32:00Z", // datetime, время создания "responder_name": "Helper User", // string?, имя откликнувшегося "responder_phone": "+9876543210" // string?, телефон откликнувшегося } ``` ### 8. EmergencyReportCreate Создание отчета о происшествии: ```json { "latitude": 55.7558, // float, широта (-90 до 90) "longitude": 37.6176, // float, долгота (-180 до 180) "report_type": "violence", // string, тип происшествия "description": "Детальное описание происшествия...", // string, описание (10-1000 символов) "address": "Адрес происшествия", // string?, адрес (макс 500 символов) "is_anonymous": false, // bool, анонимный отчет "severity": 4 // int, серьезность от 1 до 5 } ``` ### 9. EmergencyReportResponse Ответ с данными отчета: ```json { "id": 789, // int, ID отчета "uuid": "8ed4fb51-8a90-4b22...", // string, UUID отчета "user_id": 26, // int?, ID пользователя (null для анонимных) "latitude": 55.7558, // float, широта "longitude": 37.6176, // float, долгота "address": "Красная площадь", // string?, адрес "report_type": "violence", // string, тип происшествия "description": "Описание...", // string, описание "is_anonymous": false, // bool, анонимный ли "severity": 4, // int, серьезность (1-5) "status": "pending", // string, статус (pending/investigating/resolved) "created_at": "2024-01-15T10:45:00Z" // datetime, время создания } ``` ### 10. SafetyCheckCreate Создание отметки безопасности: ```json { "message": "Я в порядке", // string?, сообщение (макс 200 символов) "location_latitude": 55.7558, // float?, широта (-90 до 90) "location_longitude": 37.6176 // float?, долгота (-180 до 180) } ``` ### 11. SafetyCheckResponse Ответ с данными отметки безопасности: ```json { "id": 101, // int, ID отметки "uuid": "8ed4fb51-8a90-4b22...", // string, UUID отметки "user_id": 26, // int, ID пользователя "message": "Я в порядке", // string?, сообщение "location_latitude": 55.7558, // float?, широта "location_longitude": 37.6176, // float?, долгота "created_at": "2024-01-15T11:00:00Z" // datetime, время создания } ``` ### 12. EmergencyStatistics Статистика экстренных ситуаций: ```json { "total_alerts": 150, // int, общее количество оповещений "active_alerts": 12, // int, активные оповещения "resolved_alerts": 138, // int, решенные оповещения "total_responders": 89, // int, общее количество откликнувшихся "avg_response_time_minutes": 8.5 // float, среднее время отклика в минутах } ``` ### 13. NearbyAlertResponse Ближайшие оповещения: ```json { "id": 123, // int, ID оповещения "alert_type": "medical", // string, тип оповещения "latitude": 55.7558, // float, широта "longitude": 37.6176, // float, долгота "address": "Больница №1", // string?, адрес "distance_km": 2.5, // float, расстояние в километрах "created_at": "2024-01-15T09:15:00Z", // datetime, время создания "responded_users_count": 3 // int, количество откликов } ``` --- ## API Endpoints ### 1. Проверка здоровья сервиса **GET** `/health` **Описание:** Проверка статуса работы сервиса **Авторизация:** Не требуется **Ответ:** ```json { "status": "healthy", "service": "emergency_service" } ``` --- ### 2. Создание экстренного оповещения **POST** `/api/v1/alert` **Описание:** Создание нового экстренного оповещения **Авторизация:** Bearer Token **Тело запроса:** `EmergencyAlertCreate` **Пример запроса:** ```bash curl -X POST http://192.168.0.103:8002/api/v1/alert \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{ "latitude": 55.7558, "longitude": 37.6176, "alert_type": "general", "message": "Нужна помощь, подозрительная активность", "address": "Красная площадь, Москва" }' ``` **Успешный ответ:** `200 OK` **Тело ответа:** `EmergencyAlertResponse` --- ### 3. Ответить на оповещение **POST** `/api/v1/alert/{alert_id}/respond` **Описание:** Отправка отклика на экстренное оповещение **Авторизация:** Bearer Token **Параметры URL:** - `alert_id` (int) - ID оповещения **Тело запроса:** `EmergencyResponseCreate` **Пример запроса:** ```bash curl -X POST http://192.168.0.103:8002/api/v1/alert/123/respond \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{ "response_type": "help_on_way", "message": "Еду к вам, буду через 10 минут!", "eta_minutes": 10 }' ``` **Успешный ответ:** `200 OK` **Тело ответа:** `EmergencyResponseResponse` **Ошибки:** - `404` - Оповещение не найдено - `400` - Пользователь уже откликнулся на это оповещение --- ### 4. Решить оповещение **PUT** `/api/v1/alert/{alert_id}/resolve` **Описание:** Помечает оповещение как решенное **Авторизация:** Bearer Token **Параметры URL:** - `alert_id` (int) - ID оповещения **Пример запроса:** ```bash curl -X PUT http://192.168.0.103:8002/api/v1/alert/123/resolve \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Успешный ответ:** `200 OK` ```json { "message": "Alert resolved successfully" } ``` **Ошибки:** - `404` - Оповещение не найдено - `403` - Только создатель может решить оповещение --- ### 5. Обновить оповещение **PUT** `/api/v1/alert/{alert_id}` **Описание:** Обновление существующего оповещения **Авторизация:** Bearer Token **Параметры URL:** - `alert_id` (int) - ID оповещения **Тело запроса:** `EmergencyAlertUpdate` ```json { "status": "resolved", // AlertStatus?, новый статус "message": "Обновленное описание", // string?, новое описание "resolved_notes": "Помощь получена" // string?, заметки о решении } ``` **Успешный ответ:** `200 OK` **Тело ответа:** `EmergencyAlertResponse` --- ### 6. Получить мои оповещения **GET** `/api/v1/alerts/my` **Описание:** Получение оповещений текущего пользователя **Авторизация:** Bearer Token **Пример запроса:** ```bash curl -X GET http://192.168.0.103:8002/api/v1/alerts/my \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Успешный ответ:** `200 OK` **Тело ответа:** `List[EmergencyAlertResponse]` --- ### 7. Получить активные оповещения **GET** `/api/v1/alerts/active` **Описание:** Получение всех активных оповещений **Авторизация:** Bearer Token **Успешный ответ:** `200 OK` **Тело ответа:** `List[EmergencyAlertResponse]` --- ### 8. Получить ближайшие оповещения **GET** `/api/v1/alerts/nearby` **Описание:** Поиск оповещений в указанном радиусе **Авторизация:** Bearer Token **Query параметры:** - `latitude` (float, обязательный) - Широта (-90 до 90) - `longitude` (float, обязательный) - Долгота (-180 до 180) - `radius_km` (float, опциональный) - Радиус поиска в км (по умолчанию 10.0, макс 100.0) **Пример запроса:** ```bash curl -X GET "http://192.168.0.103:8002/api/v1/alerts/nearby?latitude=55.7558&longitude=37.6176&radius_km=5.0" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Успешный ответ:** `200 OK` **Тело ответа:** `List[NearbyAlertResponse]` (отсортированы по расстоянию) --- ### 9. Получить отклики на оповещение **GET** `/api/v1/alert/{alert_id}/responses` **Описание:** Получение всех откликов на конкретное оповещение **Авторизация:** Bearer Token **Параметры URL:** - `alert_id` (int) - ID оповещения **Успешный ответ:** `200 OK` **Тело ответа:** `List[EmergencyResponseResponse]` --- ### 10. Создать отчет о происшествии **POST** `/api/v1/report` **Описание:** Создание отчета о происшествии **Авторизация:** Bearer Token **Тело запроса:** `EmergencyReportCreate` **Пример запроса:** ```bash curl -X POST http://192.168.0.103:8002/api/v1/report \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{ "latitude": 55.7558, "longitude": 37.6176, "report_type": "harassment", "description": "Преследование в районе метро...", "severity": 4, "is_anonymous": false }' ``` **Успешный ответ:** `200 OK` **Тело ответа:** `EmergencyReportResponse` --- ### 11. Получить отчеты **GET** `/api/v1/reports` **Описание:** Получение списка отчетов о происшествиях **Авторизация:** Bearer Token **Успешный ответ:** `200 OK` **Тело ответа:** `List[EmergencyReportResponse]` --- ### 12. Создать отметку безопасности **POST** `/api/v1/safety-check` **Описание:** Отметка о том, что пользователь в безопасности **Авторизация:** Bearer Token **Тело запроса:** `SafetyCheckCreate` **Пример запроса:** ```bash curl -X POST http://192.168.0.103:8002/api/v1/safety-check \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{ "message": "Добрался домой, все хорошо", "location_latitude": 55.7558, "location_longitude": 37.6176 }' ``` **Успешный ответ:** `200 OK` **Тело ответа:** `SafetyCheckResponse` --- ### 13. Получить отметки безопасности **GET** `/api/v1/safety-checks` **Описание:** Получение отметок безопасности пользователя **Авторизация:** Bearer Token **Успешный ответ:** `200 OK` **Тело ответа:** `List[SafetyCheckResponse]` --- ### 14. Получить статистику **GET** `/api/v1/stats` **Описание:** Получение статистики по экстренным ситуациям **Авторизация:** Bearer Token **Пример запроса:** ```bash curl -X GET http://192.168.0.103:8002/api/v1/stats \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Успешный ответ:** `200 OK` **Тело ответа:** `EmergencyStatistics` --- ## Коды ошибок ### Общие ошибки - `400 Bad Request` - Неверные данные в запросе - `401 Unauthorized` - Требуется авторизация - `403 Forbidden` - Недостаточно прав - `404 Not Found` - Ресурс не найден - `422 Unprocessable Entity` - Ошибка валидации данных - `500 Internal Server Error` - Внутренняя ошибка сервера ### Специфические ошибки - `400` - "You have already responded to this alert" (при повторном отклике) - `403` - "Only alert creator can resolve/update the alert" (при попытке изменения чужого оповещения) - `404` - "Alert not found" (оповещение не найдено) --- ## Примеры интеграции с мобильным приложением ### 1. Создание экстренного оповещения ```javascript const createEmergencyAlert = async (alertData) => { const response = await fetch('http://192.168.0.103:8002/api/v1/alert', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${userToken}` }, body: JSON.stringify({ latitude: alertData.latitude, longitude: alertData.longitude, alert_type: alertData.type || 'general', message: alertData.message, address: alertData.address }) }); return await response.json(); }; ``` ### 2. Получение ближайших оповещений ```javascript const getNearbyAlerts = async (latitude, longitude, radiusKm = 10) => { const params = new URLSearchParams({ latitude: latitude.toString(), longitude: longitude.toString(), radius_km: radiusKm.toString() }); const response = await fetch( `http://192.168.0.103:8002/api/v1/alerts/nearby?${params}`, { headers: { 'Authorization': `Bearer ${userToken}` } } ); return await response.json(); }; ``` ### 3. Отклик на оповещение ```javascript const respondToAlert = async (alertId, responseData) => { const response = await fetch( `http://192.168.0.103:8002/api/v1/alert/${alertId}/respond`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${userToken}` }, body: JSON.stringify({ response_type: responseData.type, message: responseData.message, eta_minutes: responseData.etaMinutes }) } ); return await response.json(); }; ``` --- ## Дополнительные возможности ### WebSocket подключения (планируется) Для получения уведомлений в реальном времени о новых оповещениях и откликах. ### Push уведомления API интегрируется с Notification Service для отправки push уведомлений на мобильные устройства. ### Геолокация Все координаты используют WGS84 (стандарт GPS). Расстояния вычисляются по формуле гаверсинусов. ### Безопасность - Все данные о местоположении шифруются - Анонимные отчеты не содержат идентификационных данных - JWT токены имеют ограниченный срок действия