feat: Fix nutrition service and add location-based alerts
All checks were successful
continuous-integration/drone/push Build is passing

Changes:
- Fix nutrition service: add is_active column and Pydantic validation for UUID/datetime
- Add location-based alerts feature: users can now see alerts within 1km radius
- Fix CORS and response serialization in nutrition service
- Add getCurrentLocation() and loadAlertsNearby() functions
- Improve UI for nearby alerts display with distance and response count
This commit is contained in:
2025-12-13 16:34:50 +09:00
parent 3050e084fa
commit cfc93cb99a
34 changed files with 7016 additions and 17 deletions

216
WS_SOS_QUICKSTART.md Normal file
View File

@@ -0,0 +1,216 @@
# 🚀 WebSocket SOS - Быстрый Старт
## ⚡ Самый быстрый способ протестировать
### 1⃣ Запустить сервисы (если еще не запущены)
```bash
cd /home/trevor/dev/chat
# Терминал 1
python -m services.user_service.main
# Терминал 2
python -m services.emergency_service.main
```
### 2⃣ Запустить тест (занимает ~20 секунд)
```bash
python test_ws_quick.py
```
### ✅ Результат
```
✅ Token obtained
✅ WebSocket connected
✅ Ping/pong working
✅ WebSocket connection test completed successfully!
```
---
## 📝 Тестовые учетные данные
| Параметр | Значение |
|----------|----------|
| Email | wstester@test.com |
| Password | WsTest1234! |
| User ID | 51 |
---
## 🔗 WebSocket URL
```
ws://localhost:8002/api/v1/emergency/ws/51?token={JWT_TOKEN}
```
### Как получить JWT_TOKEN
```bash
curl -X POST http://localhost:8001/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"wstester@test.com","password":"WsTest1234!"}'
```
Скопируйте значение `access_token` из ответа.
---
## 💬 Примеры сообщений
### Подключение (отправляется сервером)
```json
{
"type": "connection_established",
"message": "WebSocket connection established successfully",
"user_id": 51,
"timestamp": "2025-12-13T14:15:14.982894"
}
```
### Ping (отправьте клиент)
```json
{"type": "ping"}
```
### Pong (ответ сервера)
```json
{"type": "pong"}
```
### SOS Alert (отправляется сервером при создании оповещения)
```json
{
"type": "emergency_alert",
"alert_id": 123,
"alert_type": "SOS",
"latitude": 55.7558,
"longitude": 37.6173,
"address": "Location (55.7558, 37.6173)",
"message": "Экстренная ситуация!",
"created_at": "2025-12-13T14:15:20.123456",
"distance_km": 0.5
}
```
---
## 🔧 Тестовые скрипты
### test_ws_quick.py - Базовый тест
```bash
python test_ws_quick.py
```
**Что проверяет:**
- ✅ Получение JWT токена
- ✅ Подключение WebSocket
- ✅ Ping/Pong
- ✅ Слушание сообщений (30 сек)
**Время:** ~30 секунд
---
### register_test_user.py - Создание пользователя
```bash
python register_test_user.py
```
**Что делает:**
- ✅ Регистрирует нового тестового пользователя
- ✅ Получает JWT токен
- ✅ Выводит готовый WebSocket URL
---
### test_ws_full.py - Полное тестирование
```bash
python test_ws_full.py
```
**Что проверяет:**
- ✅ Аутентификация
- ✅ WebSocket подключение
- ✅ Создание SOS оповещения
- ✅ Получение уведомления
- ✅ Множественные клиенты
**Время:** ~1-2 минуты
---
## 🎯 Статус работоспособности
| Функция | Статус |
|---------|--------|
| WebSocket подключение | ✅ OK |
| Аутентификация | ✅ OK |
| Ping/Pong | ✅ OK |
| Создание SOS | ✅ OK |
| Получение уведомлений | ✅ OK |
| Broadcast | ✅ OK |
---
## 📊 Посмотреть статистику
### Все активные соединения
```bash
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8002/api/v1/websocket/stats
```
### Детальная информация
```bash
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8002/api/v1/websocket/connections
```
### Пинг всех подключений
```bash
curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8002/api/v1/websocket/ping
```
---
## 🐛 Решение проблем
### Проблема: WebSocket не подключается
```
Решение:
1. Проверьте JWT токен (не истек ли)
2. Убедитесь в правильности user_id
3. Проверьте что Emergency Service запущена на 8002
```
### Проблема: Плохое соединение
```
Решение:
1. Проверьте интернет (локальное тестирование)
2. Посмотрите логи сервиса
3. Попробуйте переподключиться
```
### Проблема: Нет уведомлений о SOS
```
Решение:
1. Убедитесь что Location Service запущена
2. Проверьте что пользователи находятся в радиусе 1-2 км
3. Убедитесь что пользователи подключены к WebSocket
```
---
## 📚 Дополнительная информация
### Подробные отчеты:
- [WS_SOS_FINAL_REPORT.md](./docs/WS_SOS_FINAL_REPORT.md) - Полный технический отчет
- [WS_SOS_TEST_REPORT.md](./docs/WS_SOS_TEST_REPORT.md) - Результаты тестирования
### Исходный код:
- `/home/trevor/dev/chat/services/emergency_service/main.py` - WebSocket сервис
- Класс `WebSocketManager` (строка ~96)
- Endpoint `websocket_endpoint()` (строка ~393)
---
**Последнее обновление:** 13 декабря 2025
**Статус:**Все работает!