diff --git a/Persistence.API/Controllers/ChangeLogController.cs b/Persistence.API/Controllers/ChangeLogController.cs index 08f059e..f65cbb1 100644 --- a/Persistence.API/Controllers/ChangeLogController.cs +++ b/Persistence.API/Controllers/ChangeLogController.cs @@ -146,8 +146,21 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + [HttpGet("part")] + [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] + public async Task GetPart(Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default) + { + var result = await repository.GetGtDate(idDiscriminator, dateBegin, token); + return Ok(result); + } + [HttpGet("datesRange")] + [ProducesResponseType(typeof(DatesRangeDto), (int)HttpStatusCode.OK)] + public async Task GetDatesRangeAsync(Guid idDiscriminator, CancellationToken token) + { + var result = await repository.GetDatesRange(idDiscriminator, token); - + return Ok(result); + } } diff --git a/Persistence.Repository/Repositories/ChangeLogRepository.cs b/Persistence.Repository/Repositories/ChangeLogRepository.cs index 5bfb870..98ff7d3 100644 --- a/Persistence.Repository/Repositories/ChangeLogRepository.cs +++ b/Persistence.Repository/Repositories/ChangeLogRepository.cs @@ -256,4 +256,30 @@ public class ChangeLogRepository : IChangeLogRepository return entity; } + public async Task> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token) + { + var date = dateBegin.ToUniversalTime(); + var query = this.db.Set() + .Where(e => e.IdDiscriminator == idDiscriminator) + .Where(e => e.Creation >= date || e.Obsolete >= date); + + var entities = await query.ToArrayAsync(token); + + var dtos = entities.Select(e => e.Adapt()); + + return dtos; + } + + public async Task GetDatesRange(Guid idDiscriminator, CancellationToken token) + { + var query = this.db.Set().Where(e => e.IdDiscriminator == idDiscriminator); + var minDate = await query.MinAsync(o => o.Creation, token); + var maxDate = await query.MaxAsync(o => o.Creation, token); + + return new DatesRangeDto + { + From = minDate, + To = maxDate + }; + } } diff --git a/Persistence/API/IChangeLogApi.cs b/Persistence/API/IChangeLogApi.cs index a46fc98..40ca8ae 100644 --- a/Persistence/API/IChangeLogApi.cs +++ b/Persistence/API/IChangeLogApi.cs @@ -7,7 +7,7 @@ namespace Persistence.API; /// /// Интерфейс для работы с API журнала изменений /// -public interface IChangeLogApi +public interface IChangeLogApi : ISyncWithDiscriminatorApi { /// /// Импорт с заменой: удаление старых строк и добавление новых diff --git a/Persistence/API/ISyncApi.cs b/Persistence/API/ISyncApi.cs index 7f72812..286df3d 100644 --- a/Persistence/API/ISyncApi.cs +++ b/Persistence/API/ISyncApi.cs @@ -6,7 +6,7 @@ namespace Persistence.API; /// /// Интерфейс для API, предназначенного для синхронизации данных /// -public interface ISyncApi where TDto : class, new() +public interface ISyncApi where TDto : class { /// /// Получить порцию записей, начиная с заданной даты diff --git a/Persistence/API/ISyncWithDiscriminatorApi.cs b/Persistence/API/ISyncWithDiscriminatorApi.cs new file mode 100644 index 0000000..c0c72f0 --- /dev/null +++ b/Persistence/API/ISyncWithDiscriminatorApi.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Mvc; +using Persistence.Models; + +namespace Persistence.API; + +/// +/// Интерфейс для API, предназначенного для синхронизации данных, у которых есть дискриминатор +/// +public interface ISyncWithDiscriminatorApi +{ + /// + /// Получить порцию записей, начиная с заданной даты + /// + /// + /// + /// количество записей + /// + /// + Task GetPart(Guid idDiscriminator, DateTimeOffset dateBegin, int take = 24 * 60 * 60, CancellationToken token = default); + + /// + /// Получить диапазон дат, для которых есть данные в репозитории + /// + /// + /// + /// + Task GetDatesRangeAsync(Guid idDiscriminator, CancellationToken token); +} diff --git a/Persistence/Repositories/IChangeLogRepository.cs b/Persistence/Repositories/IChangeLogRepository.cs index b5cd53a..c885c90 100644 --- a/Persistence/Repositories/IChangeLogRepository.cs +++ b/Persistence/Repositories/IChangeLogRepository.cs @@ -7,7 +7,7 @@ namespace Persistence.Repositories; /// Интерфейс для работы с историческими данными /// /// -public interface IChangeLogRepository //: ISyncRepository +public interface IChangeLogRepository : ISyncWithDiscriminatorRepository { /// /// Добавление записей diff --git a/Persistence/Repositories/ISyncRepository.cs b/Persistence/Repositories/ISyncRepository.cs index e18c5f5..5a5c9be 100644 --- a/Persistence/Repositories/ISyncRepository.cs +++ b/Persistence/Repositories/ISyncRepository.cs @@ -1,17 +1,25 @@ -namespace Persistence.Repositories; +using Persistence.Models; + +namespace Persistence.Repositories; /// /// Интерфейс по работе с данными /// /// public interface ISyncRepository - where TDto : class, new() { /// /// Получить данные, начиная с определенной даты /// /// дата начала + /// /// + Task> GetGtDate(DateTimeOffset dateBegin, CancellationToken token); + + + /// + /// Получить диапазон дат, для которых есть данные в репозитории + /// /// /// - Task> GetGtDate(DateTimeOffset dateBegin, CancellationToken token); + Task GetDatesRange(CancellationToken token); } diff --git a/Persistence/Repositories/ISyncWithDiscriminatorRepository.cs b/Persistence/Repositories/ISyncWithDiscriminatorRepository.cs new file mode 100644 index 0000000..7e0bd62 --- /dev/null +++ b/Persistence/Repositories/ISyncWithDiscriminatorRepository.cs @@ -0,0 +1,28 @@ +using Persistence.Models; + +namespace Persistence.Repositories; + +/// +/// Интерфейс по работе с данными, у которых есть дискриминатор +/// +/// +public interface ISyncWithDiscriminatorRepository +{ + /// + /// Получить данные, начиная с определенной даты + /// + /// дискриминатор таблицы + /// дата начала + /// + /// /// + Task> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token); + + + /// + /// Получить диапазон дат, для которых есть данные в репозитории + /// + /// дискриминатор таблицы + /// + /// + Task GetDatesRange(Guid idDiscriminator, CancellationToken token); +} diff --git a/Persistence/Repositories/ITimeSeriesBaseRepository.cs b/Persistence/Repositories/ITimeSeriesBaseRepository.cs index 7102d97..26edf2f 100644 --- a/Persistence/Repositories/ITimeSeriesBaseRepository.cs +++ b/Persistence/Repositories/ITimeSeriesBaseRepository.cs @@ -19,11 +19,4 @@ public interface ITimeSeriesBaseRepository double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default); - - /// - /// Получить диапазон дат, для которых есть данные в репозитории - /// - /// - /// - Task GetDatesRange(CancellationToken token); }