Исходный код проекта доступен в директории src.
Использовался паттерн Repository и механизм Dependency Injection.
Для работы нужен MySQL Server 8.0.32.
Согласно заданию, доступно в конфигурации приложения (appsettings.json).
{
"ReportTimeout":20000, // стоит 20 секунд таймаут
}
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 запроса.
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%.