using DD.Persistence.API; using DD.Persistence.Models.ChangeLog; using DD.Persistence.Models.Common; using DD.Persistence.Models.Requests; using DD.Persistence.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Net; /// /// Контроллер по работе с журналом изменений /// [ApiController] [Authorize] [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { private readonly ChangeLogService service; /// /// ctor /// /// public ChangeLogController(ChangeLogService service) { this.service = service; } /// /// Добавить записи в журнал изменений по дискриминатору /// /// /// /// /// /// [HttpPost("{idDiscriminator}")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] public async Task AddRange( [FromRoute] Guid idDiscriminator, [FromBody] IEnumerable> dtos, string? comment, CancellationToken token) { var userId = User.GetUserId(); var changeLogCommitRequest = new ChangeLogCommitCreateRequest { IdAuthor = userId, Comment = comment, DiscriminatorId = idDiscriminator, }; var result = await service.AddRange(changeLogCommitRequest, dtos, token); return CreatedAtAction(nameof(AddRange), result); } /// /// Удалить записи в журнале изменений /// /// /// /// /// /// [HttpDelete] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task DeleteRange(Guid idDiscriminator, IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); var changeLogCommitRequest = new ChangeLogCommitCreateRequest(idDiscriminator, userId, comment); var result = await service.MarkAsDeleted(ids, changeLogCommitRequest, token); return Ok(result); } /// /// Очистить все записи в журнале изменений (по дискриминатору) и добавить новые /// /// /// /// /// /// [HttpPost("replace/{idDiscriminator}")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task ClearAndAddRange( [FromRoute] Guid idDiscriminator, [FromBody] IEnumerable> dtos, string comment, CancellationToken token) { var userId = User.GetUserId(); var changeLogCommitRequest = new ChangeLogCommitCreateRequest(idDiscriminator, userId, comment); var result = await service.ClearAndAddRange(changeLogCommitRequest, dtos, token); return Ok(result); } /// /// сохранить изменения в записях журнала изменений /// /// /// /// /// /// [HttpPut] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task UpdateRange( Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { var userId = User.GetUserId(); var changeLogCommitRequest = new ChangeLogCommitCreateRequest(idDiscriminator, userId, comment); var result = await service.UpdateRange(changeLogCommitRequest, dtos, token); return Ok(result); } /// /// Получение актуальных записей (с пагинацией) /// /// /// /// /// [HttpGet("{idDiscriminator}")] [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] public async Task GetCurrent( [FromRoute] Guid idDiscriminator, [FromQuery] PaginationRequest paginationRequest, CancellationToken token) { var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero); var result = await service.GetByDate(idDiscriminator, moment, paginationRequest, token); return Ok(result); } /// /// Получение записей на определенный момент времени (с пагинацией) /// /// /// /// /// /// [HttpGet("moment/{idDiscriminator}")] [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] public async Task GetByDate( [FromRoute] Guid idDiscriminator, DateTimeOffset moment, [FromQuery] PaginationRequest paginationRequest, CancellationToken token) { var result = await service.GetByDate(idDiscriminator, moment, paginationRequest, token); return Ok(result); } /// /// Получение измененных записей за период времени /// /// /// /// /// /// [HttpGet("history/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task GetChangeLogForDate( [FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token) { var result = await service.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, token); return Ok(result); } /// /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) /// /// /// /// [HttpGet("datesChange/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task GetDatesChange([FromRoute] Guid idDiscriminator, CancellationToken token) { var result = await service.GetDatesChange(idDiscriminator, token); return Ok(result); } /// /// Получение данных, начиная с определенной даты /// /// /// /// /// /// [HttpGet("part/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default) { var result = await service.GetGtDate(idDiscriminator, dateBegin, token); return Ok(result); } /// /// Получить диапазон дат, для которых есть данные в репозитории /// /// /// /// [HttpGet("datesRange/{idDiscriminator}")] [ProducesResponseType(typeof(DatesRangeDto), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task> GetDatesRangeAsync([FromRoute] Guid idDiscriminator, CancellationToken token) { var result = await service.GetDatesRange(idDiscriminator, token); if (result is null) return NoContent(); return Ok(result); } /// /// Метод, который возвращает статистику пользователя по количеству изменений в разрезе дней /// /// /// /// [HttpGet("statistics")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetStatistics([FromQuery] ChangeLogQuery request, CancellationToken token) { var result = await service.GetStatistics(request, token); return Ok(result); } /// /// Метод, который возвращает историю изменений в разрезе дней /// /// /// /// [HttpGet("history")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetHistory([FromQuery] ChangeLogQuery request, CancellationToken token) { var result = await service.GetHistory(request, token); return Ok(result); } }