using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using Phantom.Server.Database.Enums; namespace Phantom.Server.Database.Entities; [Table("AuditLog", Schema = "system")] [SuppressMessage("ReSharper", "AutoPropertyCanBeMadeGetOnly.Global")] [SuppressMessage("ReSharper", "ClassWithVirtualMembersNeverInherited.Global")] public class AuditLogEntity : IDisposable { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [SuppressMessage("ReSharper", "UnusedMember.Global")] public long Id { get; set; } public Guid? UserGuid { get; set; } public DateTime UtcTime { get; set; } // Note: Converting to UTC is not best practice, but for historical records it's good enough. public AuditLogEventType EventType { get; set; } public AuditLogSubjectType SubjectType { get; set; } public string SubjectId { get; set; } public JsonDocument? Data { get; set; } public virtual UserEntity? User { get; set; } [SuppressMessage("ReSharper", "UnusedMember.Global")] internal AuditLogEntity() { SubjectId = string.Empty; } public AuditLogEntity(Guid? userGuid, AuditLogEventType eventType, string subjectId, Dictionary<string, object?>? data) { UserGuid = userGuid; UtcTime = DateTime.UtcNow; EventType = eventType; SubjectType = eventType.GetSubjectType(); SubjectId = subjectId; Data = data == null ? null : JsonSerializer.SerializeToDocument(data); } public void Dispose() { Data?.Dispose(); } }