You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
6.4 KiB
244 lines
6.4 KiB
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();
|
|
}
|
|
}
|
|
|
|
}
|