using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Persistence.Models; using Persistence.Repositories; using System.Net; namespace 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 InsertRange([FromRoute]Guid idDiscriminator, [FromBody]IEnumerable sets, CancellationToken token) { var result = await repository.InsertRange(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); } }