using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests.Queries;
using PARR.API.Contracts.V1.Responses.Base;
using PARR.API.Contracts.V1.Responses.Statistics;
using PARR.API.Controllers.V1.Base;
using PARR.Constants;
using PARR.DAL.InfluxDbServices;
using PARR.DAL.Settings;
namespace PARR.API.Controllers.V1.Statistics
{
///
/// Статистика по авторизации
///
[Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)]
public class StatAuthController : BaseApiController
{
private readonly IInfluxDbService influxDbService;
private readonly InfluxDbSettings influxDbSettings;
public StatAuthController(
IInfluxDbService influxDbService,
InfluxDbSettings influxDbSettings
)
{
this.influxDbService = influxDbService;
this.influxDbSettings = influxDbSettings;
}
///
/// Кол-во запросов на авторизацию не из КЭШа
///
///
[HttpGet(ApiRoutes.StatAuth.Get)]
public async Task Get([FromQuery] StatAuthGetQuery query)
{
var startAt = string.IsNullOrEmpty(query.StartAt) ? "-2h" : query.StartAt;
var result = await influxDbService.QueryAsync(async handler =>
{
var query = $"from(bucket: \"{influxDbSettings.Logons!.Bucket}\") " +
$"|> range(start: {startAt}) " +
$"|> filter(fn: (r) => r._measurement == \"logon\") " +
$"|> drop(columns: [\"HostId\", \"UserId\"]) " +
$"|> aggregateWindow(every: 5m, fn: count)";
var tables = await handler.QueryAsync(query, influxDbSettings.Organization);
return tables.SelectMany(table =>
table.Records.Select(record => new StatAuthResponse
{
Date = (DateTimeOffset)record.GetTimeInDateTime(),
Count = int.Parse(record.GetValue()?.ToString() ?? "0")
})
);
}, influxDbSettings.Logons!.Token);
if (result == null)
return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при получении статистики" } }));
return Ok(new Response>(result.ToList(), true));
}
}
}