using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CDP { public class AuditDocument { public string id { get { Debug.Assert(Records.Count > 0); AuditRecord ar = Records[0]; return GenPartitionKey(DocId, ar.EventTime, Index); } } public string DocId { get; set; } public int Index { get; set; } public List Records { get; set; } public AuditDocument() { DocId = string.Empty; Index = 0; Records = new List(); } public static string GenRootPartitionKey(string id, DateTime dt) { return string.Format($"{id}-{dt.Year}-{dt.DayOfYear}"); } public static string GenPartitionKey(string id, DateTime dt, int index = 0) { return GenRootPartitionKey(id, dt) + string.Format($"-{index}"); } } public class UserAuditDocument : AuditDocument { public string UserId { get; set; } public string id { get { Debug.Assert(Records.Count > 0); AuditRecord ar = Records[0]; return GenPartitionKey(UserId, ar.EventTime, Index); } } } public class GroupAuditDocument : AuditDocument { public string GroupId { get; set; } public string id { get { Debug.Assert(Records.Count > 0); AuditRecord ar = Records[0]; return GenPartitionKey(GroupId, ar.EventTime, Index); } } } public class TenantAuditDocument : AuditDocument { public string AppKey { get; set; } public string id { get { Debug.Assert(Records.Count > 0); AuditRecord ar = Records[0]; return GenPartitionKey(AppKey, ar.EventTime, Index); } } } public class AuditRecord { public string AppKey { get; set; } public string FileId { get; set; } public string FileName { get; set; } public string UserId { get; set; } public string GroupId { get; set; } public string Action { get; set; } public string Message { get; set; } public DateTime EventTime { get; set; } public virtual string id { get; } public AuditRecord() { EventTime = DateTime.UtcNow; } public AuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) { AppKey = appKey; FileId = fileId; FileName = fileName; UserId = userId; GroupId = groupId; Action = action; Message = message; EventTime = DateTime.UtcNow; } public int CalculateRecordSize() { int size = 0; // Calculate the size of each property size += 16; // sizeof(DateTime); // EventTime size += Encoding.UTF8.GetByteCount(UserId); // UserId size += sizeof(int); // EventType size += Encoding.UTF8.GetByteCount(Message); // Message return size; } } public class FileAuditRecord : AuditRecord { public override string id { get { return FileId; } } public FileAuditRecord() : base() { } public FileAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message) { } } public class TenantAuditRecord : AuditRecord { public override string id { get { return AppKey; } } public TenantAuditRecord() : base() { } public TenantAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message) { } } public class UserAuditRecord : AuditRecord { public override string id { get { return UserId; } } public UserAuditRecord() : base() { } public UserAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message) { } } public class GroupAuditRecord : AuditRecord { public override string id { get { return GroupId; } } public GroupAuditRecord() : base() { } public GroupAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message) { } } public class MetadataDocument { public string id { get; set; } public List PartitionKeys { get; set; } public MetadataDocument() { PartitionKeys = new List(); id = id + "-meta"; } public string GetLatestKeyForDay(DateTime dt) { string rootKey = AuditDocument.GenRootPartitionKey(id, dt); List dayKeys = new List(); PartitionKeys.Sort(); foreach (string key in PartitionKeys) { var partitionKeyParts = key.Split('-'); var year = int.Parse(partitionKeyParts[1]); var dayOfYear = int.Parse(partitionKeyParts[2]); if (year == dt.Year && dayOfYear == dt.DayOfYear) { dayKeys.Add(key); } } if (dayKeys.Count == 0) return AuditDocument.GenPartitionKey(id, dt); return dayKeys.Last(); } } }