# Запросы для тестирования API приложения для безопасности женщин

В этом файле собраны примеры всех API-запросов для тестирования серверной части микросервисного приложения.

## Содержание
- [Общие запросы](#общие-запросы)
- [Сервис пользователей (User Service)](#сервис-пользователей-user-service)
- [Сервис экстренной помощи (Emergency Service)](#сервис-экстренной-помощи-emergency-service)
- [Сервис геолокации (Location Service)](#сервис-геолокации-location-service)
- [Сервис календаря (Calendar Service)](#сервис-календаря-calendar-service)
- [Сервис уведомлений (Notification Service)](#сервис-уведомлений-notification-service)
- [API Gateway](#api-gateway)

## Общие запросы

### Проверка доступности всех сервисов

```bash
# Проверка API Gateway
curl -s http://localhost:8000/health | jq

# Проверка User Service
curl -s http://localhost:8001/health | jq

# Проверка Emergency Service
curl -s http://localhost:8002/health | jq

# Проверка Location Service
curl -s http://localhost:8003/health | jq

# Проверка Calendar Service
curl -s http://localhost:8004/health | jq

# Проверка Notification Service
curl -s http://localhost:8005/health | jq

# Альтернативные endpoint health
curl -s http://localhost:8000/api/v1/health | jq
curl -s http://localhost:8001/api/v1/health | jq
curl -s http://localhost:8002/api/v1/health | jq
curl -s http://localhost:8003/api/v1/health | jq
curl -s http://localhost:8004/api/v1/health | jq
curl -s http://localhost:8005/api/v1/health | jq
```

## Сервис пользователей (User Service)

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

```bash
curl -X POST http://localhost:8001/api/v1/users/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "usertest1",
    "email": "user1@example.com",
    "password": "SecurePass123!",
    "full_name": "Тест Пользователь",
    "phone_number": "+79001234567"
  }' | jq
```

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

```bash
curl -X POST http://localhost:8001/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "usertest1",
    "password": "SecurePass123!"
  }' | jq

# Сохраните полученный токен в переменную для дальнейшего использования
# TOKEN=$(curl -s -X POST http://localhost:8001/api/v1/auth/login -H "Content-Type: application/json" -d '{"username": "usertest1", "password": "SecurePass123!"}' | jq -r '.access_token')
```

### Получение информации о текущем пользователе

```bash
curl -X GET http://localhost:8001/api/v1/users/me \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Обновление профиля пользователя

```bash
curl -X PATCH http://localhost:8001/api/v1/users/me \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "full_name": "Новое Имя Пользователя",
    "phone_number": "+79009876543"
  }' | jq
```

### Добавление контактов для экстренной связи

```bash
curl -X POST http://localhost:8001/api/v1/users/me/emergency-contacts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "Контакт для экстренной связи",
    "phone_number": "+79001112233",
    "relationship": "Друг"
  }' | jq
```

### Получение списка контактов для экстренной связи

```bash
curl -X GET http://localhost:8001/api/v1/users/me/emergency-contacts \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Удаление контакта для экстренной связи

```bash
# Замените {contact_id} на реальный ID контакта
curl -X DELETE http://localhost:8001/api/v1/users/me/emergency-contacts/{contact_id} \
  -H "Authorization: Bearer $TOKEN"
```

### Изменение пароля

```bash
curl -X POST http://localhost:8001/api/v1/users/me/change-password \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "current_password": "SecurePass123!",
    "new_password": "NewSecurePass456!"
  }' | jq
```

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

### Отправка сигнала SOS

```bash
curl -X POST http://localhost:8002/api/v1/emergency/alerts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "alert_type": "SOS",
    "message": "Нужна срочная помощь!"
  }' | jq

# Сохраните ID созданного оповещения для дальнейших действий
# ALERT_ID=$(curl -s -X POST http://localhost:8002/api/v1/emergency/alerts -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{"latitude": 55.7558, "longitude": 37.6173, "alert_type": "SOS", "message": "Нужна срочная помощь!"}' | jq -r '.id')
```

### Получение активных оповещений пользователя

```bash
curl -X GET http://localhost:8002/api/v1/emergency/alerts/my \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Отмена сигнала SOS

```bash
# Замените {alert_id} на ID полученного ранее оповещения
curl -X PATCH http://localhost:8002/api/v1/emergency/alerts/{alert_id}/cancel \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Получение списка ближайших оповещений (для волонтеров/служб)

```bash
curl -X GET "http://localhost:8002/api/v1/emergency/alerts/nearby?latitude=55.7558&longitude=37.6173&radius=1.0" \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Отправка отчета о происшествии

```bash
curl -X POST http://localhost:8002/api/v1/emergency/reports \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "report_type": "UNSAFE_AREA",
    "description": "Тёмная улица без освещения",
    "severity_level": "MEDIUM"
  }' | jq
```

### Получение списка отчетов о происшествиях в определенном радиусе

```bash
curl -X GET "http://localhost:8002/api/v1/emergency/reports/nearby?latitude=55.7558&longitude=37.6173&radius=5.0" \
  -H "Authorization: Bearer $TOKEN" | jq
```

## Сервис геолокации (Location Service)

### Обновление местоположения пользователя

```bash
curl -X POST http://localhost:8003/api/v1/locations/update \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "accuracy": 10.0
  }' | jq
```

### Получение последнего известного местоположения пользователя

```bash
curl -X GET http://localhost:8003/api/v1/locations/last \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Получение истории перемещений пользователя

```bash
curl -X GET "http://localhost:8003/api/v1/locations/history?start_date=2025-09-20T00:00:00Z&end_date=2025-09-25T23:59:59Z" \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Получение списка безопасных мест поблизости

```bash
curl -X GET "http://localhost:8003/api/v1/locations/safe-places?latitude=55.7558&longitude=37.6173&radius=1.0" \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Добавление безопасного места

```bash
curl -X POST http://localhost:8003/api/v1/locations/safe-places \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "Полицейский участок",
    "latitude": 55.7559,
    "longitude": 37.6174,
    "place_type": "POLICE",
    "description": "Центральный полицейский участок"
  }' | jq
```

### Поиск пользователей в определенном радиусе (для экстренных ситуаций)

```bash
curl -X GET "http://localhost:8003/api/v1/locations/users/nearby?latitude=55.7558&longitude=37.6173&radius=0.5" \
  -H "Authorization: Bearer $TOKEN" | jq
```

## Сервис календаря (Calendar Service)

### Создание записи в календаре

```bash
curl -X POST http://localhost:8004/api/v1/calendar/entries \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "entry_date": "2025-10-01",
    "cycle_day": 1,
    "symptoms": ["HEADACHE", "FATIGUE"],
    "mood": "NORMAL",
    "notes": "Начало цикла"
  }' | jq
```

### Получение записей календаря за период

```bash
curl -X GET "http://localhost:8004/api/v1/calendar/entries?start_date=2025-09-01&end_date=2025-10-31" \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Обновление записи в календаре

```bash
# Замените {entry_id} на реальный ID записи
curl -X PATCH http://localhost:8004/api/v1/calendar/entries/{entry_id} \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "symptoms": ["HEADACHE", "FATIGUE", "BLOATING"],
    "mood": "IRRITABLE",
    "notes": "Обновленная запись"
  }' | jq
```

### Получение статистики и прогнозов

```bash
curl -X GET http://localhost:8004/api/v1/calendar/statistics \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Получение прогноза следующего цикла

```bash
curl -X GET http://localhost:8004/api/v1/calendar/predictions/next-cycle \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Настройка параметров календаря

```bash
curl -X POST http://localhost:8004/api/v1/calendar/settings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "average_cycle_length": 28,
    "average_period_length": 5,
    "notification_enabled": true,
    "notification_days_before": 2
  }' | jq
```

### Получение настроек календаря

```bash
curl -X GET http://localhost:8004/api/v1/calendar/settings \
  -H "Authorization: Bearer $TOKEN" | jq
```

## Сервис уведомлений (Notification Service)

### Регистрация устройства для Push-уведомлений

```bash
curl -X POST http://localhost:8005/api/v1/notifications/devices \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "device_token": "fcm-token-example-123456",
    "device_type": "ANDROID",
    "app_version": "1.0.0"
  }' | jq
```

### Получение списка зарегистрированных устройств

```bash
curl -X GET http://localhost:8005/api/v1/notifications/devices \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Удаление регистрации устройства

```bash
# Замените {device_id} на реальный ID устройства
curl -X DELETE http://localhost:8005/api/v1/notifications/devices/{device_id} \
  -H "Authorization: Bearer $TOKEN"
```

### Настройка предпочтений уведомлений

```bash
curl -X POST http://localhost:8005/api/v1/notifications/preferences \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "emergency_alerts": true,
    "nearby_incidents": true,
    "calendar_reminders": true,
    "system_notifications": true
  }' | jq
```

### Получение настроек уведомлений

```bash
curl -X GET http://localhost:8005/api/v1/notifications/preferences \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Отправка тестового уведомления (только для тестирования)

```bash
curl -X POST http://localhost:8005/api/v1/notifications/test \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "title": "Тестовое уведомление",
    "body": "Это тестовое push-уведомление",
    "data": {
      "type": "TEST",
      "action": "OPEN_APP"
    }
  }' | jq
```

### Получение истории уведомлений

```bash
curl -X GET http://localhost:8005/api/v1/notifications/history \
  -H "Authorization: Bearer $TOKEN" | jq
```

## API Gateway

### Проверка статуса всех сервисов через Gateway

```bash
curl -X GET http://localhost:8000/api/v1/status \
  -H "Authorization: Bearer $TOKEN" | jq
```

### Регистрация через Gateway

```bash
curl -X POST http://localhost:8000/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "gatewayuser",
    "email": "gateway@example.com",
    "password": "GatewayPass123!",
    "full_name": "Gateway Test User",
    "phone_number": "+79991234567"
  }' | jq
```

### Авторизация через Gateway

```bash
curl -X POST http://localhost:8000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "gatewayuser",
    "password": "GatewayPass123!"
  }' | jq

# Сохраните полученный токен в переменную для дальнейшего использования
# GW_TOKEN=$(curl -s -X POST http://localhost:8000/api/v1/auth/login -H "Content-Type: application/json" -d '{"username": "gatewayuser", "password": "GatewayPass123!"}' | jq -r '.access_token')
```

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

```bash
curl -X POST http://localhost:8000/api/v1/emergency/alerts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $GW_TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "alert_type": "SOS",
    "message": "Тестовое экстренное оповещение через Gateway"
  }' | jq
```

### Комплексный запрос данных пользователя через Gateway

```bash
curl -X GET http://localhost:8000/api/v1/users/dashboard \
  -H "Authorization: Bearer $GW_TOKEN" | jq
```

## Bash скрипт для полного тестирования API

Создайте файл `full_api_test.sh` со следующим содержимым:

```bash
#!/bin/bash

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${YELLOW}=======================================${NC}"
echo -e "${YELLOW}🔍 Полное тестирование API приложения ${NC}"
echo -e "${YELLOW}=======================================${NC}"

# 1. Проверка доступности сервисов
echo -e "\n${GREEN}1. Проверка доступности сервисов${NC}"

services=(
  "http://localhost:8000"
  "http://localhost:8001"
  "http://localhost:8002"
  "http://localhost:8003"
  "http://localhost:8004"
  "http://localhost:8005"
)

service_names=(
  "API Gateway"
  "User Service"
  "Emergency Service"
  "Location Service"
  "Calendar Service"
  "Notification Service"
)

for i in ${!services[@]}; do
  echo -n "Проверка ${service_names[$i]} (${services[$i]})... "
  if curl -s "${services[$i]}/health" | grep -q "status.*healthy" || curl -s "${services[$i]}/api/v1/health" | grep -q "status.*healthy"; then
    echo -e "${GREEN}OK${NC}"
  else
    echo -e "${RED}НЕДОСТУПНО${NC}"
    echo "Продолжение тестирования может вызвать ошибки. Хотите продолжить? (y/n)"
    read continue_test
    if [[ $continue_test != "y" ]]; then
      exit 1
    fi
  fi
done

# 2. Регистрация и авторизация
echo -e "\n${GREEN}2. Регистрация и авторизация${NC}"

echo "Регистрация тестового пользователя..."
REGISTER_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/users/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "apitest",
    "email": "apitest@example.com",
    "password": "ApiTest123!",
    "full_name": "API Test User",
    "phone_number": "+79997776655"
  }')

echo $REGISTER_RESPONSE | jq

# Авторизация
echo "Авторизация тестового пользователя..."
LOGIN_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "apitest",
    "password": "ApiTest123!"
  }')

echo $LOGIN_RESPONSE | jq

TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.access_token')
if [[ $TOKEN == "null" || -z $TOKEN ]]; then
  echo -e "${RED}Не удалось получить токен авторизации. Тестирование будет остановлено.${NC}"
  exit 1
else
  echo -e "${GREEN}Успешно получен токен авторизации${NC}"
fi

# 3. Обновление профиля
echo -e "\n${GREEN}3. Обновление профиля пользователя${NC}"
curl -s -X PATCH http://localhost:8001/api/v1/users/me \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "full_name": "Обновленное Имя",
    "phone_number": "+79997776655"
  }' | jq

# 4. Добавление контактов экстренной связи
echo -e "\n${GREEN}4. Добавление контакта для экстренной связи${NC}"
CONTACT_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/users/me/emergency-contacts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "Экстренный контакт",
    "phone_number": "+79991112233",
    "relationship": "Родственник"
  }')

echo $CONTACT_RESPONSE | jq

CONTACT_ID=$(echo $CONTACT_RESPONSE | jq -r '.id')

# 5. Получение списка контактов
echo -e "\n${GREEN}5. Получение списка экстренных контактов${NC}"
curl -s -X GET http://localhost:8001/api/v1/users/me/emergency-contacts \
  -H "Authorization: Bearer $TOKEN" | jq

# 6. Обновление местоположения пользователя
echo -e "\n${GREEN}6. Обновление местоположения пользователя${NC}"
curl -s -X POST http://localhost:8003/api/v1/locations/update \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "accuracy": 10.0
  }' | jq

# 7. Получение последнего местоположения
echo -e "\n${GREEN}7. Получение последнего местоположения${NC}"
curl -s -X GET http://localhost:8003/api/v1/locations/last \
  -H "Authorization: Bearer $TOKEN" | jq

# 8. Создание экстренного оповещения
echo -e "\n${GREEN}8. Создание экстренного оповещения${NC}"
ALERT_RESPONSE=$(curl -s -X POST http://localhost:8002/api/v1/emergency/alerts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "latitude": 55.7558,
    "longitude": 37.6173,
    "alert_type": "SOS",
    "message": "Тестовое экстренное оповещение"
  }')

echo $ALERT_RESPONSE | jq

ALERT_ID=$(echo $ALERT_RESPONSE | jq -r '.id')

# 9. Получение активных оповещений
echo -e "\n${GREEN}9. Получение активных оповещений пользователя${NC}"
curl -s -X GET http://localhost:8002/api/v1/emergency/alerts/my \
  -H "Authorization: Bearer $TOKEN" | jq

# 10. Отмена экстренного оповещения
if [[ $ALERT_ID != "null" && -n $ALERT_ID ]]; then
  echo -e "\n${GREEN}10. Отмена экстренного оповещения${NC}"
  curl -s -X PATCH http://localhost:8002/api/v1/emergency/alerts/$ALERT_ID/cancel \
    -H "Authorization: Bearer $TOKEN" | jq
fi

# 11. Создание записи в календаре
echo -e "\n${GREEN}11. Создание записи в календаре${NC}"
CALENDAR_RESPONSE=$(curl -s -X POST http://localhost:8004/api/v1/calendar/entries \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "entry_date": "2025-10-01",
    "cycle_day": 1,
    "symptoms": ["HEADACHE", "FATIGUE"],
    "mood": "NORMAL",
    "notes": "Тестовая запись в календаре"
  }')

echo $CALENDAR_RESPONSE | jq

# 12. Получение записей календаря
echo -e "\n${GREEN}12. Получение записей календаря${NC}"
curl -s -X GET "http://localhost:8004/api/v1/calendar/entries?start_date=2025-09-01&end_date=2025-10-31" \
  -H "Authorization: Bearer $TOKEN" | jq

# 13. Регистрация устройства для уведомлений
echo -e "\n${GREEN}13. Регистрация устройства для уведомлений${NC}"
DEVICE_RESPONSE=$(curl -s -X POST http://localhost:8005/api/v1/notifications/devices \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "device_token": "fcm-test-token-123",
    "device_type": "ANDROID",
    "app_version": "1.0.0"
  }')

echo $DEVICE_RESPONSE | jq

# 14. Настройка предпочтений уведомлений
echo -e "\n${GREEN}14. Настройка предпочтений уведомлений${NC}"
curl -s -X POST http://localhost:8005/api/v1/notifications/preferences \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "emergency_alerts": true,
    "nearby_incidents": true,
    "calendar_reminders": true,
    "system_notifications": true
  }' | jq

# 15. Получение данных пользователя через Gateway
echo -e "\n${GREEN}15. Получение данных пользователя через Gateway${NC}"
curl -s -X GET http://localhost:8000/api/v1/users/dashboard \
  -H "Authorization: Bearer $TOKEN" | jq

echo -e "\n${YELLOW}=======================================${NC}"
echo -e "${GREEN}✅ Тестирование API завершено успешно${NC}"
echo -e "${YELLOW}=======================================${NC}"
```

## Использование Bash скрипта для полного тестирования API

Для запуска скрипта выполните следующие команды:

```bash
chmod +x full_api_test.sh
./full_api_test.sh
```