|
|
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<AuditRecord> Records { get; set; }
public AuditDocument() { DocId = string.Empty; Index = 0; Records = new List<AuditRecord>(); }
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<string> PartitionKeys { get; set; }
public MetadataDocument() { PartitionKeys = new List<string>(); id = id + "-meta"; } public string GetLatestKeyForDay(DateTime dt) { string rootKey = AuditDocument.GenRootPartitionKey(id, dt); List<string> dayKeys = new List<string>(); 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(); } }
}
|