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);
}