Задание крайне странно составлено.

Исходный код проекта доступен в директории src.

Использовался паттерн Repository и механизм Dependency Injection.

Для работы нужен MySQL Server 8.0.32.

Настройка таймаута

Согласно заданию, доступно в конфигурации приложения (appsettings.json).

{
  "ReportTimeout":20000, // стоит 20 секунд таймаут
}

Доступные эндпоинты

  1. POST /report/user_statistics

Принимает на вход объект:

{
  "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "fromDate": "2023-10-04T20:48:29.760Z",
  "toDate": "2023-10-04T20:48:29.760Z"
}

Возвращает Guid запроса.

  1. GET /report/info/{id}

Возвращает информацию о запросе по его GUID. Результат следующего вида:

{
  "id": "b427f22f-1634-4862-95b4-1107f6db389c",
  "progress": 50,
  "result": null
}

Если прогресс выполнения меньше 100, и:

{
  "id": "b427f22f-1634-4862-95b4-1107f6db389c",
  "progress": 100,
  "result": "{\"user_id\": \"b28d0ced-8af5-4c94-8650-c7946241fd1a\", \"count_sign_in\": \"12\"}"
}

Если прогресс выполнения равен 100.

Отказоустойчивость

Был реализован простой механизм по отказоустойчивости, на случай если приложение (сервер) "упал", данные сохранены в базе, и при последующем обращении к эндпоинту GET /report/info/{id} выполнение продолжится согласно прогрессу.

Пример. прогресс - 25%. Сервер упал. Сервер поднялся. Пользователь снова обратился к /report/info/{id} прогресс выполнения продолжился с 25%.