/
Lexus_666
/
Pir_API
Обзор
Документация
Войти
/
Lexus_666
/
Pir_API
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Middleware/StatisticsLoggingMiddleware.cs
80 строк
2 KB
Lexus_666
Lab 2 done
20 окт 2025, 05:24
20 окт 2025, 05:24
1680046
Код
Авторство
О чём код?
using Pir_API.Services; namespace Pir_API.Middleware; public class StatisticsLoggingMiddleware { private readonly RequestDelegate _next; private readonly IInternalApiClient _internalApiClient; private readonly ILogger<StatisticsLoggingMiddleware> _logger; private DateTime _lastStatisticsUpdate = DateTime.MinValue; private readonly TimeSpan _updateInterval = TimeSpan.FromMinutes(5); private readonly Lock _lock = new(); public StatisticsLoggingMiddleware( RequestDelegate next, IInternalApiClient internalApiClient, ILogger<StatisticsLoggingMiddleware> logger) { _next = next; _internalApiClient = internalApiClient; _logger = logger; } public async Task InvokeAsync(HttpContext context) { if (context.Request.Path.StartsWithSegments("/api/internal") || context.Request.Path.StartsWithSegments("/swagger")) { await _next(context); return; } await TryUpdateAndLogStatisticsAsync(); await _next(context); } private async Task TryUpdateAndLogStatisticsAsync() { var shouldUpdate = false; lock (_lock) { if (DateTime.UtcNow - _lastStatisticsUpdate >= _updateInterval) { shouldUpdate = true; _lastStatisticsUpdate = DateTime.UtcNow; } } if (shouldUpdate) { await UpdateAndLogStatisticsAsync(); } } private async Task UpdateAndLogStatisticsAsync() { try { var statistics = await _internalApiClient.GetStatisticsFromInternalApiAsync(); if (statistics != null) { _logger.LogInformation( "Статистика по предприятию: всего работников {TotalWorkers}. Last updated: {LastUpdated}", statistics.TotalWorkers, statistics.LastUpdated.ToString("yyyy-MM-dd HH:mm:ss")); } else { _logger.LogWarning("Can`t load statistics"); } } catch (Exception ex) { _logger.LogError(ex, "Ошибка при получении статистики"); } } }