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