feat(dal): тестирование инициатора
This commit is contained in:
11
PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs
Normal file
11
PARR.DAL/Models/Base/History/Base/HistoryInitiator.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user