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