Базовый domain-каркас для SuperAdmin console (Phase 1): Organization: - IsArchived bool + ArchivedAt DateTime? — архивная орга не видна юзерам, но данные сохраняются. Удалить навсегда можно только из архива >30 дней (логика в API на следующем коммите). - AccountOwnerUserId Guid? — главный владелец, не путать с админами per-org. SuperAdmin может сменить через action c reason в audit-log. - HasIndex(IsArchived) для быстрой фильтрации. SuperAdminAuditLog (новая таблица super_admin_audit_log): - Не tenant-scoped — лог общий по всей системе. - ActionType (CreateOrg/EditOrg/ArchiveOrg/RestoreOrg/DeleteOrg/ ChangeOwner/EditEntity), OrganizationId, EntityType+EntityId, Description, Reason, ChangesJson (jsonb), IpAddress. - Индексы: CreatedAt, (SuperAdminUserId, CreatedAt), (OrganizationId, CreatedAt) — типовые запросы фильтра. Migration Phase4_SuperAdminConsole добавляет 3 колонки в organizations + создаёт super_admin_audit_log с тремя композитными индексами. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
21 lines
970 B
C#
21 lines
970 B
C#
using foodmarket.Domain.Common;
|
||
|
||
namespace foodmarket.Domain.Organizations;
|
||
|
||
/// <summary>Журнал действий SuperAdmin'а: создание/правка/архивирование
|
||
/// организаций, смена аккаунт-владельца, правки в режиме «войти как».
|
||
/// Не tenant-scoped — лог общий для всей системы.</summary>
|
||
public class SuperAdminAuditLog : Entity
|
||
{
|
||
public Guid SuperAdminUserId { get; set; }
|
||
public string ActionType { get; set; } = "";
|
||
public Guid? OrganizationId { get; set; }
|
||
public string? EntityType { get; set; }
|
||
public Guid? EntityId { get; set; }
|
||
public string? Description { get; set; }
|
||
public string? Reason { get; set; }
|
||
/// <summary>JSON с diff'ом before/after или другим payload'ом действия.</summary>
|
||
public string ChangesJson { get; set; } = "{}";
|
||
public string IpAddress { get; set; } = "";
|
||
}
|