From a0e71c99487b61dad30f8361b1e6e10fc3a573e2 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Mon, 7 Oct 2024 17:00:56 +1000 Subject: [PATCH] =?UTF-8?q?feat(dal):=20=D1=82=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B8=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/History/Base/HistoryInitiator.cs | 11 ++++ PARR.DAL/Services/Abstracts/BaseService.cs | 52 ++++++++++++++++--- .../Services/Interfaces/Base/IBaseService.cs | 4 +- 3 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs diff --git a/PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs b/PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs new file mode 100644 index 00000000..382ef73b --- /dev/null +++ b/PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs @@ -0,0 +1,11 @@ +using PARR.Constants; + +namespace PARR.DAL.Models.Base.History.Base +{ + public class HistoryInitiator : IHistoryInitiator + { + public string? InitiatorIp { get; set; } + public ParrComponentsEnum? InitiatorParrComponentId { get;set; } + public string? InitiatorComment { get; set; } + } +} diff --git a/PARR.DAL/Services/Abstracts/BaseService.cs b/PARR.DAL/Services/Abstracts/BaseService.cs index e01c344c..193eff96 100644 --- a/PARR.DAL/Services/Abstracts/BaseService.cs +++ b/PARR.DAL/Services/Abstracts/BaseService.cs @@ -38,8 +38,15 @@ namespace PARR.DAL.Services.Abstracts } } - public async Task CommitAsync() + public async Task CommitAsync(HistoryInitiator? initiator = null) { + //todo: remove initiator + //проверить что инициатор сохраняется в родительской таблице + // что с родительской переписывается в историю + // входной initiator не переписывает историю + initiator = new HistoryInitiator { InitiatorComment = "Comment", InitiatorIp = "10.10.10.10", InitiatorParrComponentId = Constants.ParrComponentsEnum.Api }; + + #region Изменения var modifiedEntrities = EntitiContext.ChangeTracker.Entries() .Where(t => t.State == EntityState.Modified/* || t.State == EntityState.Deleted*/); @@ -51,6 +58,10 @@ namespace PARR.DAL.Services.Abstracts //Если нужно, пишем историю TableHistoryResolver(obj); } + #endregion + + if (initiator != null) + SetInitiator(initiator); try { @@ -64,6 +75,31 @@ namespace PARR.DAL.Services.Abstracts } } + + /// + /// Установить инициатора + /// + /// + private void SetInitiator(IHistoryInitiator initiator) + { + // Задваем иницатора только для новых и измененных записей + var entrities = EntitiContext.ChangeTracker.Entries() + .Where(t => t.State == EntityState.Modified || t.State == EntityState.Added); + + // смотрим есть ли у объекта интерфейс IHistoryInitiator, если есть, задаём значения + foreach (var obj in entrities) + { + // для всех объектов которые наследуются от IHistoryInitiator и не являются наследниками IHistoryTable + if (obj.Entity is IHistoryInitiator && obj.Entity is IHistoryTable == false) + { + (obj.Entity as IHistoryInitiator)!.InitiatorIp = initiator.InitiatorIp; + (obj.Entity as IHistoryInitiator)!.InitiatorParrComponentId = initiator.InitiatorParrComponentId; + (obj.Entity as IHistoryInitiator)!.InitiatorComment = initiator.InitiatorComment; + } + } + } + + /// /// Обновления DateModified у таблиц с IBase /// @@ -156,29 +192,29 @@ namespace PARR.DAL.Services.Abstracts /// - /// Заполнить поле в истории + /// Заполнить поле объекта /// /// - /// + /// /// /// - private void FillHistoryProp(ref object historyInstance, string propName, T value) + private void FillHistoryProp(ref object instanceObj, string propName, T value) { - var histProp = historyInstance.GetType().GetProperty(propName); + var histProp = instanceObj.GetType().GetProperty(propName); if (histProp == null) { - logger.LogError($"При добавлении истории, не найдено свойство ${propName}"); + logger.LogError($"При изменении объекта для БД, не найдено свойство ${propName}"); return; } // сравним типы if (histProp.PropertyType != typeof(T)) { - logger.LogError($"При добавлении истории, не совпадают типы у свойства {propName}, {histProp.PropertyType.Name}!={typeof(T).Name}"); + logger.LogError($"При изменении объекта для БД, не совпадают типы у свойства {propName}, {histProp.PropertyType.Name}!={typeof(T).Name}"); return; } - histProp.SetValue(historyInstance, value); + histProp.SetValue(instanceObj, value); } diff --git a/PARR.DAL/Services/Interfaces/Base/IBaseService.cs b/PARR.DAL/Services/Interfaces/Base/IBaseService.cs index 38d42a80..0d76c7ff 100644 --- a/PARR.DAL/Services/Interfaces/Base/IBaseService.cs +++ b/PARR.DAL/Services/Interfaces/Base/IBaseService.cs @@ -1,5 +1,6 @@ using PARR.DAL.DomainModels; using PARR.DAL.Models.Base; +using PARR.DAL.Models.Base.History.Base; namespace PARR.DAL.Services.Interfaces.Base { @@ -15,6 +16,7 @@ namespace PARR.DAL.Services.Interfaces.Base Task DeleteAsync(Guid id); bool Delete(T obj); - Task CommitAsync(); + //Task CommitAsync(); + Task CommitAsync(HistoryInitiator? initiator = null); } }