Добавлена документация по тестированию рефакторинга API
This commit is contained in:
parent
38c4d3aeab
commit
9766004e83
156
API_REFACTORING_TESTING.md
Normal file
156
API_REFACTORING_TESTING.md
Normal file
@ -0,0 +1,156 @@
|
||||
# Рефакторинг API запросов - Инструкция по тестированию
|
||||
|
||||
## ✅ Что было сделано
|
||||
|
||||
### Проблема
|
||||
При переходе на главную страницу выполнялось **10+ дублирующихся API запросов**:
|
||||
- `/api/v1/departments/my-departments/` - **3 раза** (!!!)
|
||||
- `/api/v1/calendar/events/?start=...&end=...` - **2-3 раза** для каждого периода
|
||||
|
||||
### Решение
|
||||
Создана система централизованного управления данными с кешированием и дедупликацией:
|
||||
|
||||
1. **DataManager** - умный менеджер данных
|
||||
- Кеширование с TTL (Time To Live)
|
||||
- Дедупликация одновременных запросов
|
||||
- Система подписки на изменения
|
||||
- Логирование для отладки
|
||||
|
||||
2. **API обертки**:
|
||||
- `calendarApi.js` - события календаря (TTL 30 сек)
|
||||
- `departmentsApi.js` - отделы пользователя (TTL 60 сек)
|
||||
|
||||
3. **Рефакторинг calendarWidget.js**:
|
||||
- Заменены прямые `fetch()` на API обертки
|
||||
- Автоматическое переиспользование данных между виджетами
|
||||
|
||||
## 🧪 Тестирование
|
||||
|
||||
### 1. Проверка работы календаря
|
||||
|
||||
```bash
|
||||
# На сервере
|
||||
cd /home/igor/EUSRR
|
||||
git pull origin master
|
||||
sudo systemctl restart eusrr
|
||||
```
|
||||
|
||||
### 2. Откройте DevTools в браузере
|
||||
|
||||
1. **Открыть главную страницу** (`/`)
|
||||
2. **F12 → вкладка Network**
|
||||
3. **Очистить** (кнопка 🚫)
|
||||
4. **Обновить страницу** (F5)
|
||||
|
||||
**Ожидаемый результат:**
|
||||
- `/api/v1/departments/my-departments/` - **1 раз** (было 3)
|
||||
- `/api/v1/calendar/events/?start=...` - **1 раз на период** (было 2-3)
|
||||
|
||||
### 3. Проверка кеширования
|
||||
|
||||
1. **Вкладка Console в DevTools**
|
||||
2. **Обновите страницу** (F5)
|
||||
3. Ищите логи:
|
||||
```
|
||||
[DataManager] Fetching: departments:my
|
||||
[DataManager] Fetching: calendar:events:{"end":"...","start":"..."}
|
||||
```
|
||||
|
||||
4. **Переключите календарь** (Компания → Отдел → Компания)
|
||||
5. Ищите логи:
|
||||
```
|
||||
[DataManager] Cache HIT: calendar:events:{"end":"...","start":"..."}
|
||||
```
|
||||
|
||||
### 4. Проверка дедупликации
|
||||
|
||||
1. **Console в DevTools**
|
||||
2. **Быстро несколько раз** переключите календарь
|
||||
3. Ищите логи:
|
||||
```
|
||||
[DataManager] Request DEDUPED: calendar:events:...
|
||||
```
|
||||
|
||||
## 📊 Метрики до/после
|
||||
|
||||
### ДО рефакторинга:
|
||||
- **API запросов:** ~10-15
|
||||
- **Дублирования:** 3-4x для departments, 2-3x для calendar
|
||||
- **Время загрузки:** зависит от сети
|
||||
|
||||
### ПОСЛЕ рефакторинга:
|
||||
- **API запросов:** 3-5 (первая загрузка)
|
||||
- **Дублирования:** 0 (кеш + дедупликация)
|
||||
- **Повторная загрузка:** мгновенная (кеш)
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
### Проверить статистику кеша:
|
||||
|
||||
```javascript
|
||||
// В консоли браузера
|
||||
window.dataManager.getStats()
|
||||
// → {cacheSize: 5, pendingCount: 0, subscribersCount: 0, keys: [...]}
|
||||
```
|
||||
|
||||
### Очистить кеш вручную:
|
||||
|
||||
```javascript
|
||||
window.dataManager.clear()
|
||||
```
|
||||
|
||||
### Инвалидировать конкретные данные:
|
||||
|
||||
```javascript
|
||||
// Календарь
|
||||
window.dataManager.invalidatePattern(/^calendar:/)
|
||||
|
||||
// Отделы
|
||||
window.dataManager.invalidate('departments:my')
|
||||
```
|
||||
|
||||
## ⚠️ Возможные проблемы
|
||||
|
||||
### 1. "Старые данные в календаре"
|
||||
**Причина:** Долгий TTL кеша (30 сек)
|
||||
**Решение:** Уменьшить TTL в `calendarApi.js` или добавить кнопку "Обновить"
|
||||
|
||||
### 2. "Календарь не загружается"
|
||||
**Причина:** Ошибка в импортах модулей
|
||||
**Решение:** Проверить консоль на ошибки импорта
|
||||
|
||||
### 3. "Лог 'Cache HIT' не появляется"
|
||||
**Причина:** Слишком короткий TTL или кеш очищается
|
||||
**Решение:** Проверить `dataManager.getStats()` в консоли
|
||||
|
||||
## 🚀 Следующие шаги
|
||||
|
||||
### Приоритет 2: Расширить кеширование
|
||||
|
||||
Добавить обертки для других API:
|
||||
- `notificationsApi.js` - уведомления
|
||||
- `postsApi.js` - посты ленты
|
||||
- `employeesApi.js` - сотрудники
|
||||
|
||||
### Приоритет 3: Batch API
|
||||
|
||||
Создать endpoint для загрузки нескольких периодов календаря за 1 запрос:
|
||||
|
||||
```python
|
||||
# backend/api/v1/views.py
|
||||
class BatchCalendarEventsView(APIView):
|
||||
def post(self, request):
|
||||
ranges = request.data.get('ranges', [])
|
||||
result = {}
|
||||
for r in ranges:
|
||||
key = f"{r['start']}_{r['end']}"
|
||||
result[key] = get_events(r['start'], r['end'])
|
||||
return Response(result)
|
||||
```
|
||||
|
||||
## 📝 Заметки
|
||||
|
||||
- Кеш хранится **в памяти** (очищается при перезагрузке страницы)
|
||||
- TTL можно настроить для каждого запроса
|
||||
- DataManager работает как singleton (один экземпляр на всё приложение)
|
||||
- Дедупликация работает только для **одновременных** запросов
|
||||
Loading…
x
Reference in New Issue
Block a user