Skip to content

Изменение API DashboardService #14

@oveeernight

Description

@oveeernight

Изменение API DashboardService: лидерборд и консолидация аналитических запросов

Суть изменений

  1. Добавить «Лидерборд агентов» — новый эндпоинт Top Agents для витрины продаж и геймификации.
  2. Провести унификацию аналитических запросов (Total Sales, Agents Sales, Sales Trends):
    • перевести с POST на GET для кэшируемых, идемпотентных чтений;
    • упростить и стандартизировать структуру ответов под сценарии дашборда и внешних интеграций.

Это улучшит совместимость с API-шлюзом и CDN, ускорит ответы и упростит интеграцию BI-инструментов. Изменения содержат breaking change и намеренно затрагивают текущие E2E-тесты.

Бизнес-ценность

  • Прозрачная витрина эффективности агентов (мотивация, конкуренция, фокус на результат).
  • Снижение латентности и стоимости за счет кэширования GET-запросов на шлюзе и CDN.
  • Стандартизированные ответы: проще подключать дашборды, смартфонные виджеты, внешние отчеты.
  • Готовность к масштабированию трафика на чтение без нагрузки на бекенд (edge caching).

Изменение 1: Новый эндпоинт «Top Agents» (не ломающий)

  • Метод: GET
  • Путь: /api/Dashboard/top-agents
  • Назначение: вернуть рейтинг агентов за период с опциональной фильтрацией по продукту, сортировкой и пагинацией.
  • Параметры (query): productCode?, salesDateFrom, salesDateTo, sortBy=premiumAmount|policiesCount (default=premiumAmount), order=asc|desc (default=desc), limit (1..100, default=10), offset (>=0, default=0).
  • Ответ (JSON):
    • total — общее число агентов, подходящих под фильтр;
    • items[] — элементы рейтинга: rank, agentLogin, sales { policiesCount, premiumAmount }.

Пример использования: топ-5 агентов по количеству полисов за квартал для витрины в веб-клиенте и push-виджета для мобильного приложения.

Изменение 2: Унификация текущих аналитических эндпоинтов (ломающий блок)

Что меняется и почему:

  • Перевод на GET повышает кэшируемость и снижает задержки в сценариях чтения.
  • Единообразные поля в ответах помогают фронтендам и интеграциям проще переиспользовать компоненты.

Затрагиваемые эндпоинты и контракты:

  1. Total Sales

    • Было: POST /api/Dashboard/total-sales, тело: { salesDateFrom, salesDateTo }, ответ: { total { policiesCount, premiumAmount }, perProductTotal { [code]: SalesDto } }
    • Стало: GET /api/Dashboard/total-sales?salesDateFrom=...&salesDateTo=...
      Ответ: { overall: { policiesCount, premiumAmount }, byProduct: [{ productCode, sales: { policiesCount, premiumAmount } }] }
  2. Agents Sales

    • Было: POST /api/Dashboard/agents-sales, тело: { agentLogin?, productCode?, salesDateFrom, salesDateTo }, ответ: { perAgentTotal: { [agentLogin]: SalesDto } }
    • Стало: GET /api/Dashboard/agents-sales?salesDateFrom=...&salesDateTo=...&agentLogin=...&productCode=...
      Ответ: { items: [{ agentLogin, sales: { policiesCount, premiumAmount } }] }
  3. Sales Trends

    • Было: POST /api/Dashboard/sales-trends, тело: { productCode?, salesDateFrom, salesDateTo, unit }, ответ: { periodsSales: [{ periodDate, period, sales }] }
    • Стало: GET /api/Dashboard/sales-trends?salesDateFrom=...&salesDateTo=...&productCode=...&unit=Day|Week|Month|Quarter
      Ответ: { periods: [{ date, label, sales: { policiesCount, premiumAmount } }] }

Ключевые несовместимости (breaking change):

  • Методы запросов: POST -> GET.
  • Параметры переносятся из тела запроса в query-параметры.
  • Переименование полей в ответах:
    • total -> overall (Total Sales), perProductTotal -> byProduct (массив объектов);
    • perAgentTotal (map) -> items (массив пар agentLogin + sales);
    • periodsSales -> periods; periodDate -> date; period -> label.

Влияние на существующие E2E-тесты

Следующие тесты в DashboardService.E2ETest ожидаемо перестанут проходить до внесения изменений в тесты/код:

  • PolicyServiceToDashboardServiceIntegrationTest.PolicyCreation_Should_UpdateDashboardAnalytics
    • Делает POST на /api/Dashboard/total-sales и /api/Dashboard/agents-sales и проверяет поля Total и PerAgentTotal.
  • PolicyServiceToDashboardServiceIntegrationTest.MultiplePoliciesWithDifferentAgents_Should_ShowCorrectAggregation
    • Делает POST на /api/Dashboard/total-sales, /api/Dashboard/agents-sales и /api/Dashboard/sales-trends, опирается на поля Total, PerAgentTotal и PeriodsSales.

Причина падений:

  • Изменены HTTP-методы (POST -> GET) и имена полей в ответах (overall, items, periods). Также изменён формат агрегации по продуктам (массив вместо map).

План миграции и совместимость

  • Версия API: 2.0 (major).
  • Для поэтапного перехода опционально можно временно держать старые POST-роуты как /api/Dashboard/legacy/* (deprecated) в течение одного релизного цикла, но в этом документе зафиксирован вариант с немедленным переведом (чистый breaking change).
  • Гайд по миграции клиентов:
    • заменить POST на GET и перенести параметры в query-строку;
    • обновить парсинг полей ответов согласно новым именам;
    • пересмотреть логику, зависящую от map-структур, на работу с массивами.

Изменения на шлюзе и наблюдаемость

  • Api Gateway/Ocelot: добавить маршруты для GET эндпоинтов и удалить/перенаправить POST.
  • Включить кэширование на уровне шлюза/CDN по ключам query-параметров, TTL согласовать с продуктом (напр., 60–120 с).
  • Логирование: запросы с ключевыми параметрами (диапазон дат, продукт, агент), время обработки, размер ответа, кэш-хиты.

Нефункциональные цели

  • P95 ответа: ≤ 300 мс при прогретом кэше, ≤ 700 мс на холодном пути.
  • Корректная пагинация и сортировка для Top Agents (limit ∈ [1,100], offset ≥ 0).
  • Стойкость к пиковым нагрузкам чтения за счет edge-кэширования.

OpenAPI (высокоуровневый фрагмент)

  • GET /api/Dashboard/top-agents → { total, items[{ rank, agentLogin, sales{ policiesCount, premiumAmount } }] }
  • GET /api/Dashboard/total-sales → { overall{ ... }, byProduct[{ productCode, sales{ ... } }] }
  • GET /api/Dashboard/agents-sales → { items[{ agentLogin, sales{ ... } }] }
  • GET /api/Dashboard/sales-trends → { periods[{ date, label, sales{ ... } }] }

Примечание: детальное OpenAPI-описание будет обновлено в DashboardService-openapi.json в рамках реализации.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions