Corp/API_REFACTORING_TESTING.md

5.6 KiB
Raw Blame History

Рефакторинг 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. Проверка работы календаря

# На сервере
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 (кеш + дедупликация)
  • Повторная загрузка: мгновенная (кеш)

🐛 Отладка

Проверить статистику кеша:

// В консоли браузера
window.dataManager.getStats()
// → {cacheSize: 5, pendingCount: 0, subscribersCount: 0, keys: [...]}

Очистить кеш вручную:

window.dataManager.clear()

Инвалидировать конкретные данные:

// Календарь
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 запрос:

# 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 (один экземпляр на всё приложение)
  • Дедупликация работает только для одновременных запросов