From 14893e9bf6041a4150ff250d6fd8a2e0dcb88610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D1=8F=20=D0=91=D0=B8=D0=B7=D1=8E=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Tue, 18 Feb 2025 17:21:30 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20-=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/ChangeLogClient.cs | 27 ------------ .../Clients/Interfaces/IChangeLogClient.cs | 28 ------------- .../Interfaces/Refit/IRefitChangeLogClient.cs | 24 ++--------- ...ner.cs => 20250218121851_Init.Designer.cs} | 32 +++++++++++---- ...8060716_Init.cs => 20250218121851_Init.cs} | 21 +++++++--- ...PersistencePostgresContextModelSnapshot.cs | 30 ++++++++++---- DD.Persistence.Database/Entity/ChangeLog.cs | 14 +++++-- .../Entity/ChangeLogCommit.cs | 7 +++- .../Repositories/ChangeLogRepository.cs | 7 ++-- .../Controllers/ChangeLogControllerTest.cs | 41 ++----------------- 10 files changed, 87 insertions(+), 144 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250218060716_Init.Designer.cs => 20250218121851_Init.Designer.cs} (90%) rename DD.Persistence.Database.Postgres/Migrations/{20250218060716_Init.cs => 20250218121851_Init.cs} (90%) diff --git a/DD.Persistence.Client/Clients/ChangeLogClient.cs b/DD.Persistence.Client/Clients/ChangeLogClient.cs index e2efbb8..ab023c7 100644 --- a/DD.Persistence.Client/Clients/ChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/ChangeLogClient.cs @@ -46,15 +46,6 @@ public class ChangeLogClient : BaseClient, IChangeLogClient return result!; } - /// - public async Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token) - { - var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Add(idDiscriminator, dto, comment, token), token); - - return result; - } - /// public async Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { @@ -64,15 +55,6 @@ public class ChangeLogClient : BaseClient, IChangeLogClient return result; } - /// - public async Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token) - { - var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Update(dto, comment, token), token); - - return result; - } - /// public async Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token) { @@ -82,15 +64,6 @@ public class ChangeLogClient : BaseClient, IChangeLogClient return result; } - /// - public async Task Delete(Guid id, string comment, CancellationToken token) - { - var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Delete(id, comment, token), token); - - return result; - } - /// public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { diff --git a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs index 9106e2b..824d247 100644 --- a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs @@ -9,16 +9,6 @@ namespace DD.Persistence.Client.Clients.Interfaces; /// public interface IChangeLogClient : IDisposable { - /// - /// Добавить одну запись - /// - /// - /// - /// - /// - /// - Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Добавить несколько записей /// @@ -39,15 +29,6 @@ public interface IChangeLogClient : IDisposable /// Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Удалить одну запись - /// - /// - /// - /// - /// - Task Delete(Guid id, string comment, CancellationToken token); - /// /// Удалить несколько записей /// @@ -85,15 +66,6 @@ public interface IChangeLogClient : IDisposable /// Task GetDatesRange(Guid idDiscriminator, CancellationToken token); - /// - /// Обновить одну запись - /// - /// - /// - /// - /// - Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Обновить несколько записей /// diff --git a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs index 117586b..6d0425b 100644 --- a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs @@ -34,40 +34,22 @@ public interface IRefitChangeLogClient : IRefitClient, IDisposable [Get($"{BaseRoute}/history/{{idDiscriminator}}")] Task>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token); - /// - /// Добавить одну запись - /// - [Post($"{BaseRoute}/{{idDiscriminator}}")] - Task> Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Добавить несколько записей /// - [Post($"{BaseRoute}/range/{{idDiscriminator}}")] + [Post($"{BaseRoute}/{{idDiscriminator}}")] Task> AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Обновить одну запись - /// - [Put($"{BaseRoute}")] - Task> Update(ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Обновить несколько записей /// - [Put($"{BaseRoute}/range")] + [Put($"{BaseRoute}")] Task> UpdateRange(IEnumerable dtos, string comment, CancellationToken token); - /// - /// Удалить одну запись - /// - [Delete($"{BaseRoute}")] - Task> Delete(Guid id, string comment, CancellationToken token); - /// /// Удалить несколько записей /// - [Delete($"{BaseRoute}/range")] + [Delete($"{BaseRoute}")] Task> DeleteRange([Body] IEnumerable ids, string comment, CancellationToken token); /// diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs similarity index 90% rename from DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs index 1ba172d..360eb6f 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs @@ -13,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250218060716_Init")] + [Migration("20250218121851_Init")] partial class Init { /// @@ -45,14 +45,18 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Автор изменения"); - b.Property("IdCommit") + b.Property("IdCreatedCommit") .HasColumnType("uuid") - .HasComment("Id коммита"); + .HasComment("Id коммита на создание записи"); b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); + b.Property("IdObsoletedCommit") + .HasColumnType("uuid") + .HasComment("Id коммита на устаревание записи"); + b.Property("Obsolete") .HasColumnType("timestamp with time zone") .HasComment("Дата устаревания (например при удалении)"); @@ -64,7 +68,9 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); - b.HasIndex("IdCommit"); + b.HasIndex("IdCreatedCommit"); + + b.HasIndex("IdObsoletedCommit"); b.ToTable("change_log"); }); @@ -243,13 +249,19 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLog", b => { - b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "Commit") - .WithMany("ChangeLogItems") - .HasForeignKey("IdCommit") + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "CreatedCommit") + .WithMany("ChangeLogCreatedItems") + .HasForeignKey("IdCreatedCommit") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Commit"); + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "ObsoletedCommit") + .WithMany("ChangeLogObsoletedItems") + .HasForeignKey("IdObsoletedCommit"); + + b.Navigation("CreatedCommit"); + + b.Navigation("ObsoletedCommit"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => @@ -265,7 +277,9 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => { - b.Navigation("ChangeLogItems"); + b.Navigation("ChangeLogCreatedItems"); + + b.Navigation("ChangeLogObsoletedItems"); }); #pragma warning restore 612, 618 } diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs similarity index 90% rename from DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs index 24d21da..5fa1f53 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs @@ -105,17 +105,23 @@ namespace DD.Persistence.Database.Postgres.Migrations Obsolete = table.Column(type: "timestamp with time zone", nullable: true, comment: "Дата устаревания (например при удалении)"), IdNext = table.Column(type: "uuid", nullable: true, comment: "Id заменяющей записи"), Value = table.Column(type: "jsonb", nullable: false, comment: "Значение"), - IdCommit = table.Column(type: "uuid", nullable: false, comment: "Id коммита") + IdCreatedCommit = table.Column(type: "uuid", nullable: false, comment: "Id коммита на создание записи"), + IdObsoletedCommit = table.Column(type: "uuid", nullable: true, comment: "Id коммита на устаревание записи") }, constraints: table => { table.PrimaryKey("PK_change_log", x => x.Id); table.ForeignKey( - name: "FK_change_log_change_log_commit_IdCommit", - column: x => x.IdCommit, + name: "FK_change_log_change_log_commit_IdCreatedCommit", + column: x => x.IdCreatedCommit, principalTable: "change_log_commit", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_change_log_change_log_commit_IdObsoletedCommit", + column: x => x.IdObsoletedCommit, + principalTable: "change_log_commit", + principalColumn: "Id"); }); migrationBuilder.CreateTable( @@ -141,9 +147,14 @@ namespace DD.Persistence.Database.Postgres.Migrations }); migrationBuilder.CreateIndex( - name: "IX_change_log_IdCommit", + name: "IX_change_log_IdCreatedCommit", table: "change_log", - column: "IdCommit"); + column: "IdCreatedCommit"); + + migrationBuilder.CreateIndex( + name: "IX_change_log_IdObsoletedCommit", + table: "change_log", + column: "IdObsoletedCommit"); migrationBuilder.CreateIndex( name: "IX_tech_message_SystemId", diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index c45fb18..da64be1 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -42,14 +42,18 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Автор изменения"); - b.Property("IdCommit") + b.Property("IdCreatedCommit") .HasColumnType("uuid") - .HasComment("Id коммита"); + .HasComment("Id коммита на создание записи"); b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); + b.Property("IdObsoletedCommit") + .HasColumnType("uuid") + .HasComment("Id коммита на устаревание записи"); + b.Property("Obsolete") .HasColumnType("timestamp with time zone") .HasComment("Дата устаревания (например при удалении)"); @@ -61,7 +65,9 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); - b.HasIndex("IdCommit"); + b.HasIndex("IdCreatedCommit"); + + b.HasIndex("IdObsoletedCommit"); b.ToTable("change_log"); }); @@ -240,13 +246,19 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLog", b => { - b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "Commit") - .WithMany("ChangeLogItems") - .HasForeignKey("IdCommit") + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "CreatedCommit") + .WithMany("ChangeLogCreatedItems") + .HasForeignKey("IdCreatedCommit") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Commit"); + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "ObsoletedCommit") + .WithMany("ChangeLogObsoletedItems") + .HasForeignKey("IdObsoletedCommit"); + + b.Navigation("CreatedCommit"); + + b.Navigation("ObsoletedCommit"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => @@ -262,7 +274,9 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => { - b.Navigation("ChangeLogItems"); + b.Navigation("ChangeLogCreatedItems"); + + b.Navigation("ChangeLogObsoletedItems"); }); #pragma warning restore 612, 618 } diff --git a/DD.Persistence.Database/Entity/ChangeLog.cs b/DD.Persistence.Database/Entity/ChangeLog.cs index 603f909..152f7a8 100644 --- a/DD.Persistence.Database/Entity/ChangeLog.cs +++ b/DD.Persistence.Database/Entity/ChangeLog.cs @@ -34,9 +34,15 @@ public class ChangeLog : IDiscriminatorItem, IChangeLog [Column(TypeName = "jsonb"), Comment("Значение")] public required IDictionary Value { get; set; } - [Required, Comment("Id коммита")] - public Guid IdCommit { get; set; } + [Required, Comment("Id коммита на создание записи")] + public Guid IdCreatedCommit { get; set; } - [Required, ForeignKey(nameof(IdCommit)), Comment("Коммит пользователя")] - public virtual ChangeLogCommit Commit { get; set; } = null!; + [Comment("Id коммита на устаревание записи")] + public Guid? IdObsoletedCommit { get; set; } + + [Required, ForeignKey(nameof(IdCreatedCommit)), Comment("Коммит пользователя на создание записи")] + public virtual ChangeLogCommit CreatedCommit { get; set; } = null!; + + [ForeignKey(nameof(IdObsoletedCommit)), Comment("Коммит пользователя на устаревание записи")] + public virtual ChangeLogCommit? ObsoletedCommit { get; set; } } diff --git a/DD.Persistence.Database/Entity/ChangeLogCommit.cs b/DD.Persistence.Database/Entity/ChangeLogCommit.cs index f816524..8e17df0 100644 --- a/DD.Persistence.Database/Entity/ChangeLogCommit.cs +++ b/DD.Persistence.Database/Entity/ChangeLogCommit.cs @@ -27,6 +27,9 @@ public class ChangeLogCommit [Comment("Комментарий к коммиту")] public required string Comment { get; set; } - [Required, InverseProperty(nameof(ChangeLog.Commit)), Comment("Журнал изменений")] - public virtual ICollection ChangeLogItems { get; set; } = null!; + [Required, InverseProperty(nameof(ChangeLog.CreatedCommit)), Comment("Записи, добавленные в журнал изменений")] + public virtual ICollection ChangeLogCreatedItems { get; set; } = null!; + + [InverseProperty(nameof(ChangeLog.ObsoletedCommit)), Comment("Устаревшие записи в журнале изменений")] + public virtual ICollection? ChangeLogObsoletedItems { get; set; } = null!; } diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index e4a6837..c1d01dd 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -31,7 +31,7 @@ public class ChangeLogRepository : IChangeLogRepository IdAuthor = commitDto.IdAuthor, DiscriminatorId = idDiscriminator, Value = values.Value, - IdCommit = commitDto.Id, + IdCreatedCommit = commitDto.Id, }; entities.Add(entity); @@ -59,7 +59,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.IdCommit = idCommit; + entity.IdObsoletedCommit = idCommit; } return await db.SaveChangesAsync(token); @@ -126,12 +126,13 @@ public class ChangeLogRepository : IChangeLogRepository IdAuthor = commitDto.IdAuthor, DiscriminatorId = updatedEntity.DiscriminatorId, Value = dto.Value, - IdCommit = commitDto.Id, + IdCreatedCommit = commitDto.Id, }; dbSet.Add(newEntity); updatedEntity.IdNext = newEntity.Id; updatedEntity.Obsolete = commitDto.Creation; + updatedEntity.IdObsoletedCommit = commitDto.Id; } var result = await db.SaveChangesAsync(token); diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index 1ff0d8e..b17641d 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -51,23 +51,6 @@ public class ChangeLogControllerTest : BaseIntegrationTest Assert.Equal(insertedCount * 2, result); } - [Fact] - public async Task Add_returns_success() - { - // arrange - var count = 1; - var idDiscriminator = Guid.NewGuid(); - var dtos = Generate(count); - var dto = dtos.FirstOrDefault()!; - var comment = "Создаю 1 элемент"; - - // act - var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); - - // assert - Assert.Equal(count, result); - } - [Fact] public async Task AddRange_returns_success() { @@ -87,14 +70,14 @@ public class ChangeLogControllerTest : BaseIntegrationTest [Fact] public async Task Update_returns_success() { - // arrange + //arrange dbContext.CleanupDbSet(); var idDiscriminator = Guid.NewGuid(); var dtos = Generate(1); var dto = dtos.FirstOrDefault()!; var comment = "Создаю 1 элемент"; - var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); + var result = await client.AddRange(idDiscriminator, [dto], comment, CancellationToken.None); var entity = dbContext.ChangeLog .Where(x => x.DiscriminatorId == idDiscriminator) @@ -103,7 +86,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest // act comment = "Обновляю 1 элемент"; - result = await client.Update(dto, comment, CancellationToken.None); + result = await client.UpdateRange([dto], comment, CancellationToken.None); // assert Assert.Equal(2, result); @@ -151,22 +134,6 @@ public class ChangeLogControllerTest : BaseIntegrationTest Assert.Equal(count * 2, result); } - [Fact] - public async Task Delete_returns_success() - { - // arrange - var insertedCount = 1; - var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, -1)); - var idDiscriminator = newEntitiesData.Item1; - var dto = newEntitiesData.Item2.FirstOrDefault(); - - // act - var result = await client.Delete(dto!.Id, "Удаление одной записи", CancellationToken.None); - - // assert - Assert.Equal(1, result); - } - [Fact] public async Task DeleteRange_returns_success() { @@ -335,7 +302,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest var entity = d.Adapt(); entity.DiscriminatorId = idDiscriminator; entity.Creation = DateTimeOffset.UtcNow.AddDays(generatorRandomDigits.Next(minDayCount, maxDayCount)); - entity.IdCommit = commit.Id; + entity.IdCreatedCommit = commit.Id; return entity; }).ToArray();