Изменить ChangeLog (упрощение сущности)
All checks were successful
Unit tests / test (push) Successful in 45s

This commit is contained in:
Roman Efremov 2025-01-24 17:24:18 +05:00
parent 8fd16512f3
commit 5d820fb2c8
17 changed files with 135 additions and 199 deletions

View File

@ -24,7 +24,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
public async Task<IActionResult> Add( public async Task<IActionResult> Add(
[FromRoute] Guid idDiscriminator, [FromRoute] Guid idDiscriminator,
[FromBody] DataWithWellDepthAndSectionDto dto, [FromBody] ChangeLogValuesDto dto,
CancellationToken token) CancellationToken token)
{ {
var userId = User.GetUserId<Guid>(); var userId = User.GetUserId<Guid>();
@ -37,7 +37,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
public async Task<IActionResult> AddRange( public async Task<IActionResult> AddRange(
[FromRoute] Guid idDiscriminator, [FromRoute] Guid idDiscriminator,
[FromBody] IEnumerable<DataWithWellDepthAndSectionDto> dtos, [FromBody] IEnumerable<ChangeLogValuesDto> dtos,
CancellationToken token) CancellationToken token)
{ {
var userId = User.GetUserId<Guid>(); var userId = User.GetUserId<Guid>();
@ -70,7 +70,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
public async Task<IActionResult> ClearAndAddRange( public async Task<IActionResult> ClearAndAddRange(
[FromRoute] Guid idDiscriminator, [FromRoute] Guid idDiscriminator,
[FromBody] IEnumerable<DataWithWellDepthAndSectionDto> dtos, [FromBody] IEnumerable<ChangeLogValuesDto> dtos,
CancellationToken token) CancellationToken token)
{ {
var userId = User.GetUserId<Guid>(); var userId = User.GetUserId<Guid>();
@ -81,7 +81,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
[HttpPut] [HttpPut]
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Update( public async Task<IActionResult> Update(
DataWithWellDepthAndSectionDto dto, ChangeLogValuesDto dto,
CancellationToken token) CancellationToken token)
{ {
var userId = User.GetUserId<Guid>(); var userId = User.GetUserId<Guid>();
@ -93,7 +93,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
[HttpPut("range")] [HttpPut("range")]
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
public async Task<IActionResult> UpdateRange( public async Task<IActionResult> UpdateRange(
IEnumerable<DataWithWellDepthAndSectionDto> dtos, IEnumerable<ChangeLogValuesDto> dtos,
CancellationToken token) CancellationToken token)
{ {
var userId = User.GetUserId<Guid>(); var userId = User.GetUserId<Guid>();
@ -103,29 +103,27 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
} }
[HttpGet("{idDiscriminator}")] [HttpGet("{idDiscriminator}")]
[ProducesResponseType(typeof(PaginationContainer<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(PaginationContainer<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetCurrent( public async Task<IActionResult> GetCurrent(
[FromRoute] Guid idDiscriminator, [FromRoute] Guid idDiscriminator,
[FromQuery] SectionPartRequest filterRequest,
[FromQuery] PaginationRequest paginationRequest, [FromQuery] PaginationRequest paginationRequest,
CancellationToken token) CancellationToken token)
{ {
var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero); var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero);
var result = await repository.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token); var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token);
return Ok(result); return Ok(result);
} }
[HttpGet("moment/{idDiscriminator}")] [HttpGet("moment/{idDiscriminator}")]
[ProducesResponseType(typeof(PaginationContainer<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(PaginationContainer<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetByDate( public async Task<IActionResult> GetByDate(
[FromRoute] Guid idDiscriminator, [FromRoute] Guid idDiscriminator,
DateTimeOffset moment, DateTimeOffset moment,
[FromQuery] SectionPartRequest filterRequest,
[FromQuery] PaginationRequest paginationRequest, [FromQuery] PaginationRequest paginationRequest,
CancellationToken token) CancellationToken token)
{ {
var result = await repository.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token); var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token);
return Ok(result); return Ok(result);
} }
@ -155,9 +153,9 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
} }
[HttpGet("part/{idDiscriminator}")] [HttpGet("part/{idDiscriminator}")]
[ProducesResponseType(typeof(IEnumerable<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(IEnumerable<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.NoContent)] [ProducesResponseType((int)HttpStatusCode.NoContent)]
public async Task<ActionResult<IEnumerable<DataWithWellDepthAndSectionDto>>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default) public async Task<ActionResult<IEnumerable<ChangeLogValuesDto>>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default)
{ {
var result = await repository.GetGtDate(idDiscriminator, dateBegin, token); var result = await repository.GetGtDate(idDiscriminator, dateBegin, token);

View File

@ -7,16 +7,19 @@ using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Models.Common; using DD.Persistence.Models.Common;
namespace DD.Persistence.Client.Clients; namespace DD.Persistence.Client.Clients;
/// <inheritdoc/>
public class ChangeLogClient : BaseClient, IChangeLogClient public class ChangeLogClient : BaseClient, IChangeLogClient
{ {
private readonly IRefitChangeLogClient refitChangeLogClient; private readonly IRefitChangeLogClient refitChangeLogClient;
/// <inheritdoc/>
public ChangeLogClient(IRefitClientFactory<IRefitChangeLogClient> refitClientFactory, ILogger<ChangeLogClient> logger) : base(logger) public ChangeLogClient(IRefitClientFactory<IRefitChangeLogClient> refitClientFactory, ILogger<ChangeLogClient> logger) : base(logger)
{ {
this.refitChangeLogClient = refitClientFactory.Create(); this.refitChangeLogClient = refitClientFactory.Create();
} }
public async Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) /// <inheritdoc/>
public async Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var result = await ExecuteGetResponse( var result = await ExecuteGetResponse(
async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token); async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token);
@ -24,15 +27,17 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
public async Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, /// <inheritdoc/>
SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token) public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment,
PaginationRequest paginationRequest, CancellationToken token)
{ {
var result = await ExecuteGetResponse( var result = await ExecuteGetResponse(
async () => await refitChangeLogClient.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token), token); async () => await refitChangeLogClient.GetByDate(idDiscriminator, moment, paginationRequest, token), token);
return result; return result!;
} }
/// <inheritdoc/>
public async Task<IEnumerable<ChangeLogDto>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token) public async Task<IEnumerable<ChangeLogDto>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token)
{ {
var result = await ExecuteGetResponse( var result = await ExecuteGetResponse(
@ -41,7 +46,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result!; return result!;
} }
public async Task<int> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token) /// <inheritdoc/>
public async Task<int> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token); async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token);
@ -49,7 +55,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) /// <inheritdoc/>
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token); async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token);
@ -57,7 +64,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
public async Task<int> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token) /// <inheritdoc/>
public async Task<int> Update(ChangeLogValuesDto dto, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
async () => await refitChangeLogClient.Update(dto, token), token); async () => await refitChangeLogClient.Update(dto, token), token);
@ -65,7 +73,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
public async Task<int> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) /// <inheritdoc/>
public async Task<int> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
async () => await refitChangeLogClient.UpdateRange(dtos, token), token); async () => await refitChangeLogClient.UpdateRange(dtos, token), token);
@ -73,6 +82,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
/// <inheritdoc/>
public async Task<int> Delete(Guid id, CancellationToken token) public async Task<int> Delete(Guid id, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
@ -81,6 +91,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
/// <inheritdoc/>
public async Task<int> DeleteRange(IEnumerable<Guid> ids, CancellationToken token) public async Task<int> DeleteRange(IEnumerable<Guid> ids, CancellationToken token)
{ {
var result = await ExecutePostResponse( var result = await ExecutePostResponse(
@ -89,6 +100,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
/// <inheritdoc/>
public async Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token) public async Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token)
{ {
var result = await ExecuteGetResponse( var result = await ExecuteGetResponse(
@ -97,6 +109,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
return result; return result;
} }
/// <inheritdoc/>
public void Dispose() public void Dispose()
{ {
refitChangeLogClient.Dispose(); refitChangeLogClient.Dispose();

View File

@ -16,7 +16,7 @@ public interface IChangeLogClient : IDisposable
/// <param name="dto"></param> /// <param name="dto"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<int> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
/// <summary> /// <summary>
/// Добавить несколько записей /// Добавить несколько записей
@ -25,7 +25,7 @@ public interface IChangeLogClient : IDisposable
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Импорт с заменой: удаление старых строк и добавление новых /// Импорт с заменой: удаление старых строк и добавление новых
@ -34,7 +34,7 @@ public interface IChangeLogClient : IDisposable
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Удалить одну запись /// Удалить одну запись
@ -57,11 +57,10 @@ public interface IChangeLogClient : IDisposable
/// </summary> /// </summary>
/// <param name="idDiscriminator"></param> /// <param name="idDiscriminator"></param>
/// <param name="moment"></param> /// <param name="moment"></param>
/// <param name="filterRequest"></param>
/// <param name="paginationRequest"></param> /// <param name="paginationRequest"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token); Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
/// <summary> /// <summary>
/// Получение исторических данных за определенный период времени /// Получение исторических данных за определенный период времени
@ -87,7 +86,7 @@ public interface IChangeLogClient : IDisposable
/// <param name="dto"></param> /// <param name="dto"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<int> Update(ChangeLogValuesDto dto, CancellationToken token);
/// <summary> /// <summary>
/// Обновить несколько записей /// Обновить несколько записей
@ -95,5 +94,5 @@ public interface IChangeLogClient : IDisposable
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
} }

View File

@ -5,42 +5,74 @@ using Refit;
namespace DD.Persistence.Client.Clients.Interfaces.Refit; namespace DD.Persistence.Client.Clients.Interfaces.Refit;
/// <summary>
/// Refit интерфейс для IRefitChangeLogClient
/// </summary>
public interface IRefitChangeLogClient : IRefitClient, IDisposable public interface IRefitChangeLogClient : IRefitClient, IDisposable
{ {
private const string BaseRoute = "/api/ChangeLog"; private const string BaseRoute = "/api/ChangeLog";
/// <summary>
/// Импорт с заменой: удаление старых строк и добавление новых
/// </summary>
[Post($"{BaseRoute}/replace/{{idDiscriminator}}")] [Post($"{BaseRoute}/replace/{{idDiscriminator}}")]
Task<IApiResponse<int>> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IApiResponse<int>> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary>
/// Получение актуальных данных на определенную дату (с пагинацией)
/// </summary>
[Get($"{BaseRoute}/moment/{{idDiscriminator}}")] [Get($"{BaseRoute}/moment/{{idDiscriminator}}")]
Task<IApiResponse<PaginationContainer<DataWithWellDepthAndSectionDto>>> GetByDate( Task<IApiResponse<PaginationContainer<ChangeLogValuesDto>>> GetByDate(
Guid idDiscriminator, Guid idDiscriminator,
DateTimeOffset moment, DateTimeOffset moment,
[Query] SectionPartRequest filterRequest,
[Query] PaginationRequest paginationRequest, [Query] PaginationRequest paginationRequest,
CancellationToken token); CancellationToken token);
/// <summary>
/// Получение исторических данных за определенный период времени
/// </summary>
[Get($"{BaseRoute}/history/{{idDiscriminator}}")] [Get($"{BaseRoute}/history/{{idDiscriminator}}")]
Task<IApiResponse<IEnumerable<ChangeLogDto>>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token); Task<IApiResponse<IEnumerable<ChangeLogDto>>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);
/// <summary>
/// Добавить одну запись
/// </summary>
[Post($"{BaseRoute}/{{idDiscriminator}}")] [Post($"{BaseRoute}/{{idDiscriminator}}")]
Task<IApiResponse<int>> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<IApiResponse<int>> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
/// <summary>
/// Добавить несколько записей
/// </summary>
[Post($"{BaseRoute}/range/{{idDiscriminator}}")] [Post($"{BaseRoute}/range/{{idDiscriminator}}")]
Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary>
/// Обновить одну запись
/// </summary>
[Put($"{BaseRoute}")] [Put($"{BaseRoute}")]
Task<IApiResponse<int>> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<IApiResponse<int>> Update(ChangeLogValuesDto dto, CancellationToken token);
/// <summary>
/// Обновить несколько записей
/// </summary>
[Put($"{BaseRoute}/range")] [Put($"{BaseRoute}/range")]
Task<IApiResponse<int>> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IApiResponse<int>> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary>
/// Удалить одну запись
/// </summary>
[Delete($"{BaseRoute}")] [Delete($"{BaseRoute}")]
Task<IApiResponse<int>> Delete(Guid id, CancellationToken token); Task<IApiResponse<int>> Delete(Guid id, CancellationToken token);
/// <summary>
/// Удалить несколько записей
/// </summary>
[Delete($"{BaseRoute}/range")] [Delete($"{BaseRoute}/range")]
Task<IApiResponse<int>> DeleteRange([Body] IEnumerable<Guid> ids, CancellationToken token); Task<IApiResponse<int>> DeleteRange([Body] IEnumerable<Guid> ids, CancellationToken token);
/// <summary>
/// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени)
/// </summary>
[Get($"{BaseRoute}/datesRange/{{idDiscriminator}}")] [Get($"{BaseRoute}/datesRange/{{idDiscriminator}}")]
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid idDiscriminator, CancellationToken token); Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid idDiscriminator, CancellationToken token);

View File

@ -10,7 +10,7 @@ namespace DD.Persistence.Database.Model;
/// <summary> /// <summary>
/// Часть записи, описывающая изменение /// Часть записи, описывающая изменение
/// </summary> /// </summary>
public class ChangeLog : IChangeLog, IWithSectionPart public class ChangeLog : IChangeLog
{ {
[Key, Comment("Ключ записи")] [Key, Comment("Ключ записи")]
public Guid Id { get; set; } public Guid Id { get; set; }
@ -33,15 +33,6 @@ public class ChangeLog : IChangeLog, IWithSectionPart
[Comment("Id заменяющей записи")] [Comment("Id заменяющей записи")]
public Guid? IdNext { get; set; } public Guid? IdNext { get; set; }
[Comment("Глубина забоя на дату начала интервала")]
public double DepthStart { get; set; }
[Comment("Глубина забоя на дату окончания интервала")]
public double DepthEnd { get; set; }
[Comment("Ключ секции")]
public Guid IdSection { get; set; }
[Column(TypeName = "jsonb"), Comment("Значение")] [Column(TypeName = "jsonb"), Comment("Значение")]
public required IDictionary<string, object> Value { get; set; } public required IDictionary<string, object> Value { get; set; }
} }

View File

@ -52,7 +52,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
var insertedCount = 10; var insertedCount = 10;
var createdResult = CreateChangeLogItems(insertedCount, (-15, 15)); var createdResult = CreateChangeLogItems(insertedCount, (-15, 15));
var idDiscriminator = createdResult.Item1; var idDiscriminator = createdResult.Item1;
var dtos = createdResult.Item2.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>()); var dtos = createdResult.Item2.Select(e => e.Adapt<ChangeLogValuesDto>());
// act // act
var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken()); var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken());
@ -106,8 +106,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
var entity = dbContext.ChangeLog var entity = dbContext.ChangeLog
.Where(x => x.IdDiscriminator == idDiscriminator) .Where(x => x.IdDiscriminator == idDiscriminator)
.FirstOrDefault(); .FirstOrDefault();
dto = entity.Adapt<DataWithWellDepthAndSectionDto>(); dto = entity.Adapt<ChangeLogValuesDto>();
dto.DepthEnd += 10;
// act // act
result = await client.Update(dto, new CancellationToken()); result = await client.Update(dto, new CancellationToken());
@ -149,12 +148,9 @@ public class ChangeLogControllerTest : BaseIntegrationTest
dbContext.ChangeLog.AddRange(entities); dbContext.ChangeLog.AddRange(entities);
dbContext.SaveChanges(); dbContext.SaveChanges();
dtos = entities.Select(c => new DataWithWellDepthAndSectionDto() dtos = entities.Select(c => new ChangeLogValuesDto()
{ {
DepthEnd = c.DepthEnd + 10,
DepthStart = c.DepthStart + 10,
Id = c.Id, Id = c.Id,
IdSection = c.IdSection,
Value = c.Value Value = c.Value
}).ToArray(); }).ToArray();
@ -245,12 +241,6 @@ public class ChangeLogControllerTest : BaseIntegrationTest
var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken()); var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken());
var filterRequest = new SectionPartRequest()
{
DepthStart = 0,
DepthEnd = 1000,
};
var paginationRequest = new PaginationRequest() var paginationRequest = new PaginationRequest()
{ {
Skip = 0, Skip = 0,
@ -259,7 +249,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
}; };
var moment = DateTimeOffset.UtcNow.AddDays(16); var moment = DateTimeOffset.UtcNow.AddDays(16);
var result = await client.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, new CancellationToken()); var result = await client.GetByDate(idDiscriminator, moment, paginationRequest, new CancellationToken());
Assert.NotNull(result); Assert.NotNull(result);
@ -292,11 +282,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
var idDiscriminator = changeLogItems.Item1; var idDiscriminator = changeLogItems.Item1;
var entities = changeLogItems.Item2; var entities = changeLogItems.Item2;
foreach (var entity in entities) var dtos = entities.Select(e => e.Adapt<ChangeLogValuesDto>()).ToArray();
{
entity.DepthEnd += 10;
}
var dtos = entities.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>()).ToArray();
await client.UpdateRange(dtos, new CancellationToken()); await client.UpdateRange(dtos, new CancellationToken());
//act //act
@ -310,19 +296,16 @@ public class ChangeLogControllerTest : BaseIntegrationTest
} }
private static IEnumerable<DataWithWellDepthAndSectionDto> Generate(int count) private static IEnumerable<ChangeLogValuesDto> Generate(int count)
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
yield return new DataWithWellDepthAndSectionDto() yield return new ChangeLogValuesDto()
{ {
Value = new Dictionary<string, object>() Value = new Dictionary<string, object>()
{ {
{ "Key", 1 } { "Key", 1 }
}, },
DepthStart = generatorRandomDigits.Next(1, 5), Id = Guid.NewGuid()
DepthEnd = generatorRandomDigits.Next(5, 15),
Id = Guid.NewGuid(),
IdSection = Guid.NewGuid()
}; };
} }

View File

@ -38,5 +38,5 @@ public class ChangeLogDto
/// <summary> /// <summary>
/// Объект записи /// Объект записи
/// </summary> /// </summary>
public DataWithWellDepthAndSectionDto Value { get; set; } = default!; public ChangeLogValuesDto Value { get; set; } = default!;
} }

View File

@ -0,0 +1,17 @@
namespace DD.Persistence.Models;
/// <summary>
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
/// </summary>
public class ChangeLogValuesDto
{
/// <summary>
/// Ключ записи
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Объект записи
/// </summary>
public required IDictionary<string, object> Value { get; set; }
}

View File

@ -1,32 +0,0 @@
namespace DD.Persistence.Models;
/// <summary>
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
/// </summary>
public class DataWithWellDepthAndSectionDto
{
/// <summary>
/// Ключ записи
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Глубина забоя на дату начала интервала
/// </summary>
public double DepthStart { get; set; }
/// <summary>
/// Глубина забоя на дату окончания интервала
/// </summary>
public double DepthEnd { get; set; }
/// <summary>
/// Ключ секции
/// </summary>
public Guid IdSection { get; set; }
/// <summary>
/// Объект записи
/// </summary>
public required IDictionary<string, object> Value { get; set; }
}

View File

@ -1,9 +0,0 @@
namespace DD.Persistence.ModelsAbstractions;
public interface IWithSectionPart
{
public double DepthStart { get; set; }
public double DepthEnd { get; set; }
public Guid IdSection { get; set; }
}

View File

@ -1,22 +0,0 @@
namespace DD.Persistence.Models.Requests;
/// <summary>
/// Запрос для фильтрации данных по секции и глубине
/// </summary>
public class SectionPartRequest
{
/// <summary>
/// Глубина забоя на дату начала интервала
/// </summary>
public double? DepthStart { get; set; }
/// <summary>
/// Глубина забоя на дату окончания интервала
/// </summary>
public double? DepthEnd { get; set; }
/// <summary>
/// Ключ секции
/// </summary>
public Guid? IdSection { get; set; }
}

View File

@ -18,11 +18,8 @@ public static class DependencyInjection
.Ignore(dest => dest.System, dest => dest.SystemId); .Ignore(dest => dest.System, dest => dest.SystemId);
TypeAdapterConfig<ChangeLog, ChangeLogDto>.NewConfig() TypeAdapterConfig<ChangeLog, ChangeLogDto>.NewConfig()
.Map(dest => dest.Value, src => new DataWithWellDepthAndSectionDto() .Map(dest => dest.Value, src => new ChangeLogValuesDto()
{ {
DepthEnd = src.DepthEnd,
DepthStart = src.DepthStart,
IdSection = src.IdSection,
Value = src.Value, Value = src.Value,
Id = src.Id Id = src.Id
}); });

View File

@ -12,25 +12,6 @@ namespace DD.Persistence.Repository;
/// </summary> /// </summary>
public static class QueryBuilders public static class QueryBuilders
{ {
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, SectionPartRequest request)
where TEntity : class, IWithSectionPart
{
if (request.IdSection.HasValue)
{
query = query.Where(e => e.IdSection == request.IdSection);
}
if (request.DepthStart.HasValue)
{
query = query.Where(e => e.DepthStart >= request.DepthStart);
}
if (request.DepthEnd.HasValue)
{
query = query.Where(e => e.DepthEnd <= request.DepthEnd);
}
return query;
}
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc) public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc)
where TEntity : class, IChangeLog where TEntity : class, IChangeLog
{ {
@ -49,17 +30,10 @@ public static class QueryBuilders
PaginationRequest request, PaginationRequest request,
Func<TEntity, TDto> Convert, Func<TEntity, TDto> Convert,
CancellationToken token) CancellationToken token)
where TEntity : class, IWithSectionPart where TEntity : class
where TDto : class where TDto : class
{ {
if (String.IsNullOrEmpty(request.SortSettings)) if (!String.IsNullOrEmpty(request.SortSettings))
{
query = query
.OrderBy(e => e.IdSection)
.ThenBy(e => e.DepthStart)
.ThenBy(e => e.DepthEnd);
}
else
{ {
query = query.SortBy(request.SortSettings); query = query.SortBy(request.SortSettings);
} }

View File

@ -17,7 +17,7 @@ public class ChangeLogRepository : IChangeLogRepository
this.db = db; this.db = db;
} }
public async Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) public async Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var entities = new List<ChangeLog>(); var entities = new List<ChangeLog>();
foreach (var dto in dtos) foreach (var dto in dtos)
@ -76,7 +76,7 @@ public class ChangeLogRepository : IChangeLogRepository
return await db.SaveChangesAsync(token); return await db.SaveChangesAsync(token);
} }
public async Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) public async Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var result = 0; var result = 0;
@ -91,7 +91,7 @@ public class ChangeLogRepository : IChangeLogRepository
return result; return result;
} }
public async Task<int> UpdateRange(Guid idEditor, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token) public async Task<int> UpdateRange(Guid idEditor, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
{ {
var dbSet = db.Set<ChangeLog>(); var dbSet = db.Set<ChangeLog>();
@ -127,16 +127,14 @@ public class ChangeLogRepository : IChangeLogRepository
} }
public async Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate( public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(
Guid idDiscriminator, Guid idDiscriminator,
DateTimeOffset momentUtc, DateTimeOffset momentUtc,
SectionPartRequest filterRequest,
PaginationRequest paginationRequest, PaginationRequest paginationRequest,
CancellationToken token) CancellationToken token)
{ {
var query = CreateQuery(idDiscriminator); var query = CreateQuery(idDiscriminator);
query = query.Apply(momentUtc); query = query.Apply(momentUtc);
query = query.Apply(filterRequest);
var result = await query.ApplyPagination(paginationRequest, Convert, token); var result = await query.ApplyPagination(paginationRequest, Convert, token);
@ -196,7 +194,7 @@ public class ChangeLogRepository : IChangeLogRepository
return datesOnly; return datesOnly;
} }
private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, DataWithWellDepthAndSectionDto dto) private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, ChangeLogValuesDto dto)
{ {
var entity = new ChangeLog() var entity = new ChangeLog()
{ {
@ -206,16 +204,13 @@ public class ChangeLogRepository : IChangeLogRepository
IdDiscriminator = idDiscriminator, IdDiscriminator = idDiscriminator,
IdEditor = idAuthor, IdEditor = idAuthor,
Value = dto.Value, Value = dto.Value
IdSection = dto.IdSection,
DepthStart = dto.DepthStart,
DepthEnd = dto.DepthEnd,
}; };
return entity; return entity;
} }
public async Task<IEnumerable<DataWithWellDepthAndSectionDto>> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token) public async Task<IEnumerable<ChangeLogValuesDto>> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token)
{ {
var date = dateBegin.ToUniversalTime(); var date = dateBegin.ToUniversalTime();
var query = this.db.Set<ChangeLog>() var query = this.db.Set<ChangeLog>()
@ -256,5 +251,5 @@ public class ChangeLogRepository : IChangeLogRepository
}; };
} }
private DataWithWellDepthAndSectionDto Convert(ChangeLog entity) => entity.Adapt<DataWithWellDepthAndSectionDto>(); private ChangeLogValuesDto Convert(ChangeLog entity) => entity.Adapt<ChangeLogValuesDto>();
} }

View File

@ -18,11 +18,14 @@ public class TimestampedValuesServiceShould
[Fact] [Fact]
public async Task TestServiceEfficiency() public async Task TestServiceEfficiency()
{ {
var discriminatorId = Guid.NewGuid(); var discriminatorIds = new[] { Guid.NewGuid(), Guid.NewGuid() };
const int count = 10; const int count = 10;
var dtos = Generate(count, DateTimeOffset.UtcNow); var dtos = Generate(count, DateTimeOffset.UtcNow);
var addRangeResult = await timestampedValuesService var addRangeResult = await timestampedValuesService
.AddRange(discriminatorId, dtos, CancellationToken.None); .AddRange(discriminatorIds.First(), dtos, CancellationToken.None);
Assert.Equal(0, addRangeResult);
addRangeResult = await timestampedValuesService
.AddRange(discriminatorIds.Last(), dtos, CancellationToken.None);
Assert.Equal(0, addRangeResult); Assert.Equal(0, addRangeResult);
var columnNames = new[] { "A", "B", "C", "D" }; var columnNames = new[] { "A", "B", "C", "D" };
@ -30,7 +33,7 @@ public class TimestampedValuesServiceShould
.AddHours(-1) .AddHours(-1)
.ToUniversalTime(); .ToUniversalTime();
var getResult = await timestampedValuesService var getResult = await timestampedValuesService
.Get(discriminatorId, geTimestamp, columnNames, 0, count, CancellationToken.None); .Get(discriminatorIds, geTimestamp, columnNames, 0, count, CancellationToken.None);
Assert.NotNull(getResult); Assert.NotNull(getResult);
Assert.Empty(getResult); Assert.Empty(getResult);
} }

View File

@ -7,7 +7,7 @@ namespace DD.Persistence.API;
/// <summary> /// <summary>
/// Интерфейс для работы с API журнала изменений /// Интерфейс для работы с API журнала изменений
/// </summary> /// </summary>
public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndSectionDto> public interface IChangeLogApi : ISyncWithDiscriminatorApi<ChangeLogValuesDto>
{ {
/// <summary> /// <summary>
/// Импорт с заменой: удаление старых строк и добавление новых /// Импорт с заменой: удаление старых строк и добавление новых
@ -16,28 +16,26 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IActionResult> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Получение данных на текущую дату (с пагинацией) /// Получение данных на текущую дату (с пагинацией)
/// </summary> /// </summary>
/// <param name="idDiscriminator"></param> /// <param name="idDiscriminator"></param>
/// <param name="filterRequest">параметры запроса фильтрации</param>
/// <param name="paginationRequest">параметры запроса пагинации</param> /// <param name="paginationRequest">параметры запроса пагинации</param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> GetCurrent(Guid idDiscriminator, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token); Task<IActionResult> GetCurrent(Guid idDiscriminator, PaginationRequest paginationRequest, CancellationToken token);
/// <summary> /// <summary>
/// Получение данных на определенную дату (с пагинацией) /// Получение данных на определенную дату (с пагинацией)
/// </summary> /// </summary>
/// <param name="idDiscriminator"></param> /// <param name="idDiscriminator"></param>
/// <param name="moment"></param> /// <param name="moment"></param>
/// <param name="filterRequest">параметры запроса фильтрации</param>
/// <param name="paginationRequest">параметры запроса пагинации</param> /// <param name="paginationRequest">параметры запроса пагинации</param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token); Task<IActionResult> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
/// <summary> /// <summary>
/// Получение исторических данных за определенный период времени /// Получение исторических данных за определенный период времени
@ -56,7 +54,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
/// <param name="dto"></param> /// <param name="dto"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<IActionResult> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
/// <summary> /// <summary>
/// Добавить несколько записей /// Добавить несколько записей
@ -65,7 +63,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IActionResult> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Обновить одну запись /// Обновить одну запись
@ -73,7 +71,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
/// <param name="dto"></param> /// <param name="dto"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token); Task<IActionResult> Update(ChangeLogValuesDto dto, CancellationToken token);
/// <summary> /// <summary>
/// Обновить несколько записей /// Обновить несколько записей
@ -81,7 +79,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<IActionResult> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<IActionResult> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Удалить одну запись /// Удалить одну запись

View File

@ -8,7 +8,7 @@ namespace DD.Persistence.Repositories;
/// Интерфейс для работы с историческими данными /// Интерфейс для работы с историческими данными
/// </summary> /// </summary>
/// <typeparam name="TDto"></typeparam> /// <typeparam name="TDto"></typeparam>
public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWithWellDepthAndSectionDto> public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<ChangeLogValuesDto>
{ {
/// <summary> /// <summary>
/// Добавление записей /// Добавление записей
@ -18,7 +18,7 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Пометить записи как удаленные /// Пометить записи как удаленные
@ -46,7 +46,7 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Редактирование записей /// Редактирование записей
@ -55,18 +55,17 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
/// <param name="dtos"></param> /// <param name="dtos"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<int> UpdateRange(Guid idEditor, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token); Task<int> UpdateRange(Guid idEditor, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
/// <summary> /// <summary>
/// Получение актуальных записей на определенный момент времени (с пагинацией) /// Получение актуальных записей на определенный момент времени (с пагинацией)
/// </summary> /// </summary>
/// <param name="idDiscriminator"></param> /// <param name="idDiscriminator"></param>
/// <param name="moment">текущий момент времени</param> /// <param name="moment">текущий момент времени</param>
/// <param name="filterRequest">параметры запроса фильтрации</param>
/// <param name="paginationRequest">параметры запроса пагинации</param> /// <param name="paginationRequest">параметры запроса пагинации</param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns></returns> /// <returns></returns>
Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token); Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
/// <summary> /// <summary>
/// Получение измененных записей за период времени /// Получение измененных записей за период времени