Показывать реального пользователя в аудите и лимитах

Добавлен батч-резолв логинов владельцев пространств (IAuthStore.FindOwnerLoginsByTenantIdsAsync). Ответы аудита дополнены userName (владелец пространства либо логин попытки), ответы лимитов — ownerLogin; имя пространства остаётся вторичным.
This commit is contained in:
2026-09-13 20:23:12 +03:00
parent c46bbe9332
commit a99bb4a713
7 changed files with 111 additions and 23 deletions
@@ -41,6 +41,16 @@ public interface IAuthStore
/// <returns>Пользователи тенанта, упорядоченные по времени создания (пусто — пользователей нет).</returns>
public Task<IReadOnlyList<UserIdentityDto>> ListUsersByTenantIdAsync(Guid tenantId, CancellationToken ct);
/// <summary>
/// Логины владельцев тенантов
/// </summary>
/// <param name="tenantIds">Идентификаторы тенантов.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Словарь tenantId → логин владельца (первый пользователь по времени создания); тенанты без пользователей не включаются.</returns>
public Task<IReadOnlyDictionary<Guid, string>> FindOwnerLoginsByTenantIdsAsync(
IReadOnlyCollection<Guid> tenantIds,
CancellationToken ct);
/// <summary>
/// Сохраняет новую сессию.
/// </summary>
@@ -7,7 +7,8 @@ namespace Deal.Modules.Tenants.Application.Models;
/// <param name="ActorType">Тип актора — константа <c>AuditActorTypes</c>.</param>
/// <param name="ActorId">Идентификатор актора; null, если актор неизвестен.</param>
/// <param name="TenantId">Идентификатор пользователя события; null для операторских/системных событий.</param>
/// <param name="TenantName">Имя пользователя события; null, если не разрешено.</param>
/// <param name="UserName">Логин реального пользователя (владелец пространства либо логин попытки); null, если не разрешён.</param>
/// <param name="TenantName">Имя пространства события; null, если не разрешено.</param>
/// <param name="Ip">IP-адрес клиента (без порта); null для серверных действий.</param>
/// <param name="Changes">Человекочитаемые изменения параметров события.</param>
/// <param name="DetailJson">Сырые детали события в JSON; null, если деталей нет.</param>
@@ -18,6 +19,7 @@ public sealed record AuditRecordViewDto(
string ActorType,
Guid? ActorId,
Guid? TenantId,
string? UserName,
string? TenantName,
string? Ip,
IReadOnlyList<AuditChangeDto> Changes,