From 96e9cd3f16858a1ceecf627bf4e6072adb752ce2 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 5 Jun 2024 15:52:40 +0500 Subject: [PATCH] Add IChangeLogQueryBuilderWithKnownTimezone --- .../Repositories/IChangeLogQueryBuilder.cs | 62 ++++++++++++++++++ .../Repositories/IChangeLogRepository.cs | 3 +- .../IChangeLogRepositoryBuilder.cs | 40 ------------ .../Repository/ChangeLogRepositoryAbstract.cs | 64 +++++++++++++++---- .../ProcessMapPlanBaseController.cs | 8 +-- 5 files changed, 117 insertions(+), 60 deletions(-) create mode 100644 AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs delete mode 100644 AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs diff --git a/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs b/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs new file mode 100644 index 00000000..b7952c1a --- /dev/null +++ b/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs @@ -0,0 +1,62 @@ +using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories; + +/// +/// Интерфейс для работы с объектами, содержащими историю изменений +/// +/// +/// +public interface IChangeLogQueryBuilder + where TDto : IId +{ + /// + /// Применение запроса + /// + /// Запрос + /// + IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request); + + /// + /// Материализация записей + /// + /// + /// + /// + Task> GetData(TimeSpan offset, CancellationToken token); + + /// + /// Материализация записей с историей + /// + /// + /// + /// + Task>> GetChangeLogData(TimeSpan offset, CancellationToken token); +} + +/// +/// Интерфейс для работы с объектами, содержащими историю изменений. С известной временной зоной +/// +/// +/// +public interface IChangeLogQueryBuilderWithKnownTimezone: IChangeLogQueryBuilder + where TDto : IId +{ + /// + /// Материализация записей. Временная зона определяется по запросу из последнего ApplyRequest + /// + /// + /// + Task> GetData(CancellationToken token); + + /// + /// Материализация записей с историей. Временная зона определяется по запросу из последнего ApplyRequest + /// + /// + /// + Task>> GetChangeLogData(CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index 359629c6..bd8cbe85 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -93,11 +93,10 @@ public interface IChangeLogRepository /// Task> GetCurrent(TRequest request, CancellationToken token); - /// /// Получение объекта, реализующего интерфейс IChangeLogRepositoryBuilder /// для последующих вызовов методов фильтрации по запросам /// /// - IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request); + IChangeLogQueryBuilder GetQueryBuilder(ChangeLogRequest request); } diff --git a/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs b/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs deleted file mode 100644 index 9d51774d..00000000 --- a/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs +++ /dev/null @@ -1,40 +0,0 @@ -using AsbCloudApp.Data; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Repositories; - -/// -/// Интерфейс для работы с объектами, содержащими историю изменений -/// -/// -/// -public interface IChangeLogRepositoryBuilder - where TDto : IId -{ - /// - /// Применение запроса - /// - /// Запрос - /// - /// - IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token); - - /// - /// Материализация записей - /// - /// - /// - /// - Task> GetData(TimeSpan offset, CancellationToken token); - - /// - /// Материализация записей с историей - /// - /// - /// - /// - Task>> GetChangeLogData(TimeSpan offset, CancellationToken token); -} diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 962759bb..054453e6 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -25,12 +25,12 @@ public abstract class ChangeLogRepositoryAbstract : ICh this.db = db; } - private class ChangeLogRepositoryBuilder : IChangeLogRepositoryBuilder + private class ChangeLogQueryBuilder: IChangeLogQueryBuilder { - private readonly ChangeLogRepositoryAbstract Repository; - private IQueryable Query; + protected readonly ChangeLogRepositoryAbstract Repository; + protected IQueryable Query; - public ChangeLogRepositoryBuilder( + public ChangeLogQueryBuilder( ChangeLogRepositoryAbstract repository, ChangeLogRequest request) { @@ -49,15 +49,20 @@ public abstract class ChangeLogRepositoryAbstract : ICh } } - public IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token) + public ChangeLogQueryBuilder(ChangeLogQueryBuilder builder) + { + Repository = builder.Repository; + Query = builder.Query; + } + + public virtual IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request) { this.Query = Repository.BuildQuery(request, Query); - return this; + return new ChangeLogQueryBuilderWithKnownTimezone(this, request); } public async Task> GetData(TimeSpan offset, CancellationToken token) { - var dtos = await this.Query.Select(e => Repository.Convert(e, offset)) .ToArrayAsync(token); return dtos; @@ -71,10 +76,43 @@ public abstract class ChangeLogRepositoryAbstract : ICh } } - public IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request) + private class ChangeLogQueryBuilderWithKnownTimezone: ChangeLogQueryBuilder, IChangeLogQueryBuilderWithKnownTimezone { - var builder = new ChangeLogRepositoryBuilder(this, request); + TRequest request; + public ChangeLogQueryBuilderWithKnownTimezone( + ChangeLogQueryBuilder parentBuilder, + TRequest request) + :base(parentBuilder) + { + this.request = request; + } + + public override IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request) + { + Query = Repository.BuildQuery(request, Query); + this.request = request; + return this; + } + + public async Task> GetData(CancellationToken token) + { + TimeSpan timezoneOffset = Repository.GetTimezoneOffset(request); + var dtos = await this.GetData(timezoneOffset, token); + return dtos; + } + + public async Task>> GetChangeLogData(CancellationToken token) + { + TimeSpan timezoneOffset = Repository.GetTimezoneOffset(request); + var dtos = await this.GetChangeLogData(timezoneOffset, token); + return dtos; + } + } + + public IChangeLogQueryBuilder GetQueryBuilder(ChangeLogRequest request) + { + var builder = new ChangeLogQueryBuilder(this, request); return builder; } @@ -311,11 +349,9 @@ public abstract class ChangeLogRepositoryAbstract : ICh Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero) }; - var builder = new ChangeLogRepositoryBuilder(this, changeLogRequest); - builder.ApplyRequest(request, token); - - var offset = GetTimezoneOffset(request); - var dtos = await builder.GetData(offset, token); + var builder = GetQueryBuilder(changeLogRequest) + .ApplyRequest(request); + var dtos = await builder.GetData(token); return dtos; } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 1362266d..66b75bc0 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -172,11 +172,11 @@ public abstract class ProcessMapPlanBaseController : ControllerBa Moment = moment }; - var builder = repository.GetRequestBuilder(changeLogRequest); - builder.ApplyRequest(dataRequest, token); + var builder = repository + .GetQueryBuilder(changeLogRequest) + .ApplyRequest(dataRequest); - var offset = wellService.GetTimezone(idWell).Offset; - var dtos = await builder.GetChangeLogData(offset, token); + var dtos = await builder.GetChangeLogData(token); return Ok(dtos); }