feat(dal): тестирование инициатора

This commit is contained in:
Mikhail Trubnikov
2024-10-07 17:00:56 +10:00
parent 03daa08f13
commit a0e71c9948
3 changed files with 58 additions and 9 deletions

View File

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

View File

@@ -38,8 +38,15 @@ namespace PARR.DAL.Services.Abstracts
} }
} }
public async Task<bool> CommitAsync() public async Task<bool> 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() var modifiedEntrities = EntitiContext.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Modified/* || t.State == EntityState.Deleted*/); .Where(t => t.State == EntityState.Modified/* || t.State == EntityState.Deleted*/);
@@ -51,6 +58,10 @@ namespace PARR.DAL.Services.Abstracts
//Если нужно, пишем историю //Если нужно, пишем историю
TableHistoryResolver(obj); TableHistoryResolver(obj);
} }
#endregion
if (initiator != null)
SetInitiator(initiator);
try try
{ {
@@ -64,6 +75,31 @@ namespace PARR.DAL.Services.Abstracts
} }
} }
/// <summary>
/// Установить инициатора
/// </summary>
/// <param name="initiator"></param>
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;
}
}
}
/// <summary> /// <summary>
/// Обновления DateModified у таблиц с IBase /// Обновления DateModified у таблиц с IBase
/// </summary> /// </summary>
@@ -156,29 +192,29 @@ namespace PARR.DAL.Services.Abstracts
/// <summary> /// <summary>
/// Заполнить поле в истории /// Заполнить поле объекта
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <param name="historyInstance"></param> /// <param name="instanceObj"></param>
/// <param name="propName"></param> /// <param name="propName"></param>
/// <param name="value"></param> /// <param name="value"></param>
private void FillHistoryProp<T>(ref object historyInstance, string propName, T value) private void FillHistoryProp<T>(ref object instanceObj, string propName, T value)
{ {
var histProp = historyInstance.GetType().GetProperty(propName); var histProp = instanceObj.GetType().GetProperty(propName);
if (histProp == null) if (histProp == null)
{ {
logger.LogError($"При добавлении истории, не найдено свойство ${propName}"); logger.LogError($"При изменении объекта для БД, не найдено свойство ${propName}");
return; return;
} }
// сравним типы // сравним типы
if (histProp.PropertyType != typeof(T)) if (histProp.PropertyType != typeof(T))
{ {
logger.LogError($"При добавлении истории, не совпадают типы у свойства {propName}, {histProp.PropertyType.Name}!={typeof(T).Name}"); logger.LogError($"При изменении объекта для БД, не совпадают типы у свойства {propName}, {histProp.PropertyType.Name}!={typeof(T).Name}");
return; return;
} }
histProp.SetValue(historyInstance, value); histProp.SetValue(instanceObj, value);
} }

View File

@@ -1,5 +1,6 @@
using PARR.DAL.DomainModels; using PARR.DAL.DomainModels;
using PARR.DAL.Models.Base; using PARR.DAL.Models.Base;
using PARR.DAL.Models.Base.History.Base;
namespace PARR.DAL.Services.Interfaces.Base namespace PARR.DAL.Services.Interfaces.Base
{ {
@@ -15,6 +16,7 @@ namespace PARR.DAL.Services.Interfaces.Base
Task<bool> DeleteAsync(Guid id); Task<bool> DeleteAsync(Guid id);
bool Delete(T obj); bool Delete(T obj);
Task<bool> CommitAsync(); //Task<bool> CommitAsync();
Task<bool> CommitAsync(HistoryInitiator? initiator = null);
} }
} }