From b3c6acbd180ec8865d24442d80276bf13060f4dc 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, 11 Feb 2025 17:58:52 +0500 Subject: [PATCH 01/23] =?UTF-8?q?=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=91=D0=94=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20=D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B8=20=D0=B2=D1=81=D1=91,=20=D1=87=D1=82=D0=BE=20=D1=81?= =?UTF-8?q?=20=D1=8D=D1=82=D0=B8=D0=BC=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 37 +++++++++---- ...ner.cs => 20250211124554_Init.Designer.cs} | 53 ++++++++++++++++-- ...5114037_Init.cs => 20250211124554_Init.cs} | 48 +++++++++++++---- ...PersistencePostgresContextModelSnapshot.cs | 51 ++++++++++++++++-- DD.Persistence.Database/Entity/ChangeLog.cs | 9 ++-- .../Entity/ChangeLogCommit.cs | 32 +++++++++++ DD.Persistence.Database/Entity/TechMessage.cs | 18 +++---- .../EntityAbstractions/IChangeLog.cs | 5 -- .../PersistenceDbContext.cs | 2 + .../Repositories/ChangeLogRepository.cs | 54 ++++++++++++------- .../Requests/ChangeLogCommitDto.cs | 33 ++++++++++++ DD.Persistence/API/IChangeLogApi.cs | 15 ++++-- .../Repositories/IChangeLogRepository.cs | 17 +++--- 13 files changed, 294 insertions(+), 80 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250205114037_Init.Designer.cs => 20250211124554_Init.Designer.cs} (83%) rename DD.Persistence.Database.Postgres/Migrations/{20250205114037_Init.cs => 20250211124554_Init.cs} (83%) create mode 100644 DD.Persistence.Database/Entity/ChangeLogCommit.cs create mode 100644 DD.Persistence.Models/Requests/ChangeLogCommitDto.cs diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index f10ae1a..3866913 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -9,7 +9,7 @@ using DD.Persistence.Models.Common; namespace DD.Persistence.API.Controllers; [ApiController] -[Authorize] +//[Authorize] [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { @@ -25,10 +25,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task Add( [FromRoute] Guid idDiscriminator, [FromBody] ChangeLogValuesDto dto, + string comment, CancellationToken token) { - var userId = User.GetUserId(); - var result = await repository.AddRange(userId, idDiscriminator, [dto], token); + //var userId = User.GetUserId(); + var userId = Guid.NewGuid(); + var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); + var result = await repository.AddRange(idDiscriminator, changeLogCommit, token); return CreatedAtAction(nameof(Add), result); } @@ -38,10 +41,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task AddRange( [FromRoute] Guid idDiscriminator, [FromBody] IEnumerable dtos, + string comment, CancellationToken token) { - var userId = User.GetUserId(); - var result = await repository.AddRange(userId, idDiscriminator, dtos, token); + //var userId = User.GetUserId(); + var userId = Guid.NewGuid(); + var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); + var result = await repository.AddRange(idDiscriminator, changeLogCommit, token); return CreatedAtAction(nameof(AddRange), result); } @@ -71,10 +77,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task ClearAndAddRange( [FromRoute] Guid idDiscriminator, [FromBody] IEnumerable dtos, + string comment, CancellationToken token) { - var userId = User.GetUserId(); - var result = await repository.ClearAndAddRange(userId, idDiscriminator, dtos, token); + //var userId = User.GetUserId(); + var userId = Guid.NewGuid(); + var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); + var result = await repository.ClearAndAddRange(idDiscriminator, changeLogCommit, token); return Ok(result); } @@ -82,10 +91,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task Update( ChangeLogValuesDto dto, + string comment, CancellationToken token) { - var userId = User.GetUserId(); - var result = await repository.UpdateRange(userId, [dto], token); + //var userId = User.GetUserId(); + var userId = Guid.NewGuid(); + var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); + var result = await repository.UpdateRange(changeLogCommit, token); return Ok(result); } @@ -94,10 +106,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task UpdateRange( IEnumerable dtos, + string comment, CancellationToken token) { - var userId = User.GetUserId(); - var result = await repository.UpdateRange(userId, dtos, token); + //var userId = User.GetUserId(); + var userId = Guid.NewGuid(); + var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); + var result = await repository.UpdateRange(changeLogCommit, token); return Ok(result); } diff --git a/DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs similarity index 83% rename from DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs index b90d452..c3933d1 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs @@ -13,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250205114037_Init")] + [Migration("20250211124554_Init")] partial class Init { /// @@ -41,14 +41,14 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Автор изменения"); + b.Property("IdCommit") + .HasColumnType("uuid") + .HasComment("Id коммита"); + b.Property("IdDiscriminator") .HasColumnType("uuid") .HasComment("Дискриминатор таблицы"); - b.Property("IdEditor") - .HasColumnType("uuid") - .HasComment("Редактор"); - b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); @@ -64,9 +64,36 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); + b.HasIndex("IdCommit"); + b.ToTable("change_log"); }); + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasComment("Id коммита"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text") + .HasComment("Комментарий к коммиту"); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasComment("Дата создания коммита"); + + b.Property("IdCommitAuthor") + .HasColumnType("uuid") + .HasComment("Пользователь, создавший коммит"); + + b.HasKey("Id"); + + b.ToTable("change_log_commit"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataSourceSystem", b => { b.Property("SystemId") @@ -214,6 +241,17 @@ namespace DD.Persistence.Database.Postgres.Migrations b.ToTable("timestamped_values"); }); + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLog", b => + { + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "Commit") + .WithMany("ChangeLogItems") + .HasForeignKey("IdCommit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Commit"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => { b.HasOne("DD.Persistence.Database.Entity.DataSourceSystem", "System") @@ -224,6 +262,11 @@ namespace DD.Persistence.Database.Postgres.Migrations b.Navigation("System"); }); + + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => + { + b.Navigation("ChangeLogItems"); + }); #pragma warning restore 612, 618 } } diff --git a/DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs similarity index 83% rename from DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs index c872547..d71078c 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250205114037_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs @@ -13,21 +13,17 @@ namespace DD.Persistence.Database.Postgres.Migrations protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "change_log", + name: "change_log_commit", columns: table => new { - Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), - IdDiscriminator = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), - IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Автор изменения"), - IdEditor = table.Column(type: "uuid", nullable: true, comment: "Редактор"), - Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания записи"), - 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: "Значение") + Id = table.Column(type: "uuid", nullable: false, comment: "Id коммита"), + IdCommitAuthor = table.Column(type: "uuid", nullable: false, comment: "Пользователь, создавший коммит"), + Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания коммита"), + Comment = table.Column(type: "text", nullable: false, comment: "Комментарий к коммиту") }, constraints: table => { - table.PrimaryKey("PK_change_log", x => x.Id); + table.PrimaryKey("PK_change_log_commit", x => x.Id); }); migrationBuilder.CreateTable( @@ -98,6 +94,30 @@ namespace DD.Persistence.Database.Postgres.Migrations table.PrimaryKey("PK_timestamped_values", x => new { x.DiscriminatorId, x.Timestamp }); }); + migrationBuilder.CreateTable( + name: "change_log", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), + IdDiscriminator = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), + IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Автор изменения"), + Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания записи"), + 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 коммита") + }, + constraints: table => + { + table.PrimaryKey("PK_change_log", x => x.Id); + table.ForeignKey( + name: "FK_change_log_change_log_commit_IdCommit", + column: x => x.IdCommit, + principalTable: "change_log_commit", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "tech_message", columns: table => new @@ -120,6 +140,11 @@ namespace DD.Persistence.Database.Postgres.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateIndex( + name: "IX_change_log_IdCommit", + table: "change_log", + column: "IdCommit"); + migrationBuilder.CreateIndex( name: "IX_tech_message_SystemId", table: "tech_message", @@ -147,6 +172,9 @@ namespace DD.Persistence.Database.Postgres.Migrations migrationBuilder.DropTable( name: "timestamped_values"); + migrationBuilder.DropTable( + name: "change_log_commit"); + migrationBuilder.DropTable( name: "data_source_system"); } diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index e2b0921..5a98443 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -38,14 +38,14 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Автор изменения"); + b.Property("IdCommit") + .HasColumnType("uuid") + .HasComment("Id коммита"); + b.Property("IdDiscriminator") .HasColumnType("uuid") .HasComment("Дискриминатор таблицы"); - b.Property("IdEditor") - .HasColumnType("uuid") - .HasComment("Редактор"); - b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); @@ -61,9 +61,36 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); + b.HasIndex("IdCommit"); + b.ToTable("change_log"); }); + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasComment("Id коммита"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text") + .HasComment("Комментарий к коммиту"); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasComment("Дата создания коммита"); + + b.Property("IdCommitAuthor") + .HasColumnType("uuid") + .HasComment("Пользователь, создавший коммит"); + + b.HasKey("Id"); + + b.ToTable("change_log_commit"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataSourceSystem", b => { b.Property("SystemId") @@ -211,6 +238,17 @@ namespace DD.Persistence.Database.Postgres.Migrations b.ToTable("timestamped_values"); }); + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLog", b => + { + b.HasOne("DD.Persistence.Database.Entity.ChangeLogCommit", "Commit") + .WithMany("ChangeLogItems") + .HasForeignKey("IdCommit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Commit"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => { b.HasOne("DD.Persistence.Database.Entity.DataSourceSystem", "System") @@ -221,6 +259,11 @@ namespace DD.Persistence.Database.Postgres.Migrations b.Navigation("System"); }); + + modelBuilder.Entity("DD.Persistence.Database.Entity.ChangeLogCommit", b => + { + b.Navigation("ChangeLogItems"); + }); #pragma warning restore 612, 618 } } diff --git a/DD.Persistence.Database/Entity/ChangeLog.cs b/DD.Persistence.Database/Entity/ChangeLog.cs index db1537a..c513055 100644 --- a/DD.Persistence.Database/Entity/ChangeLog.cs +++ b/DD.Persistence.Database/Entity/ChangeLog.cs @@ -22,9 +22,6 @@ public class ChangeLog : IChangeLog [Comment("Автор изменения")] public Guid IdAuthor { get; set; } - [Comment("Редактор")] - public Guid? IdEditor { get; set; } - [Comment("Дата создания записи")] public DateTimeOffset Creation { get; set; } @@ -36,4 +33,10 @@ public class ChangeLog : IChangeLog [Column(TypeName = "jsonb"), Comment("Значение")] public required IDictionary Value { get; set; } + + [Required, Comment("Id коммита")] + public Guid IdCommit { get; set; } + + [Required, ForeignKey(nameof(IdCommit)), Comment("Коммит пользователя")] + public virtual ChangeLogCommit Commit { get; set; } = null!; } diff --git a/DD.Persistence.Database/Entity/ChangeLogCommit.cs b/DD.Persistence.Database/Entity/ChangeLogCommit.cs new file mode 100644 index 0000000..1addcb5 --- /dev/null +++ b/DD.Persistence.Database/Entity/ChangeLogCommit.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DD.Persistence.Database.Entity; + +/// +/// Таблица c коммитами пользователей +/// +[Table("change_log_commit")] +public class ChangeLogCommit +{ + [Key, Comment("Id коммита")] + public Guid Id { get; set; } + + [Comment("Пользователь, создавший коммит")] + public Guid IdCommitAuthor { get; set; } + + [Comment("Дата создания коммита")] + public DateTimeOffset Creation { get; set; } + + [Comment("Комментарий к коммиту")] + public required string Comment { get; set; } + + [Required, InverseProperty(nameof(ChangeLog.Commit)), Comment("Журнал изменений")] + public virtual ICollection ChangeLogItems { get; set; } = null!; +} diff --git a/DD.Persistence.Database/Entity/TechMessage.cs b/DD.Persistence.Database/Entity/TechMessage.cs index 093784f..8e8e84c 100644 --- a/DD.Persistence.Database/Entity/TechMessage.cs +++ b/DD.Persistence.Database/Entity/TechMessage.cs @@ -17,15 +17,15 @@ public class TechMessage : ITimestampedItem [Comment("Дата возникновения")] public DateTimeOffset Timestamp { get; set; } - [Column(TypeName = "varchar(512)"), Comment("Текст сообщения")] - public required string Text { get; set; } + [Column(TypeName = "varchar(512)"), Comment("Текст сообщения")] + public required string Text { get; set; } - [Required, Comment("Id системы, к которой относится сообщение")] - public required Guid SystemId { get; set; } + [Required, Comment("Id системы, к которой относится сообщение")] + public required Guid SystemId { get; set; } - [Required, ForeignKey(nameof(SystemId)), Comment("Система, к которой относится сообщение")] - public virtual required DataSourceSystem System { get; set; } + [Required, ForeignKey(nameof(SystemId)), Comment("Система, к которой относится сообщение")] + public virtual required DataSourceSystem System { get; set; } - [Comment("Статус события")] - public int EventState { get; set; } - } + [Comment("Статус события")] + public int EventState { get; set; } +} diff --git a/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs b/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs index 4d082a7..ccd9c63 100644 --- a/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs +++ b/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs @@ -15,11 +15,6 @@ public interface IChangeLog /// public Guid IdAuthor { get; set; } - /// - /// Редактор - /// - public Guid? IdEditor { get; set; } - /// /// Дата создания записи /// diff --git a/DD.Persistence.Database/PersistenceDbContext.cs b/DD.Persistence.Database/PersistenceDbContext.cs index 4b0a874..a77699c 100644 --- a/DD.Persistence.Database/PersistenceDbContext.cs +++ b/DD.Persistence.Database/PersistenceDbContext.cs @@ -16,6 +16,8 @@ public class PersistenceDbContext : DbContext public DbSet ChangeLog => Set(); + public DbSet ChangeLogAction => Set(); + public DbSet TechMessage => Set(); public DbSet ParameterData => Set(); diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index 61e907d..0c05d53 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -18,12 +18,15 @@ public class ChangeLogRepository : IChangeLogRepository this.db = db; } - public async Task AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { + var commit = CreateCommit(commitDto); + db.Set().Add(commit); + var entities = new List(); - foreach (var dto in dtos) + foreach (var values in commitDto.ChangeLogItems) { - var entity = CreateEntityFromDto(idAuthor, idDiscriminator, dto); + var entity = CreateChangeLogFromDto(idDiscriminator, commit.Id, commit.IdCommitAuthor, values); entities.Add(entity); } db.Set().AddRange(entities); @@ -71,20 +74,20 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.IdEditor = idEditor; + //entity.IdEditor = idEditor; } return await db.SaveChangesAsync(token); } - public async Task ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { var result = 0; using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(idAuthor, idDiscriminator, token); - result += await AddRange(idAuthor, idDiscriminator, dtos, token); + result += await MarkAsDeleted(commitDto.IdAuthor, idDiscriminator, token); + result += await AddRange(idDiscriminator, commitDto, token); await transaction.CommitAsync(token); @@ -92,19 +95,26 @@ public class ChangeLogRepository : IChangeLogRepository return result; } - public async Task UpdateRange(Guid idEditor, IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(ChangeLogCommitDto commitDto, CancellationToken token) { var dbSet = db.Set(); - var updatedIds = dtos.Select(d => d.Id); + var updatedIds = commitDto.ChangeLogItems.Select(d => d.Id); var updatedEntities = dbSet .Where(s => updatedIds.Contains(s.Id)) .ToDictionary(s => s.Id); var result = 0; - using var transaction = await db.Database.BeginTransactionAsync(token); - foreach (var dto in dtos) + var commit = CreateCommit(commitDto); + db.Set().Add(commit); + db.SaveChanges(); + + //using var transaction = await db.Database.BeginTransactionAsync(token); + + + + foreach (var dto in commitDto.ChangeLogItems) { var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); if (updatedEntity is null) @@ -112,16 +122,15 @@ public class ChangeLogRepository : IChangeLogRepository throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); } - var newEntity = CreateEntityFromDto(idEditor, updatedEntity.IdDiscriminator, dto); + var newEntity = CreateChangeLogFromDto(commitDto.IdAuthor, updatedEntity.IdDiscriminator, commit.Id, dto); dbSet.Add(newEntity); updatedEntity.IdNext = newEntity.Id; updatedEntity.Obsolete = DateTimeOffset.UtcNow; - updatedEntity.IdEditor = idEditor; } result = await db.SaveChangesAsync(token); - await transaction.CommitAsync(token); + //await transaction.CommitAsync(token); return result; @@ -195,7 +204,7 @@ public class ChangeLogRepository : IChangeLogRepository return datesOnly; } - private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, ChangeLogValuesDto dto) + private static ChangeLog CreateChangeLogFromDto(Guid idDiscriminator, Guid idCommit, Guid idAuthor, ChangeLogValuesDto dto) { var entity = new ChangeLog() { @@ -203,14 +212,23 @@ public class ChangeLogRepository : IChangeLogRepository Creation = DateTimeOffset.UtcNow, IdAuthor = idAuthor, IdDiscriminator = idDiscriminator, - IdEditor = idAuthor, - - Value = dto.Value + Value = dto.Value, + IdCommit = idCommit, }; return entity; } + private static ChangeLogCommit CreateCommit(ChangeLogCommitDto commitDto) + { + return new ChangeLogCommit() + { + Comment = commitDto.Comment, + Creation = DateTimeOffset.UtcNow, + IdCommitAuthor = commitDto.IdAuthor + }; + } + public async Task> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token) { var date = dateBegin.ToUniversalTime(); diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs new file mode 100644 index 0000000..28a2f09 --- /dev/null +++ b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs @@ -0,0 +1,33 @@ +namespace DD.Persistence.Models.Requests; + +/// +/// Модель коммита с изменениями +/// +public class ChangeLogCommitDto +{ + /// + /// Пользователь, совершающий коммит + /// + public Guid IdAuthor { get; set; } + + /// + /// Комментарий + /// + public string Comment { get; set; } + + /// + /// Набор изменений + /// + public IEnumerable ChangeLogItems { get; set; } + + /// + /// + /// + public ChangeLogCommitDto(Guid idAuthor, string comment, IEnumerable changeLogItems) + { + IdAuthor = idAuthor; + Comment = comment; + ChangeLogItems = changeLogItems; + } + +} diff --git a/DD.Persistence/API/IChangeLogApi.cs b/DD.Persistence/API/IChangeLogApi.cs index 5389ba2..7082bbc 100644 --- a/DD.Persistence/API/IChangeLogApi.cs +++ b/DD.Persistence/API/IChangeLogApi.cs @@ -14,9 +14,10 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// /// /// + /// /// /// - Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Получение данных на текущую дату (с пагинацией) @@ -52,34 +53,38 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// /// /// + /// комментарий /// /// - Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token); + Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Добавить несколько записей /// /// /// + /// комментарий /// /// - Task AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Обновить одну запись /// /// + /// /// /// - Task Update(ChangeLogValuesDto dto, CancellationToken token); + Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Обновить несколько записей /// /// + /// комментарий /// /// - Task UpdateRange(IEnumerable dtos, CancellationToken token); + Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token); /// /// Удалить одну запись diff --git a/DD.Persistence/Repositories/IChangeLogRepository.cs b/DD.Persistence/Repositories/IChangeLogRepository.cs index 3305e65..9dbd926 100644 --- a/DD.Persistence/Repositories/IChangeLogRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogRepository.cs @@ -1,24 +1,23 @@ using DD.Persistence.Models; using DD.Persistence.Models.Common; using DD.Persistence.Models.Requests; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; namespace DD.Persistence.Repositories; /// /// Интерфейс для работы с историческими данными /// -/// public interface IChangeLogRepository : ISyncWithDiscriminatorRepository { /// /// Добавление записей /// - /// пользователь, который добавляет /// ключ справочника - /// + /// коммит с изменениями /// /// - Task AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task AddRange(Guid idDiscriminator, ChangeLogCommitDto dto, CancellationToken token); /// /// Пометить записи как удаленные @@ -41,21 +40,19 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// Очистить и добавить новые /// - /// /// - /// + /// коммит с изменениями /// /// - Task ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token); /// /// Редактирование записей /// - /// пользователь, который редактирует - /// + /// коммит с изменениями /// /// - Task UpdateRange(Guid idEditor, IEnumerable dtos, CancellationToken token); + Task UpdateRange(ChangeLogCommitDto commitDto, CancellationToken token); /// /// Получение актуальных записей на определенный момент времени (с пагинацией) -- 2.45.2 From ebd2cff40dc7a250fad6470e95762065ee3cd3b8 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 12 Feb 2025 11:24:31 +0500 Subject: [PATCH 02/23] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B5=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D1=8F=D0=BC=D0=B8=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D1=85=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D1=80=D0=B0,=20=D0=BE=D1=82=D0=B2=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B5=20=D0=B7=D0=B0=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 8 ++-- DD.Persistence.App/appsettings.json | 2 +- .../Repositories/ChangeLogRepository.cs | 40 ++++++++++--------- DD.Persistence/API/IChangeLogApi.cs | 6 ++- .../Repositories/IChangeLogRepository.cs | 6 ++- 5 files changed, 34 insertions(+), 28 deletions(-) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 3866913..74e4a0e 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -54,20 +54,20 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [HttpDelete] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] - public async Task Delete(Guid id, CancellationToken token) + public async Task Delete(Guid id, string comment, CancellationToken token) { var userId = User.GetUserId(); - var result = await repository.MarkAsDeleted(userId, [id], token); + var result = await repository.MarkAsDeleted(userId, [id], comment, token); return Ok(result); } [HttpDelete("range")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] - public async Task DeleteRange(IEnumerable ids, CancellationToken token) + public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var result = await repository.MarkAsDeleted(userId, ids, token); + var result = await repository.MarkAsDeleted(userId, ids, comment, token); return Ok(result); } diff --git a/DD.Persistence.App/appsettings.json b/DD.Persistence.App/appsettings.json index 7ad8c67..9b0d5be 100644 --- a/DD.Persistence.App/appsettings.json +++ b/DD.Persistence.App/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True" + "DefaultConnection": "Host=localhost:5462;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True" }, "AllowedHosts": "*", "NeedUseKeyCloak": false, diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index 0c05d53..5f23d9d 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -36,7 +36,7 @@ public class ChangeLogRepository : IChangeLogRepository return result; } - public async Task MarkAsDeleted(Guid idEditor, IEnumerable ids, CancellationToken token) + public async Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token) { var query = db.Set() .Where(s => ids.Contains(s.Id)) @@ -49,12 +49,12 @@ public class ChangeLogRepository : IChangeLogRepository var entities = await query.ToArrayAsync(token); - var result = await MarkAsObsolete(idEditor, entities, token); + var result = await MarkAsObsolete(idEditor, entities, comment, token); return result; } - public async Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, CancellationToken token) + public async Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token) { var query = db.Set() .Where(s => s.IdDiscriminator == idDiscriminator) @@ -62,19 +62,26 @@ public class ChangeLogRepository : IChangeLogRepository var entities = await query.ToArrayAsync(token); - var result = await MarkAsObsolete(idEditor, entities, token); + var result = await MarkAsObsolete(idEditor, entities, comment, token); return result; } - private async Task MarkAsObsolete(Guid idEditor, IEnumerable entities, CancellationToken token) + private async Task MarkAsObsolete(Guid idEditor, IEnumerable entities, string comment, CancellationToken token) { var updateTime = DateTimeOffset.UtcNow; + var commit = new ChangeLogCommit() { + Comment = comment, + Creation = updateTime, + Id = Uuid7.Guid(), + IdCommitAuthor = idEditor + }; + db.Set().Add(commit); foreach (var entity in entities) { entity.Obsolete = updateTime; - //entity.IdEditor = idEditor; + entity.IdDiscriminator = commit.Id; } return await db.SaveChangesAsync(token); @@ -84,14 +91,16 @@ public class ChangeLogRepository : IChangeLogRepository { var result = 0; + var changeLogIds = commitDto.ChangeLogItems.Select(c => c.Id); + var comment = commitDto.Comment; + using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(commitDto.IdAuthor, idDiscriminator, token); + result += await MarkAsDeleted(commitDto.IdAuthor, changeLogIds, comment, token); result += await AddRange(idDiscriminator, commitDto, token); await transaction.CommitAsync(token); - return result; } @@ -104,15 +113,10 @@ public class ChangeLogRepository : IChangeLogRepository .Where(s => updatedIds.Contains(s.Id)) .ToDictionary(s => s.Id); - var result = 0; + using var transaction = await db.Database.BeginTransactionAsync(token); var commit = CreateCommit(commitDto); db.Set().Add(commit); - db.SaveChanges(); - - //using var transaction = await db.Database.BeginTransactionAsync(token); - - foreach (var dto in commitDto.ChangeLogItems) { @@ -122,19 +126,17 @@ public class ChangeLogRepository : IChangeLogRepository throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); } - var newEntity = CreateChangeLogFromDto(commitDto.IdAuthor, updatedEntity.IdDiscriminator, commit.Id, dto); + var newEntity = CreateChangeLogFromDto(updatedEntity.IdDiscriminator, commit.Id, commitDto.IdAuthor, dto); dbSet.Add(newEntity); updatedEntity.IdNext = newEntity.Id; updatedEntity.Obsolete = DateTimeOffset.UtcNow; } - result = await db.SaveChangesAsync(token); - //await transaction.CommitAsync(token); + var result = await db.SaveChangesAsync(token); + await transaction.CommitAsync(token); return result; - - } public async Task> GetByDate( diff --git a/DD.Persistence/API/IChangeLogApi.cs b/DD.Persistence/API/IChangeLogApi.cs index 7082bbc..9d11faa 100644 --- a/DD.Persistence/API/IChangeLogApi.cs +++ b/DD.Persistence/API/IChangeLogApi.cs @@ -90,17 +90,19 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// Удалить одну запись /// /// + /// комментарий к удалению /// /// - Task Delete(Guid id, CancellationToken token); + Task Delete(Guid id, string comment, CancellationToken token); /// /// Удалить несколько записей /// /// + /// комментарий к удалению /// /// - Task DeleteRange(IEnumerable ids, CancellationToken token); + Task DeleteRange(IEnumerable ids, string comment, CancellationToken token); /// /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) diff --git a/DD.Persistence/Repositories/IChangeLogRepository.cs b/DD.Persistence/Repositories/IChangeLogRepository.cs index 9dbd926..eb87376 100644 --- a/DD.Persistence/Repositories/IChangeLogRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogRepository.cs @@ -24,18 +24,20 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// /// ключи записей + /// комментарий к удалению /// /// - Task MarkAsDeleted(Guid idEditor, IEnumerable ids, CancellationToken token); + Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token); /// /// Пометить записи как удаленные /// /// /// дискриминатор таблицы + /// комментарий к удалению /// /// - Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, CancellationToken token); + Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token); /// /// Очистить и добавить новые -- 2.45.2 From 7c2ab3f6e233e636fda0f8ccc525ec171459dd29 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 12 Feb 2025 16:19:08 +0500 Subject: [PATCH 03/23] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20(=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangeLogRepositoryTest.cs | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs diff --git a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs new file mode 100644 index 0000000..255c9f0 --- /dev/null +++ b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs @@ -0,0 +1,108 @@ +using DD.Persistence.Database.Model; +using DD.Persistence.Database.Postgres.Repositories; +using DD.Persistence.Database.Repositories; +using DD.Persistence.Models.Common; +using DD.Persistence.Models.Requests; +using DD.Persistence.Models; +using DD.Persistence.Repositories; +using Shouldly; +using System.Text.Json; +using UuidExtensions; + +namespace DD.Persistence.Repository.Test; +public class ChangeLogRepositoryTest : IClassFixture +{ + private readonly PersistencePostgresContext context; + private readonly IChangeLogRepository repo; + + public ChangeLogRepositoryTest(RepositoryTestFixture fixture) + { + context = fixture.GetDbContext(); + repo = new ChangeLogRepository(context); + } + + //Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token); + + //Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token); + //Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token); + + private async Task ChangeLogItem(Guid idDiscriminator) + { + var idAuthor = Uuid7.Guid(); + var changeLogItems = new List() + { + new ChangeLogValuesDto(){ + Id = Uuid7.Guid(), + Value = new Dictionary(){ + { "1", 1 }, + { "2", 2 }, + { "3", 3 } + } + } + }; + var commit = new ChangeLogCommitDto(idAuthor, "Комментарий 1", changeLogItems); + return commit; + + } + + [Fact] + public async Task AddRangeReturnSuccess() + { + //act + var idDiscriminator = Uuid7.Guid(); + var commit = await ChangeLogItem(idDiscriminator); + var result = await repo.AddRange(idDiscriminator, commit, CancellationToken.None); + + //assert + Assert.Equal(2, result); + } + + + [Fact] + public async Task UpdateRangeReturnSuccess() + { + var idDiscriminator = Uuid7.Guid(); + var commit1 = await ChangeLogItem(idDiscriminator); + var commit2 = await ChangeLogItem(idDiscriminator); + + var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); + + if (items == null) + Assert.Fail("Не найдены элементы changeLog"); + + var updated = items.ToArray(); + foreach (var item in updated) + { + item.Value.Add("4", 4); + } + + //act + var commit = new ChangeLogCommitDto(Uuid7.Guid(), "Комментарий 2", updated); + result = await repo.UpdateRange(commit, CancellationToken.None); + + //assert + //изменены 2 старые записи, + //добавлены 2 новые записи + //добавлен общий коммит + //итого = 2+2+1 = 5 + Assert.Equal(5, result); + } + + [Fact] + public async Task ClearAndAddRangeReturnSuccess() + { + var idDiscriminator = Uuid7.Guid(); + await ChangeLogItem(idDiscriminator); + await ChangeLogItem(idDiscriminator); + await ChangeLogItem(idDiscriminator); + + //act + var result = await repo.ClearAndAddRange(idDiscriminator, commit, CancellationToken.None); + + //assert + Assert.Equal(2, result); + } + + + +} -- 2.45.2 From 5a44dfb10943d9efbb5f406c2e50b959d536d563 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 13 Feb 2025 12:43:37 +0500 Subject: [PATCH 04/23] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangeLogRepositoryTest.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs index 255c9f0..9f5f20a 100644 --- a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs +++ b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs @@ -63,7 +63,10 @@ public class ChangeLogRepositoryTest : IClassFixture { var idDiscriminator = Uuid7.Guid(); var commit1 = await ChangeLogItem(idDiscriminator); + var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); + var commit2 = await ChangeLogItem(idDiscriminator); + result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); @@ -92,15 +95,28 @@ public class ChangeLogRepositoryTest : IClassFixture public async Task ClearAndAddRangeReturnSuccess() { var idDiscriminator = Uuid7.Guid(); - await ChangeLogItem(idDiscriminator); - await ChangeLogItem(idDiscriminator); - await ChangeLogItem(idDiscriminator); + var commit1 = await ChangeLogItem(idDiscriminator); + var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); + + var commit2 = await ChangeLogItem(idDiscriminator); + result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); + + var commit3 = await ChangeLogItem(idDiscriminator); + result = await repo.AddRange(idDiscriminator, commit3, CancellationToken.None); //act - var result = await repo.ClearAndAddRange(idDiscriminator, commit, CancellationToken.None); + var commit4 = await ChangeLogItem(idDiscriminator); + var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); + commit4.ChangeLogItems = items; + result = await repo.ClearAndAddRange(idDiscriminator, commit4, CancellationToken.None); //assert - Assert.Equal(2, result); + //добавлены 3 записи и 3 коммита к ним, + //добавлена 1 новая запись и 1 коммит к ней + Assert.Equal(8, result); + + var paginationRequest = new PaginationRequest(); + var items2 = await repo.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddMinutes(-10), paginationRequest, CancellationToken.None); } -- 2.45.2 From 3b4af1fd8d433578e8bf52f00f88c0b1294b0cfb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 13 Feb 2025 17:57:43 +0500 Subject: [PATCH 05/23] =?UTF-8?q?=D0=9D=D0=B0=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE=20ChangeLog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 13 ++++-- .../Services/ChangeLogService.cs | 42 ++++++++++++++++++ DD.Persistence.App/appsettings.Tests.json | 4 +- .../Repositories/ChangeLogCommitRepository.cs | 44 +++++++++++++++++++ .../Repositories/ChangeLogRepository.cs | 10 +++-- .../IChangeLogCommitRepository.cs | 22 ++++++++++ 6 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 DD.Persistence.API/Services/ChangeLogService.cs create mode 100644 DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs create mode 100644 DD.Persistence/Repositories/IChangeLogCommitRepository.cs diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 74e4a0e..cf881e4 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -5,6 +5,7 @@ using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; using System.Net; using DD.Persistence.Models.Common; +using DD.Persistence.API.Services; namespace DD.Persistence.API.Controllers; @@ -13,11 +14,15 @@ namespace DD.Persistence.API.Controllers; [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { - private readonly IChangeLogRepository repository; + public ChangeLogService service { get; } - public ChangeLogController(IChangeLogRepository repository) + /// + /// ctor + /// + /// + public ChangeLogController(ChangeLogService service) { - this.repository = repository; + this.service = service; } [HttpPost("{idDiscriminator}")] @@ -31,7 +36,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); - var result = await repository.AddRange(idDiscriminator, changeLogCommit, token); + var result = await service.(idDiscriminator, changeLogCommit, token); return CreatedAtAction(nameof(Add), result); } diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs new file mode 100644 index 0000000..17c5944 --- /dev/null +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -0,0 +1,42 @@ +using DD.Persistence.Repositories; +using Microsoft.Extensions.Caching.Memory; + +namespace DD.Persistence.API.Services; +public class ChangeLogService +{ + private readonly IMemoryCache memoryCache; + private readonly IChangeLogCommitRepository commitRepository; + private readonly IChangeLogRepository repository; + private readonly TimeSpan? AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60); + + public ChangeLogService( + IMemoryCache memoryCache, + IChangeLogCommitRepository commitRepository, + IChangeLogRepository repository) + { + this.memoryCache = memoryCache; + this.commitRepository = commitRepository; + this.repository = repository; + } + + private async Task GetOrCreateAsync(Guid idUser, string comment, CancellationToken token) + { + var key = (idUser, comment); + var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) => + { + cacheEntry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow; + + var commitId = await commitRepository.Add(idUser, comment, token); + + return commitId; + }); + + return commitId; + } + + public async Task AddRange( Guid idUser, string comment, CancellationToken token) + { + var cimmitId = await GetOrCreateAsync(idUser, comment, token); + repository.AddRange(new); + } +} diff --git a/DD.Persistence.App/appsettings.Tests.json b/DD.Persistence.App/appsettings.Tests.json index 72c43d3..bf0a712 100644 --- a/DD.Persistence.App/appsettings.Tests.json +++ b/DD.Persistence.App/appsettings.Tests.json @@ -1,7 +1,7 @@ { "DbConnection": { - "Host": "postgres", - "Port": 5432, + "Host": "localhost", + "Port": 5462, "Database": "persistence", "Username": "postgres", "Password": "postgres" diff --git a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs new file mode 100644 index 0000000..aa300a6 --- /dev/null +++ b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs @@ -0,0 +1,44 @@ +using DD.Persistence.Database.Entity; +using DD.Persistence.Repositories; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UuidExtensions; + +namespace DD.Persistence.Database.Repositories; +public class ChangeLogCommitRepository : IChangeLogCommitRepository +{ + private DbContext db; + + public ChangeLogCommitRepository() + { + + } + public ChangeLogCommitRepository(DbContext db) + { + this.db = db; + } + + private virtual async Task Add(Guid idUser, string comment, CancellationToken token) { + + var commit = new ChangeLogCommit() + { + Id = Uuid7.Guid(), + IdCommitAuthor = idUser, + Comment = comment, + Creation = DateTimeOffset.UtcNow + }; + + db.Add(commit); + + await db.SaveChangesAsync(); + return commit.Id; + + } + + public abstract Task GetOrCreate(Guid idUser, string comment, CancellationToken token); +} diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index 5f23d9d..dc59715 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -12,15 +12,17 @@ namespace DD.Persistence.Database.Repositories; public class ChangeLogRepository : IChangeLogRepository { private readonly DbContext db; + private readonly IChangeLogCommitRepository changeLogCommitRepo; - public ChangeLogRepository(DbContext db) + public ChangeLogRepository(DbContext db, IChangeLogCommitRepository changeLogCommitRepo) { this.db = db; + this.changeLogCommitRepo = changeLogCommitRepo; } public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { - var commit = CreateCommit(commitDto); + var commit = changeLogCommitRepo.Get(commitDto); db.Set().Add(commit); var entities = new List(); @@ -115,7 +117,7 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - var commit = CreateCommit(commitDto); + var commit = GetOrCreate(commitDto); db.Set().Add(commit); foreach (var dto in commitDto.ChangeLogItems) @@ -221,7 +223,7 @@ public class ChangeLogRepository : IChangeLogRepository return entity; } - private static ChangeLogCommit CreateCommit(ChangeLogCommitDto commitDto) + private static ChangeLogCommit GetOrCreate(ChangeLogCommitDto commitDto) { return new ChangeLogCommit() { diff --git a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs new file mode 100644 index 0000000..a99785d --- /dev/null +++ b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DD.Persistence.Repositories; + +/// +/// +/// +public interface IChangeLogCommitRepository +{ + /// + /// + /// + /// + /// + /// + /// + Task Add(Guid idUser, string comment, CancellationToken token); +} -- 2.45.2 From 032d783d405f982c1e184df8b731b938638e0756 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: Mon, 17 Feb 2025 08:44:48 +0500 Subject: [PATCH 06/23] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=20ChangeLogService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 32 +++-- DD.Persistence.API/DependencyInjection.cs | 2 + .../Services/ChangeLogService.cs | 52 ++++++-- ....Persistence.Database.Postgres.Test.csproj | 1 + ....cs => 20250214113032_Initial.Designer.cs} | 6 +- ...4554_Init.cs => 20250214113032_Initial.cs} | 4 +- ...PersistencePostgresContextModelSnapshot.cs | 2 +- .../DependencyInjection.cs | 1 + .../Entity/ChangeLogCommit.cs | 2 +- .../Repositories/ChangeLogCommitRepository.cs | 13 +- .../Repositories/ChangeLogRepository.cs | 92 +++++--------- .../Requests/ChangeLogCommitDto.cs | 21 +++- .../ChangeLogRepositoryTest.cs | 118 ++++++++++-------- .../DD.Persistence.Repository.Test.csproj | 5 +- .../RepositoryTestFixture.cs | 9 +- .../IChangeLogCommitRepository.cs | 8 +- .../Repositories/IChangeLogRepository.cs | 12 +- 17 files changed, 222 insertions(+), 158 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250211124554_Init.Designer.cs => 20250214113032_Initial.Designer.cs} (98%) rename DD.Persistence.Database.Postgres/Migrations/{20250211124554_Init.cs => 20250214113032_Initial.cs} (97%) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index cf881e4..8869cdf 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -14,15 +14,19 @@ namespace DD.Persistence.API.Controllers; [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { + private readonly IChangeLogRepository repository; + public ChangeLogService service { get; } /// /// ctor /// /// - public ChangeLogController(ChangeLogService service) + /// + public ChangeLogController(ChangeLogService service, IChangeLogRepository repository) { this.service = service; + this.repository = repository; } [HttpPost("{idDiscriminator}")] @@ -36,7 +40,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); - var result = await service.(idDiscriminator, changeLogCommit, token); + var result = await service.AddRange(idDiscriminator, changeLogCommit, token); return CreatedAtAction(nameof(Add), result); } @@ -52,7 +56,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await repository.AddRange(idDiscriminator, changeLogCommit, token); + var result = await service.AddRange(idDiscriminator, changeLogCommit, token); return CreatedAtAction(nameof(AddRange), result); } @@ -62,7 +66,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task Delete(Guid id, string comment, CancellationToken token) { var userId = User.GetUserId(); - var result = await repository.MarkAsDeleted(userId, [id], comment, token); + var changeLogCommit = new ChangeLogCommitDto() + { + Comment = comment, + IdAuthor = userId, + Creation = DateTimeOffset.UtcNow, + }; + var result = await service.MarkAsDeleted([id], changeLogCommit, token); return Ok(result); } @@ -72,7 +82,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var result = await repository.MarkAsDeleted(userId, ids, comment, token); + var changeLogCommit = new ChangeLogCommitDto() + { + Comment = comment, + IdAuthor = userId, + Creation = DateTimeOffset.UtcNow, + }; + var result = await service.MarkAsDeleted(ids, changeLogCommit, token); return Ok(result); } @@ -88,7 +104,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await repository.ClearAndAddRange(idDiscriminator, changeLogCommit, token); + var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, token); return Ok(result); } @@ -102,7 +118,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); - var result = await repository.UpdateRange(changeLogCommit, token); + var result = await service.UpdateRange(changeLogCommit, token); return Ok(result); } @@ -117,7 +133,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi //var userId = User.GetUserId(); var userId = Guid.NewGuid(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await repository.UpdateRange(changeLogCommit, token); + var result = await service.UpdateRange(changeLogCommit, token); return Ok(result); } diff --git a/DD.Persistence.API/DependencyInjection.cs b/DD.Persistence.API/DependencyInjection.cs index b543841..1e7d507 100644 --- a/DD.Persistence.API/DependencyInjection.cs +++ b/DD.Persistence.API/DependencyInjection.cs @@ -11,6 +11,7 @@ using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; using System.Text.Json.Nodes; using DD.Persistence.Database.Entity; +using DD.Persistence.API.Services; namespace DD.Persistence.API; @@ -54,6 +55,7 @@ public static class DependencyInjection { services.AddTransient(); services.AddTransient(); + services.AddTransient(); } #region Authentication diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 17c5944..5c796fa 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -1,5 +1,9 @@ -using DD.Persistence.Repositories; +using DD.Persistence.Database.Entity; +using DD.Persistence.Models.Requests; +using DD.Persistence.Repositories; +using Microsoft.AspNetCore.Components.Forms; using Microsoft.Extensions.Caching.Memory; +using Newtonsoft.Json.Linq; namespace DD.Persistence.API.Services; public class ChangeLogService @@ -19,24 +23,56 @@ public class ChangeLogService this.repository = repository; } - private async Task GetOrCreateAsync(Guid idUser, string comment, CancellationToken token) + private async Task GetOrCreateAsync(ChangeLogCommitDto commitDto, CancellationToken token) { - var key = (idUser, comment); + var key = (commitDto.IdAuthor, commitDto.Comment); var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) => { cacheEntry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow; - var commitId = await commitRepository.Add(idUser, comment, token); + var commitId = await commitRepository.Add(commitDto, token); return commitId; }); - return commitId; } - public async Task AddRange( Guid idUser, string comment, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { - var cimmitId = await GetOrCreateAsync(idUser, comment, token); - repository.AddRange(new); + var commitId = await GetOrCreateAsync(commitDto, token); + commitDto.Id = commitId; + + var result = await repository.AddRange(idDiscriminator, commitDto, token); + return result; + } + + public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitDto commitDto, CancellationToken token) + { + var commitId = await GetOrCreateAsync(commitDto, token); + commitDto.Id = commitId; + + var result = await repository.MarkAsDeleted(commitId, ids, commitDto.Creation, token); + + return result; + } + + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) + { + var commitId = await GetOrCreateAsync(commitDto, token); + commitDto.Id = commitId; + + var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, token); + + return result; + } + + public async Task UpdateRange(ChangeLogCommitDto changeLogCommit, CancellationToken token) + { + var commitId = await GetOrCreateAsync(changeLogCommit, token); + changeLogCommit.Id = commitId; + + var result = await repository.UpdateRange(changeLogCommit, token); + + return result; } } diff --git a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj index 859acb5..ad4619f 100644 --- a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj +++ b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj @@ -17,6 +17,7 @@ + diff --git a/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs similarity index 98% rename from DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs index c3933d1..ee529fe 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs @@ -13,8 +13,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250211124554_Init")] - partial class Init + [Migration("20250214113032_Initial")] + partial class Initial { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -85,7 +85,7 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("timestamp with time zone") .HasComment("Дата создания коммита"); - b.Property("IdCommitAuthor") + b.Property("IdAuthor") .HasColumnType("uuid") .HasComment("Пользователь, создавший коммит"); diff --git a/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs similarity index 97% rename from DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs index d71078c..4168809 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250211124554_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace DD.Persistence.Database.Postgres.Migrations { /// - public partial class Init : Migration + public partial class Initial : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -17,7 +17,7 @@ namespace DD.Persistence.Database.Postgres.Migrations columns: table => new { Id = table.Column(type: "uuid", nullable: false, comment: "Id коммита"), - IdCommitAuthor = table.Column(type: "uuid", nullable: false, comment: "Пользователь, создавший коммит"), + IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Пользователь, создавший коммит"), Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания коммита"), Comment = table.Column(type: "text", nullable: false, comment: "Комментарий к коммиту") }, diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index 5a98443..236dc97 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -82,7 +82,7 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("timestamp with time zone") .HasComment("Дата создания коммита"); - b.Property("IdCommitAuthor") + b.Property("IdAuthor") .HasColumnType("uuid") .HasComment("Пользователь, создавший коммит"); diff --git a/DD.Persistence.Database/DependencyInjection.cs b/DD.Persistence.Database/DependencyInjection.cs index a9291e2..d0c7033 100644 --- a/DD.Persistence.Database/DependencyInjection.cs +++ b/DD.Persistence.Database/DependencyInjection.cs @@ -43,6 +43,7 @@ public static class DependencyInjection MapsterSetup(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/DD.Persistence.Database/Entity/ChangeLogCommit.cs b/DD.Persistence.Database/Entity/ChangeLogCommit.cs index 1addcb5..f816524 100644 --- a/DD.Persistence.Database/Entity/ChangeLogCommit.cs +++ b/DD.Persistence.Database/Entity/ChangeLogCommit.cs @@ -19,7 +19,7 @@ public class ChangeLogCommit public Guid Id { get; set; } [Comment("Пользователь, создавший коммит")] - public Guid IdCommitAuthor { get; set; } + public Guid IdAuthor { get; set; } [Comment("Дата создания коммита")] public DateTimeOffset Creation { get; set; } diff --git a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs index aa300a6..ea60f7b 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs @@ -1,4 +1,5 @@ using DD.Persistence.Database.Entity; +using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; @@ -23,22 +24,20 @@ public class ChangeLogCommitRepository : IChangeLogCommitRepository this.db = db; } - private virtual async Task Add(Guid idUser, string comment, CancellationToken token) { + public async Task Add(ChangeLogCommitDto commitDto, CancellationToken token) + { var commit = new ChangeLogCommit() { Id = Uuid7.Guid(), - IdCommitAuthor = idUser, - Comment = comment, - Creation = DateTimeOffset.UtcNow + IdAuthor = commitDto.IdAuthor, + Comment = commitDto.Comment, + Creation = commitDto.Creation, }; db.Add(commit); await db.SaveChangesAsync(); return commit.Id; - } - - public abstract Task GetOrCreate(Guid idUser, string comment, CancellationToken token); } diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index dc59715..9dc0890 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -6,29 +6,34 @@ using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; using Mapster; using Microsoft.EntityFrameworkCore; +using System; using UuidExtensions; namespace DD.Persistence.Database.Repositories; public class ChangeLogRepository : IChangeLogRepository { private readonly DbContext db; - private readonly IChangeLogCommitRepository changeLogCommitRepo; - public ChangeLogRepository(DbContext db, IChangeLogCommitRepository changeLogCommitRepo) + public ChangeLogRepository(DbContext db) { this.db = db; - this.changeLogCommitRepo = changeLogCommitRepo; } public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { - var commit = changeLogCommitRepo.Get(commitDto); - db.Set().Add(commit); - var entities = new List(); foreach (var values in commitDto.ChangeLogItems) { - var entity = CreateChangeLogFromDto(idDiscriminator, commit.Id, commit.IdCommitAuthor, values); + var entity = new ChangeLog() + { + Id = Uuid7.Guid(), + Creation = commitDto.Creation, + IdAuthor = commitDto.IdAuthor, + IdDiscriminator = idDiscriminator, + Value = values.Value, + IdCommit = commitDto.Id, + }; + entities.Add(entity); } db.Set().AddRange(entities); @@ -38,7 +43,7 @@ public class ChangeLogRepository : IChangeLogRepository return result; } - public async Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token) + public async Task MarkAsDeleted(Guid idCommit, IEnumerable ids, DateTimeOffset updateTime, CancellationToken token) { var query = db.Set() .Where(s => ids.Contains(s.Id)) @@ -51,12 +56,16 @@ public class ChangeLogRepository : IChangeLogRepository var entities = await query.ToArrayAsync(token); - var result = await MarkAsObsolete(idEditor, entities, comment, token); + foreach (var entity in entities) + { + entity.Obsolete = updateTime; + entity.IdDiscriminator = idCommit; + } - return result; + return await db.SaveChangesAsync(token); } - public async Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token) + public async Task MarkAsDeleted(Guid idDiscriminator, Guid idCommit, DateTimeOffset updateTime, CancellationToken token) { var query = db.Set() .Where(s => s.IdDiscriminator == idDiscriminator) @@ -64,31 +73,16 @@ public class ChangeLogRepository : IChangeLogRepository var entities = await query.ToArrayAsync(token); - var result = await MarkAsObsolete(idEditor, entities, comment, token); - - return result; - } - - private async Task MarkAsObsolete(Guid idEditor, IEnumerable entities, string comment, CancellationToken token) - { - var updateTime = DateTimeOffset.UtcNow; - var commit = new ChangeLogCommit() { - Comment = comment, - Creation = updateTime, - Id = Uuid7.Guid(), - IdCommitAuthor = idEditor - }; - db.Set().Add(commit); - foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.IdDiscriminator = commit.Id; + entity.IdDiscriminator = idCommit; } return await db.SaveChangesAsync(token); } + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { var result = 0; @@ -98,7 +92,7 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(commitDto.IdAuthor, changeLogIds, comment, token); + result += await MarkAsDeleted(commitDto.IdAuthor, changeLogIds, commitDto.Creation, token); result += await AddRange(idDiscriminator, commitDto, token); await transaction.CommitAsync(token); @@ -117,9 +111,6 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - var commit = GetOrCreate(commitDto); - db.Set().Add(commit); - foreach (var dto in commitDto.ChangeLogItems) { var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); @@ -128,11 +119,19 @@ public class ChangeLogRepository : IChangeLogRepository throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); } - var newEntity = CreateChangeLogFromDto(updatedEntity.IdDiscriminator, commit.Id, commitDto.IdAuthor, dto); + var newEntity = new ChangeLog() + { + Id = Uuid7.Guid(), + Creation = commitDto.Creation, + IdAuthor = commitDto.IdAuthor, + IdDiscriminator = updatedEntity.IdDiscriminator, + Value = dto.Value, + IdCommit = commitDto.Id, + }; dbSet.Add(newEntity); updatedEntity.IdNext = newEntity.Id; - updatedEntity.Obsolete = DateTimeOffset.UtcNow; + updatedEntity.Obsolete = commitDto.Creation; } var result = await db.SaveChangesAsync(token); @@ -208,31 +207,6 @@ public class ChangeLogRepository : IChangeLogRepository return datesOnly; } - private static ChangeLog CreateChangeLogFromDto(Guid idDiscriminator, Guid idCommit, Guid idAuthor, ChangeLogValuesDto dto) - { - var entity = new ChangeLog() - { - Id = Uuid7.Guid(), - Creation = DateTimeOffset.UtcNow, - IdAuthor = idAuthor, - IdDiscriminator = idDiscriminator, - Value = dto.Value, - IdCommit = idCommit, - }; - - return entity; - } - - private static ChangeLogCommit GetOrCreate(ChangeLogCommitDto commitDto) - { - return new ChangeLogCommit() - { - Comment = commitDto.Comment, - Creation = DateTimeOffset.UtcNow, - IdCommitAuthor = commitDto.IdAuthor - }; - } - public async Task> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token) { var date = dateBegin.ToUniversalTime(); diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs index 28a2f09..603f709 100644 --- a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs +++ b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs @@ -5,6 +5,16 @@ /// public class ChangeLogCommitDto { + /// + /// Id + /// + public Guid Id { get; set; } + + /// + /// Дата создания + /// + public DateTimeOffset Creation { get; set; } + /// /// Пользователь, совершающий коммит /// @@ -13,13 +23,21 @@ public class ChangeLogCommitDto /// /// Комментарий /// - public string Comment { get; set; } + public string Comment { get; set; } = string.Empty; /// /// Набор изменений /// public IEnumerable ChangeLogItems { get; set; } + /// + /// ctor + /// + public ChangeLogCommitDto() + { + + } + /// /// /// @@ -28,6 +46,7 @@ public class ChangeLogCommitDto IdAuthor = idAuthor; Comment = comment; ChangeLogItems = changeLogItems; + Creation = DateTimeOffset.UtcNow; } } diff --git a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs index 9f5f20a..22e11c1 100644 --- a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs +++ b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs @@ -5,20 +5,28 @@ using DD.Persistence.Models.Common; using DD.Persistence.Models.Requests; using DD.Persistence.Models; using DD.Persistence.Repositories; -using Shouldly; using System.Text.Json; using UuidExtensions; +using DD.Persistence.API.Services; +using Microsoft.Extensions.Caching.Memory; +using DD.Persistence.Database; namespace DD.Persistence.Repository.Test; public class ChangeLogRepositoryTest : IClassFixture { private readonly PersistencePostgresContext context; private readonly IChangeLogRepository repo; + private readonly RepositoryTestFixture fixture; - public ChangeLogRepositoryTest(RepositoryTestFixture fixture) + public ChangeLogService service { get; } + + public ChangeLogRepositoryTest(RepositoryTestFixture fixture, ChangeLogService changeLogService) { + this.fixture = fixture; context = fixture.GetDbContext(); - repo = new ChangeLogRepository(context); + //sut = new SetpointRepository(context); + + //service = new ChangeLogService(cache, ); } //Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token); @@ -26,7 +34,7 @@ public class ChangeLogRepositoryTest : IClassFixture //Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token); //Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token); - private async Task ChangeLogItem(Guid idDiscriminator) + private ChangeLogCommitDto CreateChangeLogItem(Guid idDiscriminator) { var idAuthor = Uuid7.Guid(); var changeLogItems = new List() @@ -49,75 +57,75 @@ public class ChangeLogRepositoryTest : IClassFixture public async Task AddRangeReturnSuccess() { //act - var idDiscriminator = Uuid7.Guid(); - var commit = await ChangeLogItem(idDiscriminator); - var result = await repo.AddRange(idDiscriminator, commit, CancellationToken.None); + var id Discriminator = Uuid7.Guid(); + var commit = CreateChangeLogItem(idDiscriminator); + var result = await service.AddRange(idDiscriminator, commit, CancellationToken.None); //assert Assert.Equal(2, result); } - [Fact] - public async Task UpdateRangeReturnSuccess() - { - var idDiscriminator = Uuid7.Guid(); - var commit1 = await ChangeLogItem(idDiscriminator); - var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); + //[Fact] + //public async Task UpdateRangeReturnSuccess() + //{ + // var idDiscriminator = Uuid7.Guid(); + // var commit1 = await CreateChangeLogItem(idDiscriminator); + // var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); - var commit2 = await ChangeLogItem(idDiscriminator); - result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); + // var commit2 = await CreateChangeLogItem(idDiscriminator); + // result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); - var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); + // var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); - if (items == null) - Assert.Fail("Не найдены элементы changeLog"); + // if (items == null) + // Assert.Fail("Не найдены элементы changeLog"); - var updated = items.ToArray(); - foreach (var item in updated) - { - item.Value.Add("4", 4); - } + // var updated = items.ToArray(); + // foreach (var item in updated) + // { + // item.Value.Add("4", 4); + // } - //act - var commit = new ChangeLogCommitDto(Uuid7.Guid(), "Комментарий 2", updated); - result = await repo.UpdateRange(commit, CancellationToken.None); + // //act + // var commit = new ChangeLogCommitDto(Uuid7.Guid(), "Комментарий 2", updated); + // result = await repo.UpdateRange(commit, CancellationToken.None); - //assert - //изменены 2 старые записи, - //добавлены 2 новые записи - //добавлен общий коммит - //итого = 2+2+1 = 5 - Assert.Equal(5, result); - } + // //assert + // //изменены 2 старые записи, + // //добавлены 2 новые записи + // //добавлен общий коммит + // //итого = 2+2+1 = 5 + // Assert.Equal(5, result); + //} - [Fact] - public async Task ClearAndAddRangeReturnSuccess() - { - var idDiscriminator = Uuid7.Guid(); - var commit1 = await ChangeLogItem(idDiscriminator); - var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); + //[Fact] + //public async Task ClearAndAddRangeReturnSuccess() + //{ + // var idDiscriminator = Uuid7.Guid(); + // var commit1 = await CreateChangeLogItem(idDiscriminator); + // var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); - var commit2 = await ChangeLogItem(idDiscriminator); - result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); + // var commit2 = await CreateChangeLogItem(idDiscriminator); + // result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); - var commit3 = await ChangeLogItem(idDiscriminator); - result = await repo.AddRange(idDiscriminator, commit3, CancellationToken.None); + // var commit3 = await CreateChangeLogItem(idDiscriminator); + // result = await repo.AddRange(idDiscriminator, commit3, CancellationToken.None); - //act - var commit4 = await ChangeLogItem(idDiscriminator); - var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); - commit4.ChangeLogItems = items; - result = await repo.ClearAndAddRange(idDiscriminator, commit4, CancellationToken.None); + // //act + // var commit4 = await CreateChangeLogItem(idDiscriminator); + // var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); + // commit4.ChangeLogItems = items; + // result = await repo.ClearAndAddRange(idDiscriminator, commit4, CancellationToken.None); - //assert - //добавлены 3 записи и 3 коммита к ним, - //добавлена 1 новая запись и 1 коммит к ней - Assert.Equal(8, result); + // //assert + // //добавлены 3 записи и 3 коммита к ним, + // //добавлена 1 новая запись и 1 коммит к ней + // Assert.Equal(8, result); - var paginationRequest = new PaginationRequest(); - var items2 = await repo.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddMinutes(-10), paginationRequest, CancellationToken.None); - } + // var paginationRequest = new PaginationRequest(); + // var items2 = await repo.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddMinutes(-10), paginationRequest, CancellationToken.None); + //} diff --git a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj index 63b4134..d76682b 100644 --- a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj +++ b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj @@ -11,14 +11,15 @@ - - + + + diff --git a/DD.Persistence.Repository.Test/RepositoryTestFixture.cs b/DD.Persistence.Repository.Test/RepositoryTestFixture.cs index 81e3694..56a6857 100644 --- a/DD.Persistence.Repository.Test/RepositoryTestFixture.cs +++ b/DD.Persistence.Repository.Test/RepositoryTestFixture.cs @@ -10,7 +10,14 @@ namespace DD.Persistence.Repository.Test; public class RepositoryTestFixture : IAsyncLifetime { - public readonly PostgreSqlContainer dbContainer = new PostgreSqlBuilder().Build(); + public readonly PostgreSqlContainer dbContainer = new PostgreSqlBuilder() + .WithImage("timescale/timescaledb:latest-pg16") + .WithHostname("localhost") + .WithDatabase("persistence") + .WithUsername("postgres") + .WithPassword("postgres") + //.WithPortBinding("5462") + .Build(); public PersistencePostgresContext GetDbContext() => new(new DbContextOptionsBuilder() diff --git a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs index a99785d..0babd3c 100644 --- a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs @@ -1,4 +1,5 @@ -using System; +using DD.Persistence.Models.Requests; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -14,9 +15,8 @@ public interface IChangeLogCommitRepository /// /// /// - /// - /// + /// /// /// - Task Add(Guid idUser, string comment, CancellationToken token); + Task Add(ChangeLogCommitDto commitDto, CancellationToken token); } diff --git a/DD.Persistence/Repositories/IChangeLogRepository.cs b/DD.Persistence/Repositories/IChangeLogRepository.cs index eb87376..a4421d4 100644 --- a/DD.Persistence/Repositories/IChangeLogRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogRepository.cs @@ -22,22 +22,22 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// Пометить записи как удаленные /// - /// + /// /// ключи записей - /// комментарий к удалению + /// /// /// - Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token); + Task MarkAsDeleted(Guid idCommit, IEnumerable ids, DateTimeOffset updateTime, CancellationToken token); /// /// Пометить записи как удаленные /// - /// /// дискриминатор таблицы - /// комментарий к удалению + /// + /// /// /// - Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token); + Task MarkAsDeleted(Guid idDiscriminator, Guid idCommit, DateTimeOffset updateTime, CancellationToken token); /// /// Очистить и добавить новые -- 2.45.2 From 09cfccaa380b4f58ea6f11fe4fd3fa5247093032 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 17 Feb 2025 11:23:43 +0500 Subject: [PATCH 07/23] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20DD.Persistence.Repository.Test=20?= =?UTF-8?q?=D0=B2=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangeLogRepositoryTest.cs | 132 ------------------ .../DD.Persistence.Repository.Test.csproj | 1 - .../RepositoryTestFixture.cs | 9 +- 3 files changed, 1 insertion(+), 141 deletions(-) delete mode 100644 DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs diff --git a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs b/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs deleted file mode 100644 index 22e11c1..0000000 --- a/DD.Persistence.Repository.Test/ChangeLogRepositoryTest.cs +++ /dev/null @@ -1,132 +0,0 @@ -using DD.Persistence.Database.Model; -using DD.Persistence.Database.Postgres.Repositories; -using DD.Persistence.Database.Repositories; -using DD.Persistence.Models.Common; -using DD.Persistence.Models.Requests; -using DD.Persistence.Models; -using DD.Persistence.Repositories; -using System.Text.Json; -using UuidExtensions; -using DD.Persistence.API.Services; -using Microsoft.Extensions.Caching.Memory; -using DD.Persistence.Database; - -namespace DD.Persistence.Repository.Test; -public class ChangeLogRepositoryTest : IClassFixture -{ - private readonly PersistencePostgresContext context; - private readonly IChangeLogRepository repo; - private readonly RepositoryTestFixture fixture; - - public ChangeLogService service { get; } - - public ChangeLogRepositoryTest(RepositoryTestFixture fixture, ChangeLogService changeLogService) - { - this.fixture = fixture; - context = fixture.GetDbContext(); - //sut = new SetpointRepository(context); - - //service = new ChangeLogService(cache, ); - } - - //Task MarkAsDeleted(Guid idEditor, IEnumerable ids, string comment, CancellationToken token); - - //Task MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token); - //Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token); - - private ChangeLogCommitDto CreateChangeLogItem(Guid idDiscriminator) - { - var idAuthor = Uuid7.Guid(); - var changeLogItems = new List() - { - new ChangeLogValuesDto(){ - Id = Uuid7.Guid(), - Value = new Dictionary(){ - { "1", 1 }, - { "2", 2 }, - { "3", 3 } - } - } - }; - var commit = new ChangeLogCommitDto(idAuthor, "Комментарий 1", changeLogItems); - return commit; - - } - - [Fact] - public async Task AddRangeReturnSuccess() - { - //act - var id Discriminator = Uuid7.Guid(); - var commit = CreateChangeLogItem(idDiscriminator); - var result = await service.AddRange(idDiscriminator, commit, CancellationToken.None); - - //assert - Assert.Equal(2, result); - } - - - //[Fact] - //public async Task UpdateRangeReturnSuccess() - //{ - // var idDiscriminator = Uuid7.Guid(); - // var commit1 = await CreateChangeLogItem(idDiscriminator); - // var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); - - // var commit2 = await CreateChangeLogItem(idDiscriminator); - // result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); - - // var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); - - // if (items == null) - // Assert.Fail("Не найдены элементы changeLog"); - - // var updated = items.ToArray(); - // foreach (var item in updated) - // { - // item.Value.Add("4", 4); - // } - - // //act - // var commit = new ChangeLogCommitDto(Uuid7.Guid(), "Комментарий 2", updated); - // result = await repo.UpdateRange(commit, CancellationToken.None); - - // //assert - // //изменены 2 старые записи, - // //добавлены 2 новые записи - // //добавлен общий коммит - // //итого = 2+2+1 = 5 - // Assert.Equal(5, result); - //} - - //[Fact] - //public async Task ClearAndAddRangeReturnSuccess() - //{ - // var idDiscriminator = Uuid7.Guid(); - // var commit1 = await CreateChangeLogItem(idDiscriminator); - // var result = await repo.AddRange(idDiscriminator, commit1, CancellationToken.None); - - // var commit2 = await CreateChangeLogItem(idDiscriminator); - // result = await repo.AddRange(idDiscriminator, commit2, CancellationToken.None); - - // var commit3 = await CreateChangeLogItem(idDiscriminator); - // result = await repo.AddRange(idDiscriminator, commit3, CancellationToken.None); - - // //act - // var commit4 = await CreateChangeLogItem(idDiscriminator); - // var items = await repo.GetGtDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(-1), CancellationToken.None); - // commit4.ChangeLogItems = items; - // result = await repo.ClearAndAddRange(idDiscriminator, commit4, CancellationToken.None); - - // //assert - // //добавлены 3 записи и 3 коммита к ним, - // //добавлена 1 новая запись и 1 коммит к ней - // Assert.Equal(8, result); - - // var paginationRequest = new PaginationRequest(); - // var items2 = await repo.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddMinutes(-10), paginationRequest, CancellationToken.None); - //} - - - -} diff --git a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj index d76682b..9d5a6a1 100644 --- a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj +++ b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj @@ -20,7 +20,6 @@ - diff --git a/DD.Persistence.Repository.Test/RepositoryTestFixture.cs b/DD.Persistence.Repository.Test/RepositoryTestFixture.cs index 56a6857..81e3694 100644 --- a/DD.Persistence.Repository.Test/RepositoryTestFixture.cs +++ b/DD.Persistence.Repository.Test/RepositoryTestFixture.cs @@ -10,14 +10,7 @@ namespace DD.Persistence.Repository.Test; public class RepositoryTestFixture : IAsyncLifetime { - public readonly PostgreSqlContainer dbContainer = new PostgreSqlBuilder() - .WithImage("timescale/timescaledb:latest-pg16") - .WithHostname("localhost") - .WithDatabase("persistence") - .WithUsername("postgres") - .WithPassword("postgres") - //.WithPortBinding("5462") - .Build(); + public readonly PostgreSqlContainer dbContainer = new PostgreSqlBuilder().Build(); public PersistencePostgresContext GetDbContext() => new(new DbContextOptionsBuilder() -- 2.45.2 From 05b58da1ab26313777dcfe66375dd7246d8d43a3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 17 Feb 2025 17:34:07 +0500 Subject: [PATCH 08/23] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/ChangeLogClient.cs | 28 ++-- .../Clients/Interfaces/IChangeLogClient.cs | 111 +++++++------ .../Interfaces/Refit/IRefitChangeLogClient.cs | 14 +- .../Controllers/ChangeLogControllerTest.cs | 157 ++++++++++-------- 4 files changed, 167 insertions(+), 143 deletions(-) diff --git a/DD.Persistence.Client/Clients/ChangeLogClient.cs b/DD.Persistence.Client/Clients/ChangeLogClient.cs index fa73ba9..e2efbb8 100644 --- a/DD.Persistence.Client/Clients/ChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/ChangeLogClient.cs @@ -19,10 +19,10 @@ public class ChangeLogClient : BaseClient, IChangeLogClient } /// - public async Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecuteGetResponse( - async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token); + async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, comment, token), token); return result; } @@ -47,55 +47,55 @@ public class ChangeLogClient : BaseClient, IChangeLogClient } /// - public async Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token) + public async Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token); + async () => await refitChangeLogClient.Add(idDiscriminator, dto, comment, token), token); return result; } /// - public async Task AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token); + async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, comment, token), token); return result; } /// - public async Task Update(ChangeLogValuesDto dto, CancellationToken token) + public async Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Update(dto, token), token); + async () => await refitChangeLogClient.Update(dto, comment, token), token); return result; } /// - public async Task UpdateRange(IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.UpdateRange(dtos, token), token); + async () => await refitChangeLogClient.UpdateRange(dtos, comment, token), token); return result; } /// - public async Task Delete(Guid id, CancellationToken token) + public async Task Delete(Guid id, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Delete(id, token), token); + async () => await refitChangeLogClient.Delete(id, comment, token), token); return result; } /// - public async Task DeleteRange(IEnumerable ids, CancellationToken token) + public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.DeleteRange(ids, token), token); + async () => await refitChangeLogClient.DeleteRange(ids, comment, token), token); return result; } diff --git a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs index 16a491c..9106e2b 100644 --- a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs @@ -9,48 +9,53 @@ namespace DD.Persistence.Client.Clients.Interfaces; /// public interface IChangeLogClient : IDisposable { - /// - /// Добавить одну запись - /// - /// - /// - /// - /// - Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token); + /// + /// Добавить одну запись + /// + /// + /// + /// + /// + /// + Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); - /// - /// Добавить несколько записей - /// - /// - /// - /// - /// - Task AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + /// + /// Добавить несколько записей + /// + /// + /// + /// + /// + /// + Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Импорт с заменой: удаление старых строк и добавление новых - /// - /// - /// - /// - /// - Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + /// + /// Импорт с заменой: удаление старых строк и добавление новых + /// + /// + /// + /// + /// + /// + Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Удалить одну запись - /// - /// - /// - /// - Task Delete(Guid id, CancellationToken token); + /// + /// Удалить одну запись + /// + /// + /// + /// + /// + Task Delete(Guid id, string comment, CancellationToken token); - /// - /// Удалить несколько записей - /// - /// - /// - /// - Task DeleteRange(IEnumerable ids, CancellationToken token); + /// + /// Удалить несколько записей + /// + /// + /// + /// + /// + Task DeleteRange(IEnumerable ids, string comment, CancellationToken token); /// /// Получение актуальных данных на определенную дату (с пагинацией) @@ -80,19 +85,21 @@ public interface IChangeLogClient : IDisposable /// Task GetDatesRange(Guid idDiscriminator, CancellationToken token); - /// - /// Обновить одну запись - /// - /// - /// - /// - Task Update(ChangeLogValuesDto dto, CancellationToken token); + /// + /// Обновить одну запись + /// + /// + /// + /// + /// + Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token); - /// - /// Обновить несколько записей - /// - /// - /// - /// - Task UpdateRange(IEnumerable dtos, CancellationToken token); + /// + /// Обновить несколько записей + /// + /// + /// + /// + /// + Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token); } \ No newline at end of file diff --git a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs index a07fac3..117586b 100644 --- a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs @@ -16,7 +16,7 @@ public interface IRefitChangeLogClient : IRefitClient, IDisposable /// Импорт с заменой: удаление старых строк и добавление новых /// [Post($"{BaseRoute}/replace/{{idDiscriminator}}")] - Task> ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task> ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Получение актуальных данных на определенную дату (с пагинацией) @@ -38,37 +38,37 @@ public interface IRefitChangeLogClient : IRefitClient, IDisposable /// Добавить одну запись /// [Post($"{BaseRoute}/{{idDiscriminator}}")] - Task> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token); + Task> Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Добавить несколько записей /// [Post($"{BaseRoute}/range/{{idDiscriminator}}")] - Task> AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task> AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Обновить одну запись /// [Put($"{BaseRoute}")] - Task> Update(ChangeLogValuesDto dto, CancellationToken token); + Task> Update(ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Обновить несколько записей /// [Put($"{BaseRoute}/range")] - Task> UpdateRange(IEnumerable dtos, CancellationToken token); + Task> UpdateRange(IEnumerable dtos, string comment, CancellationToken token); /// /// Удалить одну запись /// [Delete($"{BaseRoute}")] - Task> Delete(Guid id, CancellationToken token); + Task> Delete(Guid id, string comment, CancellationToken token); /// /// Удалить несколько записей /// [Delete($"{BaseRoute}/range")] - Task> DeleteRange([Body] IEnumerable ids, CancellationToken token); + Task> DeleteRange([Body] IEnumerable ids, string comment, CancellationToken token); /// /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index b4d90ab..8a8c7d6 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -15,6 +15,7 @@ namespace DD.Persistence.IntegrationTests.Controllers; public class ChangeLogControllerTest : BaseIntegrationTest { private readonly IChangeLogClient client; + private readonly PaginationRequest paginationRequest; private static readonly Random generatorRandomDigits = new(); public ChangeLogControllerTest(WebAppFactoryFixture factory) : base(factory) @@ -25,22 +26,13 @@ public class ChangeLogControllerTest : BaseIntegrationTest client = scope.ServiceProvider .GetRequiredService(); - } - [Fact] - public async Task ClearAndInsertRange_InEmptyDb() - { - // arrange - dbContext.CleanupDbSet(); - - var idDiscriminator = Guid.NewGuid(); - var dtos = Generate(2); - - // act - var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken()); - - // assert - Assert.Equal(2, result); + paginationRequest = new PaginationRequest() + { + Skip = 0, + Take = 10, + SortSettings = String.Empty, + }; } [Fact] @@ -48,12 +40,12 @@ public class ChangeLogControllerTest : BaseIntegrationTest { // arrange var insertedCount = 10; - var createdResult = CreateChangeLogItems(insertedCount, (-15, 15)); - var idDiscriminator = createdResult.Item1; - var dtos = createdResult.Item2.Select(e => e.Adapt()); + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, 15)); + var idDiscriminator = newEntitiesData.Item1; + var dtos = newEntitiesData.Item2; - // act - var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken()); + + var result = await client.ClearAndAddRange(idDiscriminator, dtos, "Добавление новых элементов и очистка старых", CancellationToken.None); // assert Assert.Equal(insertedCount * 2, result); @@ -67,9 +59,10 @@ public class ChangeLogControllerTest : BaseIntegrationTest var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); var dto = dtos.FirstOrDefault()!; + var comment = "Создаю 1 элемент"; // act - var result = await client.Add(idDiscriminator, dto, new CancellationToken()); + var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); // assert Assert.Equal(count, result); @@ -82,9 +75,10 @@ public class ChangeLogControllerTest : BaseIntegrationTest var count = 3; var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); + var comment = "Создаю 3 элемента"; // act - var result = await client.AddRange(idDiscriminator, dtos, new CancellationToken()); + var result = await client.AddRange(idDiscriminator, dtos, comment, CancellationToken.None); // assert Assert.Equal(count, result); @@ -99,7 +93,8 @@ public class ChangeLogControllerTest : BaseIntegrationTest var idDiscriminator = Guid.NewGuid(); var dtos = Generate(1); var dto = dtos.FirstOrDefault()!; - var result = await client.Add(idDiscriminator, dto, new CancellationToken()); + var comment = "Создаю 1 элемент"; + var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); var entity = dbContext.ChangeLog .Where(x => x.IdDiscriminator == idDiscriminator) @@ -107,7 +102,8 @@ public class ChangeLogControllerTest : BaseIntegrationTest dto = entity.Adapt(); // act - result = await client.Update(dto, new CancellationToken()); + comment = "Обновляю 1 элемент"; + result = await client.Update(dto, comment, CancellationToken.None); // assert Assert.Equal(2, result); @@ -139,21 +135,17 @@ public class ChangeLogControllerTest : BaseIntegrationTest [Fact] public async Task UpdateRange_returns_success() { - // arrange var count = 2; + var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); - var entities = dtos.Select(d => d.Adapt()).ToArray(); - dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); - - dtos = entities.Select(c => new ChangeLogValuesDto() - { - Id = c.Id, - Value = c.Value - }).ToArray(); + var comment = "Создаю 3 элемента"; // act - var result = await client.UpdateRange(dtos, new CancellationToken()); + var result = await client.AddRange(idDiscriminator, dtos, comment, CancellationToken.None); + var paginatedResult = await client.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(1), paginationRequest, CancellationToken.None); + // act + comment = "Обновляю 3 элемента"; + result = await client.UpdateRange(paginatedResult.Items, comment, CancellationToken.None); // assert Assert.Equal(count * 2, result); @@ -163,14 +155,13 @@ public class ChangeLogControllerTest : BaseIntegrationTest public async Task Delete_returns_success() { // arrange - var dtos = Generate(1); - var dto = dtos.FirstOrDefault()!; - var entity = dto.Adapt(); - dbContext.ChangeLog.Add(entity); - dbContext.SaveChanges(); + 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(entity.Id, new CancellationToken()); + var result = await client.Delete(dto!.Id, "Удаление одной записи", CancellationToken.None); // assert Assert.Equal(1, result); @@ -180,30 +171,29 @@ public class ChangeLogControllerTest : BaseIntegrationTest public async Task DeleteRange_returns_success() { // arrange - var count = 10; - var dtos = Generate(count); - var entities = dtos.Select(d => d.Adapt()).ToArray(); - dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); + var insertedCount = 10; + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, -1)); + var idDiscriminator = newEntitiesData.Item1; + var dtos = newEntitiesData.Item2; // act - var ids = entities.Select(e => e.Id); - var result = await client.DeleteRange(ids, new CancellationToken()); + var ids = dtos.Select(e => e.Id); + var result = await client.DeleteRange(ids, "Удаление нескольких записей", CancellationToken.None); // assert - Assert.Equal(count, result); + Assert.Equal(insertedCount, result); } [Fact] public async Task GetDatesRange_returns_success() { - // arrange - var changeLogItems = CreateChangeLogItems(3, (-15, 15)); + //arrange + var changeLogItems = await CreateAndReturnNewEntities(3, (-15, -1)); var idDiscriminator = changeLogItems.Item1; - var entities = changeLogItems.Item2.OrderBy(e => e.Creation); + var entities = changeLogItems.Item2.OrderBy(c => c.Creation); // act - var result = await client.GetDatesRange(idDiscriminator, new CancellationToken()); + var result = await client.GetDatesRange(idDiscriminator, CancellationToken.None); // assert Assert.NotNull(result); @@ -228,7 +218,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest //создаем записи var count = 5; - var changeLogItems = CreateChangeLogItems(count, (-15, 15)); + var changeLogItems = await CreateAndReturnNewDtos(count, (-15, 15)); var idDiscriminator = changeLogItems.Item1; var entities = changeLogItems.Item2; @@ -237,14 +227,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest var ids = entities.Select(e => e.Id); var idsToDelete = ids.Skip(2); - var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken()); - - var paginationRequest = new PaginationRequest() - { - Skip = 0, - Take = 10, - SortSettings = String.Empty, - }; + var deletedCount = await client.DeleteRange(idsToDelete, "Удаление нескольких записей", CancellationToken.None); var moment = DateTimeOffset.UtcNow.AddDays(16); var result = await client.GetByDate(idDiscriminator, moment, paginationRequest, new CancellationToken()); @@ -260,7 +243,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest } [Theory] - [InlineData(5, -15, 15, -20, 20, 10)] + [InlineData(5, -15, -5, -20, 20, 10)] [InlineData(5, -15, -10, -16, -9, 5)] public async Task GetChangeLogForInterval_returns_success( int insertedCount, @@ -276,17 +259,16 @@ public class ChangeLogControllerTest : BaseIntegrationTest //создаем записи var count = insertedCount; var daysRange = (daysBeforeNowChangeLog, daysAfterNowChangeLog); - var changeLogItems = CreateChangeLogItems(count, daysRange); + var changeLogItems = await CreateAndReturnNewDtos(count, daysRange); var idDiscriminator = changeLogItems.Item1; - var entities = changeLogItems.Item2; + var dtos = changeLogItems.Item2; - var dtos = entities.Select(e => e.Adapt()).ToArray(); - await client.UpdateRange(dtos, new CancellationToken()); + await client.UpdateRange(dtos, "Обновляем несколько записей", CancellationToken.None); //act var dateBegin = DateTimeOffset.UtcNow.AddDays(daysBeforeNowFilter); var dateEnd = DateTimeOffset.UtcNow.AddDays(daysAfterNowFilter); - var result = await client.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, new CancellationToken()); + var result = await client.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, CancellationToken.None); //assert Assert.NotNull(result); @@ -308,7 +290,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest } - private (Guid, ChangeLog[]) CreateChangeLogItems(int count, (int, int) daysRange) + private async Task<(Guid, IEnumerable)> CreateAndReturnNewDtos(int count, (int, int) daysRange) { var minDayCount = daysRange.Item1; var maxDayCount = daysRange.Item2; @@ -323,8 +305,43 @@ public class ChangeLogControllerTest : BaseIntegrationTest return entity; }).ToArray(); + + dtos = entities.Select(e => e.Adapt()); + + // act + var result = await client.AddRange(idDiscriminator, dtos, "Добавление элементов", CancellationToken.None); + var paginatedResult = await client.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(1), paginationRequest, CancellationToken.None); + return (idDiscriminator, paginatedResult.Items); + } + + private async Task<(Guid, IEnumerable)> CreateAndReturnNewEntities(int count, (int, int) daysRange) + { + var commit = new ChangeLogCommit() + { + Comment = "Комментарий к коммиту", + Creation = DateTimeOffset.UtcNow, + Id = Guid.NewGuid(), + }; + dbContext.ChangeLogAction.Add(commit); + await dbContext.SaveChangesAsync(); + + var minDayCount = daysRange.Item1; + var maxDayCount = daysRange.Item2; + + Guid idDiscriminator = Guid.NewGuid(); + var dtos = Generate(count); + var entities = dtos.Select(d => + { + var entity = d.Adapt(); + entity.IdDiscriminator = idDiscriminator; + entity.Creation = DateTimeOffset.UtcNow.AddDays(generatorRandomDigits.Next(minDayCount, maxDayCount)); + entity.IdCommit = commit.Id; + + return entity; + }).ToArray(); + dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); + await dbContext.SaveChangesAsync(); return (idDiscriminator, entities); } -- 2.45.2 From da54d24745e6f8a8eb0041dafc72b23cae7a1356 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 10:34:42 +0500 Subject: [PATCH 09/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=D0=BC=20PR=20=D0=BA=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=20=D0=BF=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20=D1=81=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 34 +++------- .../Services/ChangeLogService.cs | 62 +++++++++++++++---- DD.Persistence.App/appsettings.Tests.json | 4 +- ....Persistence.Database.Postgres.Test.csproj | 1 - ...ner.cs => 20250218052129_Init.Designer.cs} | 4 +- ...3032_Initial.cs => 20250218052129_Init.cs} | 2 +- .../PersistenceDbContext.cs | 2 +- .../Repositories/ChangeLogCommitRepository.cs | 4 -- .../Controllers/ChangeLogControllerTest.cs | 8 +-- .../Requests/ChangeLogCommitDto.cs | 8 --- .../DD.Persistence.Repository.Test.csproj | 2 +- .../IChangeLogCommitRepository.cs | 4 +- 12 files changed, 73 insertions(+), 62 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250214113032_Initial.Designer.cs => 20250218052129_Init.Designer.cs} (99%) rename DD.Persistence.Database.Postgres/Migrations/{20250214113032_Initial.cs => 20250218052129_Init.cs} (99%) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 8869cdf..d573c99 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -10,13 +10,12 @@ using DD.Persistence.API.Services; namespace DD.Persistence.API.Controllers; [ApiController] -//[Authorize] +[Authorize] [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { private readonly IChangeLogRepository repository; - - public ChangeLogService service { get; } + private ChangeLogService service { get; } /// /// ctor @@ -37,8 +36,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi string comment, CancellationToken token) { - //var userId = User.GetUserId(); - var userId = Guid.NewGuid(); + var userId = User.GetUserId(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); var result = await service.AddRange(idDiscriminator, changeLogCommit, token); @@ -53,8 +51,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi string comment, CancellationToken token) { - //var userId = User.GetUserId(); - var userId = Guid.NewGuid(); + var userId = User.GetUserId(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); var result = await service.AddRange(idDiscriminator, changeLogCommit, token); @@ -66,12 +63,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task Delete(Guid id, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto() - { - Comment = comment, - IdAuthor = userId, - Creation = DateTimeOffset.UtcNow, - }; + var changeLogCommit = new ChangeLogCommitDto(userId, comment, Enumerable.Empty()); var result = await service.MarkAsDeleted([id], changeLogCommit, token); return Ok(result); @@ -82,12 +74,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto() - { - Comment = comment, - IdAuthor = userId, - Creation = DateTimeOffset.UtcNow, - }; + var changeLogCommit = new ChangeLogCommitDto(userId, comment, Enumerable.Empty()); var result = await service.MarkAsDeleted(ids, changeLogCommit, token); return Ok(result); @@ -101,8 +88,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi string comment, CancellationToken token) { - //var userId = User.GetUserId(); - var userId = Guid.NewGuid(); + var userId = User.GetUserId(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, token); return Ok(result); @@ -115,8 +101,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi string comment, CancellationToken token) { - //var userId = User.GetUserId(); - var userId = Guid.NewGuid(); + var userId = User.GetUserId(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); var result = await service.UpdateRange(changeLogCommit, token); @@ -130,8 +115,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi string comment, CancellationToken token) { - //var userId = User.GetUserId(); - var userId = Guid.NewGuid(); + var userId = User.GetUserId(); var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); var result = await service.UpdateRange(changeLogCommit, token); diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 5c796fa..39bdd52 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -1,18 +1,25 @@ -using DD.Persistence.Database.Entity; -using DD.Persistence.Models.Requests; +using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; -using Microsoft.AspNetCore.Components.Forms; using Microsoft.Extensions.Caching.Memory; -using Newtonsoft.Json.Linq; namespace DD.Persistence.API.Services; -public class ChangeLogService + +/// +/// Сервис по работе с журналом изменений +/// +public class ChangeLogService { private readonly IMemoryCache memoryCache; private readonly IChangeLogCommitRepository commitRepository; private readonly IChangeLogRepository repository; private readonly TimeSpan? AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60); + /// + /// ctor + /// + /// + /// + /// public ChangeLogService( IMemoryCache memoryCache, IChangeLogCommitRepository commitRepository, @@ -23,7 +30,13 @@ public class ChangeLogService this.repository = repository; } - private async Task GetOrCreateAsync(ChangeLogCommitDto commitDto, CancellationToken token) + /// + /// Создание или чтение данных коммита + /// + /// + /// + /// + private async Task GetOrCreateCommitAsync(ChangeLogCommitDto commitDto, CancellationToken token) { var key = (commitDto.IdAuthor, commitDto.Comment); var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) => @@ -37,18 +50,32 @@ public class ChangeLogService return commitId; } + /// + /// Добавление записи в журнал изменений + /// + /// + /// + /// + /// public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { - var commitId = await GetOrCreateAsync(commitDto, token); + var commitId = await GetOrCreateCommitAsync(commitDto, token); commitDto.Id = commitId; var result = await repository.AddRange(idDiscriminator, commitDto, token); return result; } - public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitDto commitDto, CancellationToken token) + /// + /// Пометить запись журнала изменений как удаленную + /// + /// + /// + /// + /// + public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitDto commitDto, CancellationToken token) { - var commitId = await GetOrCreateAsync(commitDto, token); + var commitId = await GetOrCreateCommitAsync(commitDto, token); commitDto.Id = commitId; var result = await repository.MarkAsDeleted(commitId, ids, commitDto.Creation, token); @@ -56,9 +83,16 @@ public class ChangeLogService return result; } + /// + /// Очистить старые и добавить новые записи в журнал изменений + /// + /// + /// + /// + /// public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) { - var commitId = await GetOrCreateAsync(commitDto, token); + var commitId = await GetOrCreateCommitAsync(commitDto, token); commitDto.Id = commitId; var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, token); @@ -66,9 +100,15 @@ public class ChangeLogService return result; } + /// + /// Обновить записи в журнале изменений + /// + /// + /// + /// public async Task UpdateRange(ChangeLogCommitDto changeLogCommit, CancellationToken token) { - var commitId = await GetOrCreateAsync(changeLogCommit, token); + var commitId = await GetOrCreateCommitAsync(changeLogCommit, token); changeLogCommit.Id = commitId; var result = await repository.UpdateRange(changeLogCommit, token); diff --git a/DD.Persistence.App/appsettings.Tests.json b/DD.Persistence.App/appsettings.Tests.json index bf0a712..72c43d3 100644 --- a/DD.Persistence.App/appsettings.Tests.json +++ b/DD.Persistence.App/appsettings.Tests.json @@ -1,7 +1,7 @@ { "DbConnection": { - "Host": "localhost", - "Port": 5462, + "Host": "postgres", + "Port": 5432, "Database": "persistence", "Username": "postgres", "Password": "postgres" diff --git a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj index ad4619f..859acb5 100644 --- a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj +++ b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj @@ -17,7 +17,6 @@ - diff --git a/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs similarity index 99% rename from DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs index ee529fe..77e94da 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs @@ -13,8 +13,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250214113032_Initial")] - partial class Initial + [Migration("20250218052129_Init")] + partial class Init { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs b/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs similarity index 99% rename from DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs index 4168809..559d601 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250214113032_Initial.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace DD.Persistence.Database.Postgres.Migrations { /// - public partial class Initial : Migration + public partial class Init : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) diff --git a/DD.Persistence.Database/PersistenceDbContext.cs b/DD.Persistence.Database/PersistenceDbContext.cs index a77699c..1337b21 100644 --- a/DD.Persistence.Database/PersistenceDbContext.cs +++ b/DD.Persistence.Database/PersistenceDbContext.cs @@ -16,7 +16,7 @@ public class PersistenceDbContext : DbContext public DbSet ChangeLog => Set(); - public DbSet ChangeLogAction => Set(); + public DbSet ChangeLogCommit => Set(); public DbSet TechMessage => Set(); diff --git a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs index ea60f7b..9ae6040 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs @@ -15,10 +15,6 @@ public class ChangeLogCommitRepository : IChangeLogCommitRepository { private DbContext db; - public ChangeLogCommitRepository() - { - - } public ChangeLogCommitRepository(DbContext db) { this.db = db; diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index 8a8c7d6..91a77d3 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -40,11 +40,11 @@ public class ChangeLogControllerTest : BaseIntegrationTest { // arrange var insertedCount = 10; - var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, 15)); + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, -1)); var idDiscriminator = newEntitiesData.Item1; var dtos = newEntitiesData.Item2; - + //act var result = await client.ClearAndAddRange(idDiscriminator, dtos, "Добавление новых элементов и очистка старых", CancellationToken.None); // assert @@ -218,7 +218,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest //создаем записи var count = 5; - var changeLogItems = await CreateAndReturnNewDtos(count, (-15, 15)); + var changeLogItems = await CreateAndReturnNewDtos(count, (-15, -1)); var idDiscriminator = changeLogItems.Item1; var entities = changeLogItems.Item2; @@ -322,7 +322,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest Creation = DateTimeOffset.UtcNow, Id = Guid.NewGuid(), }; - dbContext.ChangeLogAction.Add(commit); + dbContext.ChangeLogCommit.Add(commit); await dbContext.SaveChangesAsync(); var minDayCount = daysRange.Item1; diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs index 603f709..9c4a94a 100644 --- a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs +++ b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs @@ -30,14 +30,6 @@ public class ChangeLogCommitDto /// public IEnumerable ChangeLogItems { get; set; } - /// - /// ctor - /// - public ChangeLogCommitDto() - { - - } - /// /// /// diff --git a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj index 9d5a6a1..392ac8d 100644 --- a/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj +++ b/DD.Persistence.Repository.Test/DD.Persistence.Repository.Test.csproj @@ -19,7 +19,7 @@ - + diff --git a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs index 0babd3c..6c697b2 100644 --- a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs @@ -8,12 +8,12 @@ using System.Threading.Tasks; namespace DD.Persistence.Repositories; /// -/// +/// Интерфейс для работы с коммитами журнала изменений /// public interface IChangeLogCommitRepository { /// - /// + /// Добавить коммит для журнала изменений /// /// /// -- 2.45.2 From 41b44efbb3d19561bd89259e2c6030e78d73b101 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 10:55:30 +0500 Subject: [PATCH 10/23] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B9=20appsettings.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.App/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DD.Persistence.App/appsettings.json b/DD.Persistence.App/appsettings.json index 9b0d5be..7ad8c67 100644 --- a/DD.Persistence.App/appsettings.json +++ b/DD.Persistence.App/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost:5462;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True" + "DefaultConnection": "Host=localhost;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True" }, "AllowedHosts": "*", "NeedUseKeyCloak": false, -- 2.45.2 From ebe4ec0cf688512691616594a246d8489bbeca75 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 11:07:41 +0500 Subject: [PATCH 11/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D0=BC=D0=B5=D1=80=D0=B4=D0=B6=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BC=D0=B0=D1=81=D1=82=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ner.cs => 20250218060716_Init.Designer.cs} | 16 +-------------- ...8052129_Init.cs => 20250218060716_Init.cs} | 13 +----------- ...PersistencePostgresContextModelSnapshot.cs | 8 ++++---- .../Repositories/ChangeLogRepository.cs | 20 +++++++++---------- .../Controllers/ChangeLogControllerTest.cs | 2 +- 5 files changed, 17 insertions(+), 42 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250218052129_Init.Designer.cs => 20250218060716_Init.Designer.cs} (93%) rename DD.Persistence.Database.Postgres/Migrations/{20250218052129_Init.cs => 20250218060716_Init.cs} (88%) diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs similarity index 93% rename from DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs index 04d04b7..1ba172d 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.Designer.cs @@ -13,11 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] -<<<<<<<< HEAD:DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs - [Migration("20250218052129_Init")] -======== - [Migration("20250210055116_Init")] ->>>>>>>> master:DD.Persistence.Database.Postgres/Migrations/20250210055116_Init.Designer.cs + [Migration("20250218060716_Init")] partial class Init { /// @@ -49,20 +45,10 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Автор изменения"); -<<<<<<<< HEAD:DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.Designer.cs b.Property("IdCommit") .HasColumnType("uuid") .HasComment("Id коммита"); - b.Property("IdDiscriminator") - .HasColumnType("uuid") - .HasComment("Дискриминатор таблицы"); -======== - b.Property("IdEditor") - .HasColumnType("uuid") - .HasComment("Редактор"); ->>>>>>>> master:DD.Persistence.Database.Postgres/Migrations/20250210055116_Init.Designer.cs - b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs similarity index 88% rename from DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs index f3ffdca..24d21da 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250218060716_Init.cs @@ -16,21 +16,10 @@ namespace DD.Persistence.Database.Postgres.Migrations name: "change_log_commit", columns: table => new { -<<<<<<<< HEAD:DD.Persistence.Database.Postgres/Migrations/20250218052129_Init.cs Id = table.Column(type: "uuid", nullable: false, comment: "Id коммита"), IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Пользователь, создавший коммит"), Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания коммита"), Comment = table.Column(type: "text", nullable: false, comment: "Комментарий к коммиту") -======== - Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), - DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), - IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Автор изменения"), - IdEditor = table.Column(type: "uuid", nullable: true, comment: "Редактор"), - Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания записи"), - 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: "Значение") ->>>>>>>> master:DD.Persistence.Database.Postgres/Migrations/20250210055116_Init.cs }, constraints: table => { @@ -110,7 +99,7 @@ namespace DD.Persistence.Database.Postgres.Migrations columns: table => new { Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), - IdDiscriminator = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), + DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Автор изменения"), Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания записи"), Obsolete = table.Column(type: "timestamp with time zone", nullable: true, comment: "Дата устаревания (например при удалении)"), diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index 236dc97..c45fb18 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -34,6 +34,10 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("timestamp with time zone") .HasComment("Дата создания записи"); + b.Property("DiscriminatorId") + .HasColumnType("uuid") + .HasComment("Дискриминатор таблицы"); + b.Property("IdAuthor") .HasColumnType("uuid") .HasComment("Автор изменения"); @@ -42,10 +46,6 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Id коммита"); - b.Property("IdDiscriminator") - .HasColumnType("uuid") - .HasComment("Дискриминатор таблицы"); - b.Property("IdNext") .HasColumnType("uuid") .HasComment("Id заменяющей записи"); diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index 9dc0890..d69925e 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -29,7 +29,7 @@ public class ChangeLogRepository : IChangeLogRepository Id = Uuid7.Guid(), Creation = commitDto.Creation, IdAuthor = commitDto.IdAuthor, - IdDiscriminator = idDiscriminator, + DiscriminatorId = idDiscriminator, Value = values.Value, IdCommit = commitDto.Id, }; @@ -59,7 +59,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.IdDiscriminator = idCommit; + entity.IdCommit = idCommit; } return await db.SaveChangesAsync(token); @@ -68,7 +68,7 @@ public class ChangeLogRepository : IChangeLogRepository public async Task MarkAsDeleted(Guid idDiscriminator, Guid idCommit, DateTimeOffset updateTime, CancellationToken token) { var query = db.Set() - .Where(s => s.IdDiscriminator == idDiscriminator) + .Where(s => s.DiscriminatorId == idDiscriminator) .Where(e => e.Obsolete == null); var entities = await query.ToArrayAsync(token); @@ -76,7 +76,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.IdDiscriminator = idCommit; + entity.DiscriminatorId = idCommit; } return await db.SaveChangesAsync(token); @@ -124,7 +124,7 @@ public class ChangeLogRepository : IChangeLogRepository Id = Uuid7.Guid(), Creation = commitDto.Creation, IdAuthor = commitDto.IdAuthor, - IdDiscriminator = updatedEntity.IdDiscriminator, + DiscriminatorId = updatedEntity.DiscriminatorId, Value = dto.Value, IdCommit = commitDto.Id, }; @@ -156,14 +156,14 @@ public class ChangeLogRepository : IChangeLogRepository private IQueryable CreateQuery(Guid idDiscriminator) { - var query = db.Set().Where(e => e.IdDiscriminator == idDiscriminator); + var query = db.Set().Where(e => e.DiscriminatorId == idDiscriminator); return query; } public async Task> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token) { - var query = db.Set().Where(s => s.IdDiscriminator == idDiscriminator); + var query = db.Set().Where(s => s.DiscriminatorId == idDiscriminator); var min = new DateTimeOffset(dateBegin.ToUniversalTime().Date, TimeSpan.Zero); var max = new DateTimeOffset(dateEnd.ToUniversalTime().Date, TimeSpan.Zero); @@ -183,7 +183,7 @@ public class ChangeLogRepository : IChangeLogRepository public async Task> GetDatesChange(Guid idDiscriminator, CancellationToken token) { - var query = db.Set().Where(e => e.IdDiscriminator == idDiscriminator); + var query = db.Set().Where(e => e.DiscriminatorId == idDiscriminator); var datesCreateQuery = query .Select(e => e.Creation) @@ -211,7 +211,7 @@ public class ChangeLogRepository : IChangeLogRepository { var date = dateBegin.ToUniversalTime(); var query = db.Set() - .Where(e => e.IdDiscriminator == idDiscriminator) + .Where(e => e.DiscriminatorId == idDiscriminator) .Where(e => e.Creation >= date || e.Obsolete >= date); var entities = await query.ToArrayAsync(token); @@ -224,7 +224,7 @@ public class ChangeLogRepository : IChangeLogRepository public async Task GetDatesRange(Guid idDiscriminator, CancellationToken token) { var query = db.Set() - .Where(e => e.IdDiscriminator == idDiscriminator) + .Where(e => e.DiscriminatorId == idDiscriminator) .GroupBy(e => 1) .Select(group => new { diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index ba57c55..24c015e 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -333,7 +333,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest var entities = dtos.Select(d => { var entity = d.Adapt(); - entity.IdDiscriminator = idDiscriminator; + entity.DiscriminatorId = idDiscriminator; entity.Creation = DateTimeOffset.UtcNow.AddDays(generatorRandomDigits.Next(minDayCount, maxDayCount)); entity.IdCommit = commit.Id; -- 2.45.2 From 0ec2e5d99f498d4a7d5e6a533f7f52c1e7ed132a 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 11:17:04 +0500 Subject: [PATCH 12/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.Database/Repositories/ChangeLogRepository.cs | 2 +- .../Controllers/ChangeLogControllerTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index d69925e..5d49ec1 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -92,7 +92,7 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(commitDto.IdAuthor, changeLogIds, commitDto.Creation, token); + result += await MarkAsDeleted(commitDto.Id, changeLogIds, commitDto.Creation, token); result += await AddRange(idDiscriminator, commitDto, token); await transaction.CommitAsync(token); diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index 24c015e..1ff0d8e 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -244,7 +244,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest [Theory] [InlineData(5, -15, -5, -20, 20, 10)] - [InlineData(5, -15, -10, -16, -9, 5)] + [InlineData(5, -15, -10, -16, 9, 10)] public async Task GetChangeLogForInterval_returns_success( int insertedCount, int daysBeforeNowChangeLog, -- 2.45.2 From fd8bfac6a604c0a25ec5bc713004a594e73dfad9 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 15:43:27 +0500 Subject: [PATCH 13/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BA=20PR=20-=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 57 ++----------- .../Services/ChangeLogService.cs | 79 ++++++++++++++++++- DD.Persistence/API/IChangeLogApi.cs | 28 ------- 3 files changed, 85 insertions(+), 79 deletions(-) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index d573c99..6f613f7 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -14,37 +14,19 @@ namespace DD.Persistence.API.Controllers; [Route("api/[controller]")] public class ChangeLogController : ControllerBase, IChangeLogApi { - private readonly IChangeLogRepository repository; private ChangeLogService service { get; } /// /// ctor /// /// - /// - public ChangeLogController(ChangeLogService service, IChangeLogRepository repository) + public ChangeLogController(ChangeLogService service) { this.service = service; - this.repository = repository; } [HttpPost("{idDiscriminator}")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] - public async Task Add( - [FromRoute] Guid idDiscriminator, - [FromBody] ChangeLogValuesDto dto, - string comment, - CancellationToken token) - { - var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); - var result = await service.AddRange(idDiscriminator, changeLogCommit, token); - - return CreatedAtAction(nameof(Add), result); - } - - [HttpPost("range/{idDiscriminator}")] - [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] public async Task AddRange( [FromRoute] Guid idDiscriminator, [FromBody] IEnumerable dtos, @@ -60,17 +42,6 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [HttpDelete] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] - public async Task Delete(Guid id, string comment, CancellationToken token) - { - var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, Enumerable.Empty()); - var result = await service.MarkAsDeleted([id], changeLogCommit, token); - - return Ok(result); - } - - [HttpDelete("range")] - [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); @@ -96,20 +67,6 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [HttpPut] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] - public async Task Update( - ChangeLogValuesDto dto, - string comment, - CancellationToken token) - { - var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); - var result = await service.UpdateRange(changeLogCommit, token); - - return Ok(result); - } - - [HttpPut("range")] - [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task UpdateRange( IEnumerable dtos, string comment, @@ -130,7 +87,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero); - var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token); + var result = await service.GetByDate(idDiscriminator, moment, paginationRequest, token); return Ok(result); } @@ -143,7 +100,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [FromQuery] PaginationRequest paginationRequest, CancellationToken token) { - var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token); + var result = await service.GetByDate(idDiscriminator, moment, paginationRequest, token); return Ok(result); } @@ -157,7 +114,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi DateTimeOffset dateEnd, CancellationToken token) { - var result = await repository.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, token); + var result = await service.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, token); return Ok(result); } @@ -167,7 +124,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task GetDatesChange([FromRoute] Guid idDiscriminator, CancellationToken token) { - var result = await repository.GetDatesChange(idDiscriminator, token); + var result = await service.GetDatesChange(idDiscriminator, token); return Ok(result); } @@ -177,7 +134,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default) { - var result = await repository.GetGtDate(idDiscriminator, dateBegin, token); + var result = await service.GetGtDate(idDiscriminator, dateBegin, token); return Ok(result); } @@ -187,7 +144,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi [ProducesResponseType((int)HttpStatusCode.NoContent)] public async Task> GetDatesRangeAsync([FromRoute] Guid idDiscriminator, CancellationToken token) { - var result = await repository.GetDatesRange(idDiscriminator, token); + var result = await service.GetDatesRange(idDiscriminator, token); if (result is null) return NoContent(); diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 39bdd52..5ee94f1 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -1,6 +1,9 @@ -using DD.Persistence.Models.Requests; +using DD.Persistence.Models.Common; +using DD.Persistence.Models; +using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; using Microsoft.Extensions.Caching.Memory; +using DD.Persistence.Database.Entity; namespace DD.Persistence.API.Services; @@ -115,4 +118,78 @@ public class ChangeLogService return result; } + + /// + /// Получение актуальных записей на определенный момент времени (с пагинацией) + /// + /// + /// + /// + /// + /// + public async Task> GetByDate( + Guid idDiscriminator, + DateTimeOffset momentUtc, + PaginationRequest paginationRequest, + CancellationToken token) + { + var result = await repository.GetByDate(idDiscriminator, momentUtc, paginationRequest, token); + + return result; + } + + /// + /// Получение измененных записей за период времени + /// + /// + /// + /// + /// + /// + public async Task> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token) + { + var result = await repository.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, token); + + return result; + } + + /// + /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) + /// + /// + /// + /// + public async Task> GetDatesChange(Guid idDiscriminator, CancellationToken token) + { + var result = await repository.GetDatesChange(idDiscriminator, token); + + return result; + } + + /// + /// Получить данные, начиная с определенной даты + /// + /// + /// + /// + /// + public async Task> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token) + { + var result = await repository.GetGtDate(idDiscriminator, dateBegin, token); + + return result; + } + + /// + /// Получить диапазон дат, для которых есть данные в репозитории + /// + /// + /// + /// + public async Task GetDatesRange(Guid idDiscriminator, CancellationToken token) + { + var result = await repository.GetDatesRange(idDiscriminator, token); + + return result; + } } diff --git a/DD.Persistence/API/IChangeLogApi.cs b/DD.Persistence/API/IChangeLogApi.cs index 9d11faa..0c69d4f 100644 --- a/DD.Persistence/API/IChangeLogApi.cs +++ b/DD.Persistence/API/IChangeLogApi.cs @@ -48,16 +48,6 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// Task GetChangeLogForDate(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token); - /// - /// Добавить одну запись - /// - /// - /// - /// комментарий - /// - /// - Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Добавить несколько записей /// @@ -68,15 +58,6 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Обновить одну запись - /// - /// - /// - /// - /// - Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token); - /// /// Обновить несколько записей /// @@ -86,15 +67,6 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi /// Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token); - /// - /// Удалить одну запись - /// - /// - /// комментарий к удалению - /// - /// - Task Delete(Guid id, string comment, CancellationToken token); - /// /// Удалить несколько записей /// -- 2.45.2 From baba1a05c0ac36e5f61f520f9ce30e0941ef5a3f 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 15:53:54 +0500 Subject: [PATCH 14/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20PR=20-=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 14 +++++++------- DD.Persistence.API/Services/ChangeLogService.cs | 15 +++++++++------ .../Repositories/ChangeLogRepository.cs | 16 ++++++++-------- .../Requests/ChangeLogCommitDto.cs | 8 +------- .../Repositories/IChangeLogRepository.cs | 9 ++++++--- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 6f613f7..e01193d 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -34,8 +34,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await service.AddRange(idDiscriminator, changeLogCommit, token); + var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var result = await service.AddRange(idDiscriminator, changeLogCommit, dtos, token); return CreatedAtAction(nameof(AddRange), result); } @@ -45,7 +45,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, Enumerable.Empty()); + var changeLogCommit = new ChangeLogCommitDto(userId, comment); var result = await service.MarkAsDeleted(ids, changeLogCommit, token); return Ok(result); @@ -60,8 +60,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, token); + var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, dtos, token); return Ok(result); } @@ -73,8 +73,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment, dtos); - var result = await service.UpdateRange(changeLogCommit, token); + var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var result = await service.UpdateRange(changeLogCommit, dtos, token); return Ok(result); } diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 5ee94f1..5b33cd8 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -58,14 +58,15 @@ public class ChangeLogService /// /// /// + /// /// /// - public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitDto, token); commitDto.Id = commitId; - var result = await repository.AddRange(idDiscriminator, commitDto, token); + var result = await repository.AddRange(idDiscriminator, commitDto, dtos, token); return result; } @@ -91,14 +92,15 @@ public class ChangeLogService /// /// /// + /// /// /// - public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitDto, token); commitDto.Id = commitId; - var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, token); + var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, dtos, token); return result; } @@ -107,14 +109,15 @@ public class ChangeLogService /// Обновить записи в журнале изменений /// /// + /// /// /// - public async Task UpdateRange(ChangeLogCommitDto changeLogCommit, CancellationToken token) + public async Task UpdateRange(ChangeLogCommitDto changeLogCommit, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(changeLogCommit, token); changeLogCommit.Id = commitId; - var result = await repository.UpdateRange(changeLogCommit, token); + var result = await repository.UpdateRange(changeLogCommit, dtos, token); return result; } diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index 5d49ec1..e4a6837 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -19,10 +19,10 @@ public class ChangeLogRepository : IChangeLogRepository this.db = db; } - public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) { var entities = new List(); - foreach (var values in commitDto.ChangeLogItems) + foreach (var values in dtos) { var entity = new ChangeLog() { @@ -83,35 +83,35 @@ public class ChangeLogRepository : IChangeLogRepository } - public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) { var result = 0; - var changeLogIds = commitDto.ChangeLogItems.Select(c => c.Id); + var changeLogIds = dtos.Select(c => c.Id); var comment = commitDto.Comment; using var transaction = await db.Database.BeginTransactionAsync(token); result += await MarkAsDeleted(commitDto.Id, changeLogIds, commitDto.Creation, token); - result += await AddRange(idDiscriminator, commitDto, token); + result += await AddRange(idDiscriminator, commitDto, dtos, token); await transaction.CommitAsync(token); return result; } - public async Task UpdateRange(ChangeLogCommitDto commitDto, CancellationToken token) + public async Task UpdateRange(ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) { var dbSet = db.Set(); - var updatedIds = commitDto.ChangeLogItems.Select(d => d.Id); + var updatedIds = dtos.Select(d => d.Id); var updatedEntities = dbSet .Where(s => updatedIds.Contains(s.Id)) .ToDictionary(s => s.Id); using var transaction = await db.Database.BeginTransactionAsync(token); - foreach (var dto in commitDto.ChangeLogItems) + foreach (var dto in dtos) { var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); if (updatedEntity is null) diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs index 9c4a94a..e6252dc 100644 --- a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs +++ b/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs @@ -25,19 +25,13 @@ public class ChangeLogCommitDto /// public string Comment { get; set; } = string.Empty; - /// - /// Набор изменений - /// - public IEnumerable ChangeLogItems { get; set; } - /// /// /// - public ChangeLogCommitDto(Guid idAuthor, string comment, IEnumerable changeLogItems) + public ChangeLogCommitDto(Guid idAuthor, string comment) { IdAuthor = idAuthor; Comment = comment; - ChangeLogItems = changeLogItems; Creation = DateTimeOffset.UtcNow; } diff --git a/DD.Persistence/Repositories/IChangeLogRepository.cs b/DD.Persistence/Repositories/IChangeLogRepository.cs index a4421d4..62b89c9 100644 --- a/DD.Persistence/Repositories/IChangeLogRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogRepository.cs @@ -15,9 +15,10 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// ключ справочника /// коммит с изменениями + /// /// /// - Task AddRange(Guid idDiscriminator, ChangeLogCommitDto dto, CancellationToken token); + Task AddRange(Guid idDiscriminator, ChangeLogCommitDto dto, IEnumerable dtos, CancellationToken token); /// /// Пометить записи как удаленные @@ -44,17 +45,19 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// /// коммит с изменениями + /// /// /// - Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token); + Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token); /// /// Редактирование записей /// /// коммит с изменениями + /// /// /// - Task UpdateRange(ChangeLogCommitDto commitDto, CancellationToken token); + Task UpdateRange(ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token); /// /// Получение актуальных записей на определенный момент времени (с пагинацией) -- 2.45.2 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 15/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=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(); -- 2.45.2 From c0d28efc7048ce4750bd253fd170af9a9e339f01 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 19 Feb 2025 17:44:48 +0500 Subject: [PATCH 16/23] =?UTF-8?q?=D0=AE=D0=BD=D0=B8=D1=82-=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.Test/ChangeLogTest.cs | 249 ++++++++++++++++++ .../DD.Persistence.Test.csproj | 1 + 2 files changed, 250 insertions(+) create mode 100644 DD.Persistence.Test/ChangeLogTest.cs diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs new file mode 100644 index 0000000..d504dbe --- /dev/null +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -0,0 +1,249 @@ +using DD.Persistence.API.Services; +using DD.Persistence.Database.Entity; +using DD.Persistence.Models; +using DD.Persistence.Models.Common; +using DD.Persistence.Models.Requests; +using DD.Persistence.Repositories; +using DD.Persistence.Services; +using Microsoft.Extensions.Caching.Memory; +using Newtonsoft.Json.Linq; +using NSubstitute; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UuidExtensions; +using static NSubstitute.Arg; + +namespace DD.Persistence.Test; +public class ChangeLogTest +{ + private readonly IChangeLogCommitRepository changeLogCommitRepository = Substitute.For(); + private readonly IChangeLogRepository changeLogRepository = Substitute.For(); + private readonly IMemoryCache memoryCache = Substitute.For(); + private ChangeLogService service; + + public ChangeLogTest() + { + service = new ChangeLogService(memoryCache, changeLogCommitRepository, changeLogRepository); + } + [Fact] + public async Task AddRange() + { + var discriminatorId = Uuid7.Guid(); + var expectedCommitId = Uuid7.Guid(); + var comment = "Добавление нескольких значений"; + var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var dtos = GenerateChangeLogValuesDto(2); + + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogRepository + .AddRange( + Arg.Any(), + Arg.Any(), + Arg.Any>(), + Arg.Any()) + .Returns(2); + + var addRangeResult = await service + .AddRange(discriminatorId, commit, dtos, CancellationToken.None); + + await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); + await changeLogRepository.Received(1).AddRange(discriminatorId, commit, dtos, CancellationToken.None); + } + + [Fact] + public async Task UpdateRange() + { + var discriminatorId = Uuid7.Guid(); + var expectedCommitId = Uuid7.Guid(); + var comment = "Изменение нескольких значений"; + var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var dtos = GenerateChangeLogValuesDto(2); + + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogRepository + .UpdateRange( + Arg.Any(), + Arg.Any>(), + Arg.Any()) + .Returns(2); + + var updateRangeResult = await service + .UpdateRange(commit, dtos, CancellationToken.None); + + await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); + await changeLogRepository.Received(1).UpdateRange(commit, dtos, CancellationToken.None); + } + + [Fact] + public async Task MarkAsDeleted() + { + var discriminatorId = Uuid7.Guid(); + var expectedCommitId = Uuid7.Guid(); + var comment = "Удаление нескольких значений"; + var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var dtos = GenerateChangeLogValuesDto(2); + var dtoIds = dtos.Select(d => d.Id); + + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogRepository + .MarkAsDeleted( + Arg.Any(), + Arg.Any>(), + Arg.Any(), + Arg.Any()) + .Returns(2); + + var markAsDeletedResult = await service + .MarkAsDeleted(dtoIds, commit, CancellationToken.None); + + await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); + await changeLogRepository.Received(1).MarkAsDeleted(commit.Id, dtoIds, commit.Creation, CancellationToken.None); + } + + [Fact] + public async Task ClearAndAddRange() + { + var discriminatorId = Uuid7.Guid(); + var expectedCommitId = Uuid7.Guid(); + var comment = "Удаление и добавление нескольких значений"; + var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var dtos = GenerateChangeLogValuesDto(2); + var dtoIds = dtos.Select(d => d.Id); + + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogRepository + .ClearAndAddRange( + Arg.Any(), + Arg.Any(), + Arg.Any>(), + Arg.Any()) + .Returns(2); + + var clearAndAddResult = await service + .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + + await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); + await changeLogRepository.Received(1).ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + } + + [Fact] + public async Task GetByDate() + { + var discriminatorId = Uuid7.Guid(); + var paginationRequest = new PaginationRequest() + { + Skip = 0, + Take = 1000 + }; + var dtos = GenerateChangeLogValuesDto(5); + var items = new PaginationContainer() + { + Take = paginationRequest.Take, + Skip = paginationRequest.Skip, + Items = dtos, + Count = 10 + }; + var momentDate = DateTime.UtcNow; + + changeLogRepository + .GetByDate( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .Returns(items); + + var actualItems = await service + .GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None); + + await changeLogRepository.Received(1).GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None); + + } + + [Fact] + public async Task GetChangeLogForInterval() + { + var discriminatorId = Uuid7.Guid(); + var dtos = GenerateChangeLogDto(5); +; + var dateBegin = DateTimeOffset.UtcNow.AddDays(-5); + var dateEnd = DateTimeOffset.UtcNow; + + changeLogRepository + .GetChangeLogForInterval( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .Returns(dtos); + + var actualItems = await service + .GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None); + + await changeLogRepository.Received(1).GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None); + + } + + [Fact] + public async Task GetDatesChange() + { + var discriminatorId = Uuid7.Guid(); + + var dateBegin = DateTimeOffset.UtcNow.AddDays(-5); + var dateEnd = DateTimeOffset.UtcNow; + + var dateOnlyBegin = new DateOnly(dateBegin.Year, dateBegin.Month, dateBegin.Day); + var dateOnlyEnd = new DateOnly(dateEnd.Year, dateEnd.Month, dateEnd.Day); + + var dtos = new List() { dateOnlyBegin, dateOnlyEnd }; + + changeLogRepository + .GetDatesChange( + Arg.Any(), + Arg.Any()) + .Returns(dtos); + + var actualItems = await service + .GetDatesChange(discriminatorId, CancellationToken.None); + + await changeLogRepository.Received(1).GetDatesChange(discriminatorId, CancellationToken.None); + + } + + + private IEnumerable GenerateChangeLogValuesDto(int count) + { + var items = new List(); + for (int i = 0; i < count; i++) + { + items.Add(new ChangeLogValuesDto() + { + + Id = Uuid7.Guid(), + Value = new Dictionary + { + { "1", 1 }, + { "2", 2 } + } + + }); + } + return items; + } + + private IEnumerable GenerateChangeLogDto(int count) + { + var items = new List(); + for (int i = 0; i < count; i++) + { + items.Add(new ChangeLogDto() + { + Id = Uuid7.Guid(), + }); + } + return items; + } +} diff --git a/DD.Persistence.Test/DD.Persistence.Test.csproj b/DD.Persistence.Test/DD.Persistence.Test.csproj index f71b186..07e0780 100644 --- a/DD.Persistence.Test/DD.Persistence.Test.csproj +++ b/DD.Persistence.Test/DD.Persistence.Test.csproj @@ -16,6 +16,7 @@ + -- 2.45.2 From ba9fe675ed35dc0083b7cbee6e1746e93d648d11 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: Thu, 20 Feb 2025 12:04:08 +0500 Subject: [PATCH 17/23] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B2=20=D1=8E=D0=BD?= =?UTF-8?q?=D0=B8=D1=82-=D1=82=D0=B5=D1=81=D1=82=D0=B5=20UpdateRange=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20ChangeLog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.Test/ChangeLogTest.cs | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs index d504dbe..4fe1092 100644 --- a/DD.Persistence.Test/ChangeLogTest.cs +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -1,31 +1,22 @@ using DD.Persistence.API.Services; -using DD.Persistence.Database.Entity; using DD.Persistence.Models; using DD.Persistence.Models.Common; using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; -using DD.Persistence.Services; using Microsoft.Extensions.Caching.Memory; -using Newtonsoft.Json.Linq; using NSubstitute; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using UuidExtensions; -using static NSubstitute.Arg; namespace DD.Persistence.Test; public class ChangeLogTest { private readonly IChangeLogCommitRepository changeLogCommitRepository = Substitute.For(); private readonly IChangeLogRepository changeLogRepository = Substitute.For(); - private readonly IMemoryCache memoryCache = Substitute.For(); private ChangeLogService service; public ChangeLogTest() { + var memoryCache = new MemoryCache(new MemoryCacheOptions()); service = new ChangeLogService(memoryCache, changeLogCommitRepository, changeLogRepository); } [Fact] @@ -40,9 +31,9 @@ public class ChangeLogTest changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); changeLogRepository .AddRange( - Arg.Any(), - Arg.Any(), - Arg.Any>(), + Arg.Any(), + Arg.Any(), + Arg.Any>(), Arg.Any()) .Returns(2); @@ -57,12 +48,15 @@ public class ChangeLogTest public async Task UpdateRange() { var discriminatorId = Uuid7.Guid(); - var expectedCommitId = Uuid7.Guid(); + var comment = "Изменение нескольких значений"; - var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var commit = new ChangeLogCommitDto(Uuid7.Guid(), comment); + commit.Id = Uuid7.Guid(); + var dtos = GenerateChangeLogValuesDto(2); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(commit.Id); + changeLogRepository .UpdateRange( Arg.Any(), @@ -73,8 +67,14 @@ public class ChangeLogTest var updateRangeResult = await service .UpdateRange(commit, dtos, CancellationToken.None); + updateRangeResult = await service + .UpdateRange(commit, dtos, CancellationToken.None); + + updateRangeResult = await service + .UpdateRange(commit, dtos, CancellationToken.None); + await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(1).UpdateRange(commit, dtos, CancellationToken.None); + await changeLogRepository.Received(3).UpdateRange(commit, dtos, CancellationToken.None); } [Fact] @@ -168,7 +168,7 @@ public class ChangeLogTest { var discriminatorId = Uuid7.Guid(); var dtos = GenerateChangeLogDto(5); -; + ; var dateBegin = DateTimeOffset.UtcNow.AddDays(-5); var dateEnd = DateTimeOffset.UtcNow; @@ -198,7 +198,7 @@ public class ChangeLogTest var dateOnlyBegin = new DateOnly(dateBegin.Year, dateBegin.Month, dateBegin.Day); var dateOnlyEnd = new DateOnly(dateEnd.Year, dateEnd.Month, dateEnd.Day); - var dtos = new List() { dateOnlyBegin, dateOnlyEnd }; + var dtos = new List() { dateOnlyBegin, dateOnlyEnd }; changeLogRepository .GetDatesChange( @@ -241,7 +241,7 @@ public class ChangeLogTest { items.Add(new ChangeLogDto() { - Id = Uuid7.Guid(), + Id = Uuid7.Guid(), }); } return items; -- 2.45.2 From 523c15093fda3663360c086bd8c0b14af6873eca 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: Thu, 20 Feb 2025 14:40:20 +0500 Subject: [PATCH 18/23] =?UTF-8?q?=D0=9C=D0=B8=D0=BD=D0=B8-=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BA=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.Test/ChangeLogTest.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs index 4fe1092..d302bd3 100644 --- a/DD.Persistence.Test/ChangeLogTest.cs +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -39,9 +39,11 @@ public class ChangeLogTest var addRangeResult = await service .AddRange(discriminatorId, commit, dtos, CancellationToken.None); + addRangeResult = await service + .AddRange(discriminatorId, commit, dtos, CancellationToken.None); await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(1).AddRange(discriminatorId, commit, dtos, CancellationToken.None); + await changeLogRepository.Received(2).AddRange(discriminatorId, commit, dtos, CancellationToken.None); } [Fact] @@ -98,9 +100,11 @@ public class ChangeLogTest var markAsDeletedResult = await service .MarkAsDeleted(dtoIds, commit, CancellationToken.None); + markAsDeletedResult = await service + .MarkAsDeleted(dtoIds, commit, CancellationToken.None); await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(1).MarkAsDeleted(commit.Id, dtoIds, commit.Creation, CancellationToken.None); + await changeLogRepository.Received(2).MarkAsDeleted(commit.Id, dtoIds, commit.Creation, CancellationToken.None); } [Fact] @@ -124,9 +128,11 @@ public class ChangeLogTest var clearAndAddResult = await service .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + clearAndAddResult = await service + .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(1).ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + await changeLogRepository.Received(2).ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); } [Fact] -- 2.45.2 From 4b7f55c3c88711eed67f2bab686580967b8d5c81 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: Thu, 20 Feb 2025 18:30:56 +0500 Subject: [PATCH 19/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 23 +++++++++--------- .../Services/ChangeLogService.cs | 2 +- DD.Persistence.Database/Entity/ChangeLog.cs | 3 --- .../EntityAbstractions/IChangeLog.cs | 5 ---- .../Repositories/ChangeLogRepository.cs | 14 +++++------ DD.Persistence.Test/ChangeLogTest.cs | 24 +++++++++++++++++-- 6 files changed, 41 insertions(+), 30 deletions(-) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index e01193d..25d478b 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -1,13 +1,12 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using DD.Persistence.Models; -using DD.Persistence.Models.Requests; -using DD.Persistence.Repositories; -using System.Net; -using DD.Persistence.Models.Common; +using DD.Persistence.API; using DD.Persistence.API.Services; - -namespace DD.Persistence.API.Controllers; +using DD.Persistence.Models; +using DD.Persistence.Models.Common; +using DD.Persistence.Models.Requests; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Net; +using UuidExtensions; [ApiController] [Authorize] @@ -34,7 +33,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var changeLogCommit = new ChangeLogCommitDto(Uuid7.Guid(), comment); var result = await service.AddRange(idDiscriminator, changeLogCommit, dtos, token); return CreatedAtAction(nameof(AddRange), result); @@ -209,7 +208,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi IdEditor = userId, IdNext = changeLogItemCurrentId, Obsolete = DateTimeOffset.UtcNow.AddDays(-5), - Value = new ChangeLogValuesDto(){ + Value = new ChangeLogValuesDto(){ Id = Guid.CreateVersion7(), Value = new Dictionary() { ["1"] = new { id = 1, caption = "Изменение 1" }, @@ -219,7 +218,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi } }; var result = new List() { - new() { + new() { Comment = "Петров И. Ю. попросил внести изменения", DateTime = changeLogItemCreation, DiscriminatorId = Guid.CreateVersion7(), diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 5b33cd8..b84a9bc 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -34,7 +34,7 @@ public class ChangeLogService } /// - /// Создание или чтение данных коммита + /// Чтение ключа коммита из кеша или (если коммита в кеше нет) создание коммита /// /// /// diff --git a/DD.Persistence.Database/Entity/ChangeLog.cs b/DD.Persistence.Database/Entity/ChangeLog.cs index 152f7a8..3621795 100644 --- a/DD.Persistence.Database/Entity/ChangeLog.cs +++ b/DD.Persistence.Database/Entity/ChangeLog.cs @@ -19,9 +19,6 @@ public class ChangeLog : IDiscriminatorItem, IChangeLog [Comment("Дискриминатор таблицы")] public Guid DiscriminatorId { get; set; } - [Comment("Автор изменения")] - public Guid IdAuthor { get; set; } - [Comment("Дата создания записи")] public DateTimeOffset Creation { get; set; } diff --git a/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs b/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs index 3e8a41b..bb5e68a 100644 --- a/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs +++ b/DD.Persistence.Database/EntityAbstractions/IChangeLog.cs @@ -10,11 +10,6 @@ public interface IChangeLog /// public Guid Id { get; set; } - /// - /// Автор изменения - /// - public Guid IdAuthor { get; set; } - /// /// Дата создания записи /// diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index c1d01dd..a0fb8df 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -28,7 +28,6 @@ public class ChangeLogRepository : IChangeLogRepository { Id = Uuid7.Guid(), Creation = commitDto.Creation, - IdAuthor = commitDto.IdAuthor, DiscriminatorId = idDiscriminator, Value = values.Value, IdCreatedCommit = commitDto.Id, @@ -76,7 +75,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.DiscriminatorId = idCommit; + entity.DiscriminatorId = idDiscriminator; } return await db.SaveChangesAsync(token); @@ -92,7 +91,7 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(commitDto.Id, changeLogIds, commitDto.Creation, token); + result += await MarkAsDeleted(idDiscriminator, commitDto.Id, commitDto.Creation, token); result += await AddRange(idDiscriminator, commitDto, dtos, token); await transaction.CommitAsync(token); @@ -105,15 +104,17 @@ public class ChangeLogRepository : IChangeLogRepository var dbSet = db.Set(); var updatedIds = dtos.Select(d => d.Id); - var updatedEntities = dbSet + var updatedEntities = await dbSet .Where(s => updatedIds.Contains(s.Id)) - .ToDictionary(s => s.Id); + .ToArrayAsync(token); + + var updatedEntitiesDict = updatedEntities.ToDictionary(s => s.Id); using var transaction = await db.Database.BeginTransactionAsync(token); foreach (var dto in dtos) { - var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); + var updatedEntity = updatedEntitiesDict.GetValueOrDefault(dto.Id); if (updatedEntity is null) { throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); @@ -123,7 +124,6 @@ public class ChangeLogRepository : IChangeLogRepository { Id = Uuid7.Guid(), Creation = commitDto.Creation, - IdAuthor = commitDto.IdAuthor, DiscriminatorId = updatedEntity.DiscriminatorId, Value = dto.Value, IdCreatedCommit = commitDto.Id, diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs index d302bd3..bc5c0ad 100644 --- a/DD.Persistence.Test/ChangeLogTest.cs +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -22,6 +22,7 @@ public class ChangeLogTest [Fact] public async Task AddRange() { + //arrange var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Добавление нескольких значений"; @@ -37,11 +38,13 @@ public class ChangeLogTest Arg.Any()) .Returns(2); + //act var addRangeResult = await service .AddRange(discriminatorId, commit, dtos, CancellationToken.None); addRangeResult = await service .AddRange(discriminatorId, commit, dtos, CancellationToken.None); + //assert await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); await changeLogRepository.Received(2).AddRange(discriminatorId, commit, dtos, CancellationToken.None); } @@ -49,6 +52,7 @@ public class ChangeLogTest [Fact] public async Task UpdateRange() { + //arrange var discriminatorId = Uuid7.Guid(); var comment = "Изменение нескольких значений"; @@ -65,7 +69,7 @@ public class ChangeLogTest Arg.Any>(), Arg.Any()) .Returns(2); - + //act var updateRangeResult = await service .UpdateRange(commit, dtos, CancellationToken.None); @@ -75,6 +79,7 @@ public class ChangeLogTest updateRangeResult = await service .UpdateRange(commit, dtos, CancellationToken.None); + //assert await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); await changeLogRepository.Received(3).UpdateRange(commit, dtos, CancellationToken.None); } @@ -82,6 +87,7 @@ public class ChangeLogTest [Fact] public async Task MarkAsDeleted() { + //arrange var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление нескольких значений"; @@ -98,11 +104,13 @@ public class ChangeLogTest Arg.Any()) .Returns(2); + //act var markAsDeletedResult = await service .MarkAsDeleted(dtoIds, commit, CancellationToken.None); markAsDeletedResult = await service .MarkAsDeleted(dtoIds, commit, CancellationToken.None); + //assert await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); await changeLogRepository.Received(2).MarkAsDeleted(commit.Id, dtoIds, commit.Creation, CancellationToken.None); } @@ -110,6 +118,7 @@ public class ChangeLogTest [Fact] public async Task ClearAndAddRange() { + //arrange var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление и добавление нескольких значений"; @@ -126,11 +135,13 @@ public class ChangeLogTest Arg.Any()) .Returns(2); + //act var clearAndAddResult = await service .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); clearAndAddResult = await service .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + //assert await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); await changeLogRepository.Received(2).ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); } @@ -138,6 +149,7 @@ public class ChangeLogTest [Fact] public async Task GetByDate() { + //arrange var discriminatorId = Uuid7.Guid(); var paginationRequest = new PaginationRequest() { @@ -162,9 +174,11 @@ public class ChangeLogTest Arg.Any()) .Returns(items); + //act var actualItems = await service .GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None); + //assert await changeLogRepository.Received(1).GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None); } @@ -172,9 +186,10 @@ public class ChangeLogTest [Fact] public async Task GetChangeLogForInterval() { + //arrange var discriminatorId = Uuid7.Guid(); var dtos = GenerateChangeLogDto(5); - ; + var dateBegin = DateTimeOffset.UtcNow.AddDays(-5); var dateEnd = DateTimeOffset.UtcNow; @@ -186,9 +201,11 @@ public class ChangeLogTest Arg.Any()) .Returns(dtos); + //act var actualItems = await service .GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None); + //assert await changeLogRepository.Received(1).GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None); } @@ -196,6 +213,7 @@ public class ChangeLogTest [Fact] public async Task GetDatesChange() { + //arrange var discriminatorId = Uuid7.Guid(); var dateBegin = DateTimeOffset.UtcNow.AddDays(-5); @@ -212,9 +230,11 @@ public class ChangeLogTest Arg.Any()) .Returns(dtos); + //act var actualItems = await service .GetDatesChange(discriminatorId, CancellationToken.None); + //assert await changeLogRepository.Received(1).GetDatesChange(discriminatorId, CancellationToken.None); } -- 2.45.2 From a796024c694a12f25ca211643b5fca40463ed056 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 21 Feb 2025 12:25:22 +0500 Subject: [PATCH 20/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 8 +-- .../Services/ChangeLogService.cs | 36 ++++++------ ...ner.cs => 20250221053248_Init.Designer.cs} | 6 +- ...8121851_Init.cs => 20250221053248_Init.cs} | 1 - ...PersistencePostgresContextModelSnapshot.cs | 4 -- .../Repositories/ChangeLogCommitRepository.cs | 8 +-- .../Repositories/ChangeLogRepository.cs | 12 ++-- DD.Persistence.Models/ChangeLogCommitDto.cs | 21 +++++++ ...CommitDto.cs => ChangeLogCommitRequest.cs} | 9 +-- DD.Persistence.Test/ChangeLogTest.cs | 58 ++++++++++--------- .../IChangeLogCommitRepository.cs | 2 +- .../Repositories/IChangeLogRepository.cs | 4 +- 12 files changed, 89 insertions(+), 80 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20250218121851_Init.Designer.cs => 20250221053248_Init.Designer.cs} (98%) rename DD.Persistence.Database.Postgres/Migrations/{20250218121851_Init.cs => 20250221053248_Init.cs} (98%) create mode 100644 DD.Persistence.Models/ChangeLogCommitDto.cs rename DD.Persistence.Models/Requests/{ChangeLogCommitDto.cs => ChangeLogCommitRequest.cs} (79%) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 25d478b..24b6676 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -33,7 +33,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(Uuid7.Guid(), comment); + var changeLogCommit = new ChangeLogCommitRequest(Uuid7.Guid(), comment); var result = await service.AddRange(idDiscriminator, changeLogCommit, dtos, token); return CreatedAtAction(nameof(AddRange), result); @@ -44,7 +44,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var changeLogCommit = new ChangeLogCommitRequest(userId, comment); var result = await service.MarkAsDeleted(ids, changeLogCommit, token); return Ok(result); @@ -59,7 +59,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var changeLogCommit = new ChangeLogCommitRequest(userId, comment); var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, dtos, token); return Ok(result); } @@ -72,7 +72,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitDto(userId, comment); + var changeLogCommit = new ChangeLogCommitRequest(userId, comment); var result = await service.UpdateRange(changeLogCommit, dtos, token); return Ok(result); diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index b84a9bc..4b143a9 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -39,7 +39,7 @@ public class ChangeLogService /// /// /// - private async Task GetOrCreateCommitAsync(ChangeLogCommitDto commitDto, CancellationToken token) + private async Task GetOrCreateCommitAsync(ChangeLogCommitRequest commitDto, CancellationToken token) { var key = (commitDto.IdAuthor, commitDto.Comment); var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) => @@ -57,14 +57,14 @@ public class ChangeLogService /// Добавление записи в журнал изменений /// /// - /// + /// /// /// /// - public async Task AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { - var commitId = await GetOrCreateCommitAsync(commitDto, token); - commitDto.Id = commitId; + var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); + var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); var result = await repository.AddRange(idDiscriminator, commitDto, dtos, token); return result; @@ -74,13 +74,13 @@ public class ChangeLogService /// Пометить запись журнала изменений как удаленную /// /// - /// + /// /// /// - public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitDto commitDto, CancellationToken token) + public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitRequest commitRequestDto, CancellationToken token) { - var commitId = await GetOrCreateCommitAsync(commitDto, token); - commitDto.Id = commitId; + var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); + var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); var result = await repository.MarkAsDeleted(commitId, ids, commitDto.Creation, token); @@ -91,14 +91,14 @@ public class ChangeLogService /// Очистить старые и добавить новые записи в журнал изменений /// /// - /// + /// /// /// /// - public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { - var commitId = await GetOrCreateCommitAsync(commitDto, token); - commitDto.Id = commitId; + var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); + var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, dtos, token); @@ -108,16 +108,16 @@ public class ChangeLogService /// /// Обновить записи в журнале изменений /// - /// + /// /// /// /// - public async Task UpdateRange(ChangeLogCommitDto changeLogCommit, IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { - var commitId = await GetOrCreateCommitAsync(changeLogCommit, token); - changeLogCommit.Id = commitId; + var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); + var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); - var result = await repository.UpdateRange(changeLogCommit, dtos, token); + var result = await repository.UpdateRange(commitDto, dtos, token); return result; } diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.Designer.cs similarity index 98% rename from DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.Designer.cs index 360eb6f..e541b06 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.Designer.cs @@ -13,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250218121851_Init")] + [Migration("20250221053248_Init")] partial class Init { /// @@ -41,10 +41,6 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Дискриминатор таблицы"); - b.Property("IdAuthor") - .HasColumnType("uuid") - .HasComment("Автор изменения"); - b.Property("IdCreatedCommit") .HasColumnType("uuid") .HasComment("Id коммита на создание записи"); diff --git a/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.cs similarity index 98% rename from DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.cs index 5fa1f53..728fc4b 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250218121851_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250221053248_Init.cs @@ -100,7 +100,6 @@ namespace DD.Persistence.Database.Postgres.Migrations { Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор таблицы"), - IdAuthor = table.Column(type: "uuid", nullable: false, comment: "Автор изменения"), Creation = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания записи"), Obsolete = table.Column(type: "timestamp with time zone", nullable: true, comment: "Дата устаревания (например при удалении)"), IdNext = table.Column(type: "uuid", nullable: true, comment: "Id заменяющей записи"), diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index da64be1..274d157 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -38,10 +38,6 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Дискриминатор таблицы"); - b.Property("IdAuthor") - .HasColumnType("uuid") - .HasComment("Автор изменения"); - b.Property("IdCreatedCommit") .HasColumnType("uuid") .HasComment("Id коммита на создание записи"); diff --git a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs index 9ae6040..847e280 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs @@ -20,15 +20,15 @@ public class ChangeLogCommitRepository : IChangeLogCommitRepository this.db = db; } - public async Task Add(ChangeLogCommitDto commitDto, CancellationToken token) + public async Task Add(ChangeLogCommitRequest commitRequestDto, CancellationToken token) { var commit = new ChangeLogCommit() { Id = Uuid7.Guid(), - IdAuthor = commitDto.IdAuthor, - Comment = commitDto.Comment, - Creation = commitDto.Creation, + IdAuthor = commitRequestDto.IdAuthor, + Comment = commitRequestDto.Comment, + Creation = commitRequestDto.Creation, }; db.Add(commit); diff --git a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs index a0fb8df..18aa5fb 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogRepository.cs @@ -75,7 +75,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var entity in entities) { entity.Obsolete = updateTime; - entity.DiscriminatorId = idDiscriminator; + entity.DiscriminatorId = idCommit; } return await db.SaveChangesAsync(token); @@ -91,7 +91,7 @@ public class ChangeLogRepository : IChangeLogRepository using var transaction = await db.Database.BeginTransactionAsync(token); - result += await MarkAsDeleted(idDiscriminator, commitDto.Id, commitDto.Creation, token); + result += await MarkAsDeleted(commitDto.Id, changeLogIds, commitDto.Creation, token); result += await AddRange(idDiscriminator, commitDto, dtos, token); await transaction.CommitAsync(token); @@ -104,17 +104,15 @@ public class ChangeLogRepository : IChangeLogRepository var dbSet = db.Set(); var updatedIds = dtos.Select(d => d.Id); - var updatedEntities = await dbSet + var updatedEntities = dbSet .Where(s => updatedIds.Contains(s.Id)) - .ToArrayAsync(token); - - var updatedEntitiesDict = updatedEntities.ToDictionary(s => s.Id); + .ToDictionary(s => s.Id); using var transaction = await db.Database.BeginTransactionAsync(token); foreach (var dto in dtos) { - var updatedEntity = updatedEntitiesDict.GetValueOrDefault(dto.Id); + var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); if (updatedEntity is null) { throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); diff --git a/DD.Persistence.Models/ChangeLogCommitDto.cs b/DD.Persistence.Models/ChangeLogCommitDto.cs new file mode 100644 index 0000000..2d29ab6 --- /dev/null +++ b/DD.Persistence.Models/ChangeLogCommitDto.cs @@ -0,0 +1,21 @@ +namespace DD.Persistence.Models.Requests; + +/// +/// Модель коммита с изменениями +/// +public class ChangeLogCommitDto : ChangeLogCommitRequest +{ + /// + /// Id + /// + public Guid Id { get; set; } + + /// + /// + /// + public ChangeLogCommitDto(Guid id, ChangeLogCommitRequest request) : base(request.IdAuthor, request.Comment) + { + Id = id; + } + +} diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs b/DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs similarity index 79% rename from DD.Persistence.Models/Requests/ChangeLogCommitDto.cs rename to DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs index e6252dc..10148b5 100644 --- a/DD.Persistence.Models/Requests/ChangeLogCommitDto.cs +++ b/DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs @@ -3,13 +3,8 @@ /// /// Модель коммита с изменениями /// -public class ChangeLogCommitDto +public class ChangeLogCommitRequest { - /// - /// Id - /// - public Guid Id { get; set; } - /// /// Дата создания /// @@ -28,7 +23,7 @@ public class ChangeLogCommitDto /// /// /// - public ChangeLogCommitDto(Guid idAuthor, string comment) + public ChangeLogCommitRequest(Guid idAuthor, string comment) { IdAuthor = idAuthor; Comment = comment; diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs index bc5c0ad..ed0627d 100644 --- a/DD.Persistence.Test/ChangeLogTest.cs +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -26,10 +26,11 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Добавление нескольких значений"; - var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); changeLogRepository .AddRange( Arg.Any(), @@ -40,13 +41,13 @@ public class ChangeLogTest //act var addRangeResult = await service - .AddRange(discriminatorId, commit, dtos, CancellationToken.None); + .AddRange(discriminatorId, commitRequest, dtos, CancellationToken.None); addRangeResult = await service - .AddRange(discriminatorId, commit, dtos, CancellationToken.None); + .AddRange(discriminatorId, commitRequest, dtos, CancellationToken.None); //assert - await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(2).AddRange(discriminatorId, commit, dtos, CancellationToken.None); + await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None); + await changeLogRepository.Received(2).AddRange(discriminatorId, Arg.Any(), dtos, CancellationToken.None); } [Fact] @@ -54,14 +55,14 @@ public class ChangeLogTest { //arrange var discriminatorId = Uuid7.Guid(); - + var expectedCommitId = Uuid7.Guid(); var comment = "Изменение нескольких значений"; - var commit = new ChangeLogCommitDto(Uuid7.Guid(), comment); - commit.Id = Uuid7.Guid(); + var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(commit.Id); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(commit.Id); changeLogRepository .UpdateRange( @@ -69,19 +70,20 @@ public class ChangeLogTest Arg.Any>(), Arg.Any()) .Returns(2); + //act var updateRangeResult = await service - .UpdateRange(commit, dtos, CancellationToken.None); + .UpdateRange(commitRequest, dtos, CancellationToken.None); updateRangeResult = await service - .UpdateRange(commit, dtos, CancellationToken.None); + .UpdateRange(commitRequest, dtos, CancellationToken.None); updateRangeResult = await service - .UpdateRange(commit, dtos, CancellationToken.None); + .UpdateRange(commitRequest, dtos, CancellationToken.None); //assert - await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(3).UpdateRange(commit, dtos, CancellationToken.None); + await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None); + await changeLogRepository.Received(3).UpdateRange(Arg.Any(), dtos, CancellationToken.None); } [Fact] @@ -91,11 +93,12 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление нескольких значений"; - var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); var dtoIds = dtos.Select(d => d.Id); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(expectedCommitId); changeLogRepository .MarkAsDeleted( Arg.Any(), @@ -106,13 +109,13 @@ public class ChangeLogTest //act var markAsDeletedResult = await service - .MarkAsDeleted(dtoIds, commit, CancellationToken.None); + .MarkAsDeleted(dtoIds, commitRequest, CancellationToken.None); markAsDeletedResult = await service - .MarkAsDeleted(dtoIds, commit, CancellationToken.None); + .MarkAsDeleted(dtoIds, commitRequest, CancellationToken.None); //assert - await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(2).MarkAsDeleted(commit.Id, dtoIds, commit.Creation, CancellationToken.None); + await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None); + await changeLogRepository.Received(2).MarkAsDeleted(commit.Id, dtoIds, Arg.Any(), CancellationToken.None); } [Fact] @@ -122,11 +125,12 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление и добавление нескольких значений"; - var commit = new ChangeLogCommitDto(expectedCommitId, comment); + var commitRequest = new ChangeLogCommitRequest(expectedCommitId, comment); + var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); var dtoIds = dtos.Select(d => d.Id); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); changeLogRepository .ClearAndAddRange( Arg.Any(), @@ -137,13 +141,13 @@ public class ChangeLogTest //act var clearAndAddResult = await service - .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + .ClearAndAddRange(discriminatorId, commitRequest, dtos, CancellationToken.None); clearAndAddResult = await service - .ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + .ClearAndAddRange(discriminatorId, commitRequest, dtos, CancellationToken.None); //assert - await changeLogCommitRepository.Received(1).Add(commit, CancellationToken.None); - await changeLogRepository.Received(2).ClearAndAddRange(discriminatorId, commit, dtos, CancellationToken.None); + await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None); + await changeLogRepository.Received(2).ClearAndAddRange(discriminatorId, Arg.Any(), dtos, CancellationToken.None); } [Fact] diff --git a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs index 6c697b2..9aaa703 100644 --- a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs @@ -18,5 +18,5 @@ public interface IChangeLogCommitRepository /// /// /// - Task Add(ChangeLogCommitDto commitDto, CancellationToken token); + Task Add(ChangeLogCommitRequest commitDto, CancellationToken token); } diff --git a/DD.Persistence/Repositories/IChangeLogRepository.cs b/DD.Persistence/Repositories/IChangeLogRepository.cs index 62b89c9..5fd3ba6 100644 --- a/DD.Persistence/Repositories/IChangeLogRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogRepository.cs @@ -44,11 +44,11 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository /// - /// коммит с изменениями + /// коммит с изменениями /// /// /// - Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, IEnumerable dtos, CancellationToken token); + Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto dto, IEnumerable dtos, CancellationToken token); /// /// Редактирование записей -- 2.45.2 From 7590e8facbb8e29a2290a9742a09064c6615720e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 21 Feb 2025 12:27:09 +0500 Subject: [PATCH 21/23] =?UTF-8?q?=D0=BD=D0=B5=D0=B9=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 24b6676..0fd5b3f 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -33,8 +33,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitRequest(Uuid7.Guid(), comment); - var result = await service.AddRange(idDiscriminator, changeLogCommit, dtos, token); + var changeLogCommitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var result = await service.AddRange(idDiscriminator, changeLogCommitRequest, dtos, token); return CreatedAtAction(nameof(AddRange), result); } @@ -44,8 +44,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitRequest(userId, comment); - var result = await service.MarkAsDeleted(ids, changeLogCommit, token); + var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var result = await service.MarkAsDeleted(ids, changeLogCommitRequest, token); return Ok(result); } @@ -59,8 +59,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitRequest(userId, comment); - var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommit, dtos, token); + var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommitRequest, dtos, token); return Ok(result); } @@ -72,8 +72,8 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommit = new ChangeLogCommitRequest(userId, comment); - var result = await service.UpdateRange(changeLogCommit, dtos, token); + var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var result = await service.UpdateRange(changeLogCommitRequest, dtos, token); return Ok(result); } -- 2.45.2 From 0c7006d52a331413b4f82f949f495528facdde68 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 21 Feb 2025 12:28:32 +0500 Subject: [PATCH 22/23] =?UTF-8?q?=D0=BD=D0=B5=D0=B9=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 8 ++++---- DD.Persistence.API/Services/ChangeLogService.cs | 10 +++++----- .../Repositories/ChangeLogCommitRepository.cs | 2 +- DD.Persistence.Models/ChangeLogCommitDto.cs | 4 ++-- ...equest.cs => CreateChangeLogCommitRequest.cs} | 6 +++--- DD.Persistence.Test/ChangeLogTest.cs | 16 ++++++++-------- .../Repositories/IChangeLogCommitRepository.cs | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) rename DD.Persistence.Models/Requests/{ChangeLogCommitRequest.cs => CreateChangeLogCommitRequest.cs} (78%) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 0fd5b3f..33585fc 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -33,7 +33,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var changeLogCommitRequest = new CreateChangeLogCommitRequest(Uuid7.Guid(), comment); var result = await service.AddRange(idDiscriminator, changeLogCommitRequest, dtos, token); return CreatedAtAction(nameof(AddRange), result); @@ -44,7 +44,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var changeLogCommitRequest = new CreateChangeLogCommitRequest(userId, comment); var result = await service.MarkAsDeleted(ids, changeLogCommitRequest, token); return Ok(result); @@ -59,7 +59,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var changeLogCommitRequest = new CreateChangeLogCommitRequest(userId, comment); var result = await service.ClearAndAddRange(idDiscriminator, changeLogCommitRequest, dtos, token); return Ok(result); } @@ -72,7 +72,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi CancellationToken token) { var userId = User.GetUserId(); - var changeLogCommitRequest = new ChangeLogCommitRequest(userId, comment); + var changeLogCommitRequest = new CreateChangeLogCommitRequest(userId, comment); var result = await service.UpdateRange(changeLogCommitRequest, dtos, token); return Ok(result); diff --git a/DD.Persistence.API/Services/ChangeLogService.cs b/DD.Persistence.API/Services/ChangeLogService.cs index 4b143a9..f4831d2 100644 --- a/DD.Persistence.API/Services/ChangeLogService.cs +++ b/DD.Persistence.API/Services/ChangeLogService.cs @@ -39,7 +39,7 @@ public class ChangeLogService /// /// /// - private async Task GetOrCreateCommitAsync(ChangeLogCommitRequest commitDto, CancellationToken token) + private async Task GetOrCreateCommitAsync(CreateChangeLogCommitRequest commitDto, CancellationToken token) { var key = (commitDto.IdAuthor, commitDto.Comment); var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) => @@ -61,7 +61,7 @@ public class ChangeLogService /// /// /// - public async Task AddRange(Guid idDiscriminator, ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, CreateChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); @@ -77,7 +77,7 @@ public class ChangeLogService /// /// /// - public async Task MarkAsDeleted(IEnumerable ids, ChangeLogCommitRequest commitRequestDto, CancellationToken token) + public async Task MarkAsDeleted(IEnumerable ids, CreateChangeLogCommitRequest commitRequestDto, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); @@ -95,7 +95,7 @@ public class ChangeLogService /// /// /// - public async Task ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, CreateChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); @@ -112,7 +112,7 @@ public class ChangeLogService /// /// /// - public async Task UpdateRange(ChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(CreateChangeLogCommitRequest commitRequestDto, IEnumerable dtos, CancellationToken token) { var commitId = await GetOrCreateCommitAsync(commitRequestDto, token); var commitDto = new ChangeLogCommitDto(commitId, commitRequestDto); diff --git a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs index 847e280..634136c 100644 --- a/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs +++ b/DD.Persistence.Database/Repositories/ChangeLogCommitRepository.cs @@ -20,7 +20,7 @@ public class ChangeLogCommitRepository : IChangeLogCommitRepository this.db = db; } - public async Task Add(ChangeLogCommitRequest commitRequestDto, CancellationToken token) + public async Task Add(CreateChangeLogCommitRequest commitRequestDto, CancellationToken token) { var commit = new ChangeLogCommit() diff --git a/DD.Persistence.Models/ChangeLogCommitDto.cs b/DD.Persistence.Models/ChangeLogCommitDto.cs index 2d29ab6..0df8baf 100644 --- a/DD.Persistence.Models/ChangeLogCommitDto.cs +++ b/DD.Persistence.Models/ChangeLogCommitDto.cs @@ -3,7 +3,7 @@ /// /// Модель коммита с изменениями /// -public class ChangeLogCommitDto : ChangeLogCommitRequest +public class ChangeLogCommitDto : CreateChangeLogCommitRequest { /// /// Id @@ -13,7 +13,7 @@ public class ChangeLogCommitDto : ChangeLogCommitRequest /// /// /// - public ChangeLogCommitDto(Guid id, ChangeLogCommitRequest request) : base(request.IdAuthor, request.Comment) + public ChangeLogCommitDto(Guid id, CreateChangeLogCommitRequest request) : base(request.IdAuthor, request.Comment) { Id = id; } diff --git a/DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs b/DD.Persistence.Models/Requests/CreateChangeLogCommitRequest.cs similarity index 78% rename from DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs rename to DD.Persistence.Models/Requests/CreateChangeLogCommitRequest.cs index 10148b5..e0bcffa 100644 --- a/DD.Persistence.Models/Requests/ChangeLogCommitRequest.cs +++ b/DD.Persistence.Models/Requests/CreateChangeLogCommitRequest.cs @@ -1,9 +1,9 @@ namespace DD.Persistence.Models.Requests; /// -/// Модель коммита с изменениями +/// Модель для создания коммита /// -public class ChangeLogCommitRequest +public class CreateChangeLogCommitRequest { /// /// Дата создания @@ -23,7 +23,7 @@ public class ChangeLogCommitRequest /// /// /// - public ChangeLogCommitRequest(Guid idAuthor, string comment) + public CreateChangeLogCommitRequest(Guid idAuthor, string comment) { IdAuthor = idAuthor; Comment = comment; diff --git a/DD.Persistence.Test/ChangeLogTest.cs b/DD.Persistence.Test/ChangeLogTest.cs index ed0627d..106dca5 100644 --- a/DD.Persistence.Test/ChangeLogTest.cs +++ b/DD.Persistence.Test/ChangeLogTest.cs @@ -26,11 +26,11 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Добавление нескольких значений"; - var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commitRequest = new CreateChangeLogCommitRequest(Uuid7.Guid(), comment); var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); changeLogRepository .AddRange( Arg.Any(), @@ -57,12 +57,12 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Изменение нескольких значений"; - var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commitRequest = new CreateChangeLogCommitRequest(Uuid7.Guid(), comment); var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(commit.Id); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(commit.Id); changeLogRepository .UpdateRange( @@ -93,12 +93,12 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление нескольких значений"; - var commitRequest = new ChangeLogCommitRequest(Uuid7.Guid(), comment); + var commitRequest = new CreateChangeLogCommitRequest(Uuid7.Guid(), comment); var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); var dtoIds = dtos.Select(d => d.Id); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(expectedCommitId); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(expectedCommitId); changeLogRepository .MarkAsDeleted( Arg.Any(), @@ -125,12 +125,12 @@ public class ChangeLogTest var discriminatorId = Uuid7.Guid(); var expectedCommitId = Uuid7.Guid(); var comment = "Удаление и добавление нескольких значений"; - var commitRequest = new ChangeLogCommitRequest(expectedCommitId, comment); + var commitRequest = new CreateChangeLogCommitRequest(expectedCommitId, comment); var commit = new ChangeLogCommitDto(expectedCommitId, commitRequest); var dtos = GenerateChangeLogValuesDto(2); var dtoIds = dtos.Select(d => d.Id); - changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); + changeLogCommitRepository.Add(Arg.Any(), Arg.Any()).Returns(Uuid7.Guid()); changeLogRepository .ClearAndAddRange( Arg.Any(), diff --git a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs index 9aaa703..6cb1d0d 100644 --- a/DD.Persistence/Repositories/IChangeLogCommitRepository.cs +++ b/DD.Persistence/Repositories/IChangeLogCommitRepository.cs @@ -18,5 +18,5 @@ public interface IChangeLogCommitRepository /// /// /// - Task Add(ChangeLogCommitRequest commitDto, CancellationToken token); + Task Add(CreateChangeLogCommitRequest commitDto, CancellationToken token); } -- 2.45.2 From 930c4e87222bf901050727865c91d727d389adac Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 21 Feb 2025 14:22:34 +0500 Subject: [PATCH 23/23] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA=20ChangeLogController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChangeLogController.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/DD.Persistence.API/Controllers/ChangeLogController.cs b/DD.Persistence.API/Controllers/ChangeLogController.cs index 33585fc..138572d 100644 --- a/DD.Persistence.API/Controllers/ChangeLogController.cs +++ b/DD.Persistence.API/Controllers/ChangeLogController.cs @@ -8,6 +8,9 @@ using Microsoft.AspNetCore.Mvc; using System.Net; using UuidExtensions; +/// +/// Контроллер по работе с журналом изменений +/// [ApiController] [Authorize] [Route("api/[controller]")] @@ -24,6 +27,14 @@ public class ChangeLogController : ControllerBase, IChangeLogApi this.service = service; } + /// + /// Добавить записи в журнал изменений по дискриминатору + /// + /// + /// + /// + /// + /// [HttpPost("{idDiscriminator}")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)] public async Task AddRange( @@ -39,6 +50,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return CreatedAtAction(nameof(AddRange), result); } + /// + /// Удалить записи в журнале изменений + /// + /// + /// + /// + /// [HttpDelete] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) @@ -50,6 +68,15 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + + /// + /// Очистить все записи в журнале изменений (по дискриминатору) и добавить новые + /// + /// + /// + /// + /// + /// [HttpPost("replace/{idDiscriminator}")] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task ClearAndAddRange( @@ -64,6 +91,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// сохранить изменения в записях журнала изменений + /// + /// + /// + /// + /// [HttpPut] [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] public async Task UpdateRange( @@ -78,6 +112,13 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получение актуальных записей (с пагинацией) + /// + /// + /// + /// + /// [HttpGet("{idDiscriminator}")] [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] public async Task GetCurrent( @@ -91,6 +132,14 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получение записей на определенный момент времени (с пагинацией) + /// + /// + /// + /// + /// + /// [HttpGet("moment/{idDiscriminator}")] [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] public async Task GetByDate( @@ -104,6 +153,14 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получение измененных записей за период времени + /// + /// + /// + /// + /// + /// [HttpGet("history/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] @@ -118,6 +175,12 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) + /// + /// + /// + /// [HttpGet("datesChange/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] @@ -128,6 +191,14 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получение данных, начиная с определенной даты + /// + /// + /// + /// + /// + /// [HttpGet("part/{idDiscriminator}")] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] @@ -138,6 +209,12 @@ public class ChangeLogController : ControllerBase, IChangeLogApi return Ok(result); } + /// + /// Получить диапазон дат, для которых есть данные в репозитории + /// + /// + /// + /// [HttpGet("datesRange/{idDiscriminator}")] [ProducesResponseType(typeof(DatesRangeDto), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NoContent)] -- 2.45.2