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