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