using DD.Persistence.Models; using DD.Persistence.Models.Common; using DD.Persistence.Repositories; using Microsoft.AspNetCore.Mvc; using System.Net; namespace DD.Persistence.API.Controllers; /// /// Хранение наборов данных с отметкой времени. /// Не оптимизировано под большие данные. /// [ApiController] //[Authorize] [Route("api/[controller]/{discriminatorId}")] public class TimestampedValuesController : ControllerBase { private readonly ITimestampedValuesRepository repository; public TimestampedValuesController(ITimestampedValuesRepository repository) { this.repository = repository; } /// /// Записать новые данные /// Предполагается что данные с одним дискриминатором имеют одинаковую структуру /// /// Дискриминатор (идентификатор) набора /// /// /// кол-во затронутых записей [HttpPost] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task AddRange([FromRoute] Guid discriminatorId, [FromBody] IEnumerable sets, CancellationToken token) { var result = await repository.AddRange(discriminatorId, sets, token); return Ok(result); } /// /// Получение данных с фильтрацией. Значение фильтра null - отключен /// /// Дискриминатор (идентификатор) набора /// Фильтр позднее даты /// Фильтр свойств набора. Можно запросить только некоторые свойства из набора /// /// /// /// Фильтрованный набор данных с сортировкой по отметке времени [HttpGet] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task Get([FromRoute] Guid discriminatorId, DateTimeOffset? geTimestamp, [FromQuery] IEnumerable? columnNames, int skip, int take, CancellationToken token) { var result = await repository.Get(discriminatorId, geTimestamp, columnNames, skip, take, token); return Ok(result); } /// /// Получить последние данные /// /// Дискриминатор (идентификатор) набора /// Фильтр свойств набора. Можно запросить только некоторые свойства из набора /// /// /// Фильтрованный набор данных с сортировкой по отметке времени [HttpGet("last")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetLast([FromRoute] Guid discriminatorId, [FromQuery] IEnumerable? columnNames, int take, CancellationToken token) { var result = await repository.GetLast(discriminatorId, columnNames, take, token); return Ok(result); } /// /// Диапазон дат за которые есть данные /// /// /// /// Дата первой и последней записи [HttpGet("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task GetDatesRange([FromRoute] Guid discriminatorId, CancellationToken token) { var result = await repository.GetDatesRange(discriminatorId, token); return Ok(result); } /// /// Количество записей по указанному набору в БД. Для пагинации. /// /// Дискриминатор (идентификатор) набора /// /// [HttpGet("count")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task Count([FromRoute] Guid discriminatorId, CancellationToken token) { var result = await repository.Count(discriminatorId, token); return Ok(result); } /// /// Получить список объектов с прореживанием, удовлетворяющий диапазону дат /// /// /// /// /// /// /// [HttpGet("resampled")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task GetResampledData([FromRoute] Guid discriminatorId, DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default) { var result = await repository.GetResampledData(discriminatorId, dateBegin, intervalSec, approxPointsCount, token); return Ok(result); } }