Temporary repo to track my changes on LTS functions app porting
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

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();
}
}
}