Добавить контракт изменений деталей аудита
Детали событий описываются списком изменений «параметр: было → стало» (AuditChangeDto, AuditDetails), а не произвольным JSON. Запись везде идёт через конструктор AuditDetails; разбор старого плоского формата сохранён. Операторские ручки аудита отдают AuditRecordViewDto с changes и именем пользователя (батч-резолв через ITenantRepository.FindNamesByIdsAsync). Детектор подозрительной активности читает логин через новый разбор.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
using System.Globalization;
|
||||
|
||||
namespace Deal.Modules.Tenants.Application.Models;
|
||||
|
||||
/// <summary>
|
||||
/// Конструктор деталей события аудита
|
||||
/// </summary>
|
||||
public static class AuditDetails
|
||||
{
|
||||
/// <summary>
|
||||
/// Задаёт параметр события
|
||||
/// </summary>
|
||||
/// <param name="field">Код параметра.</param>
|
||||
/// <param name="value">Значение параметра.</param>
|
||||
/// <returns>Изменение «параметр задан».</returns>
|
||||
public static AuditChangeDto Set(string field, object? value) =>
|
||||
new(field, null, Format(value));
|
||||
|
||||
/// <summary>
|
||||
/// Задаёт изменение параметра «было → стало»
|
||||
/// </summary>
|
||||
/// <param name="field">Код параметра.</param>
|
||||
/// <param name="from">Значение до изменения.</param>
|
||||
/// <param name="to">Значение после изменения.</param>
|
||||
/// <returns>Изменение «было → стало».</returns>
|
||||
public static AuditChangeDto Change(string field, object? from, object? to) =>
|
||||
new(field, Format(from), Format(to));
|
||||
|
||||
// Приводит значение к строке отображения (инвариантная культура).
|
||||
// value: Значение параметра.
|
||||
// Возвращает: Строковое представление либо null.
|
||||
private static string? Format(object? value) => value switch
|
||||
{
|
||||
null => null,
|
||||
string text => text,
|
||||
bool flag => flag ? "true" : "false",
|
||||
DateTimeOffset moment => moment.ToString("O", CultureInfo.InvariantCulture),
|
||||
IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture),
|
||||
_ => value.ToString(),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user