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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace CDP
  8. {
  9. public class AuditDocument
  10. {
  11. public string id
  12. {
  13. get
  14. {
  15. Debug.Assert(Records.Count > 0);
  16. AuditRecord ar = Records[0];
  17. return GenPartitionKey(DocId, ar.EventTime, Index);
  18. }
  19. }
  20. public string DocId { get; set; }
  21. public int Index { get; set; }
  22. public List<AuditRecord> Records { get; set; }
  23. public AuditDocument()
  24. {
  25. DocId = string.Empty;
  26. Index = 0;
  27. Records = new List<AuditRecord>();
  28. }
  29. public static string GenRootPartitionKey(string id, DateTime dt)
  30. {
  31. return string.Format($"{id}-{dt.Year}-{dt.DayOfYear}");
  32. }
  33. public static string GenPartitionKey(string id, DateTime dt, int index = 0)
  34. {
  35. return GenRootPartitionKey(id, dt) + string.Format($"-{index}");
  36. }
  37. }
  38. public class UserAuditDocument : AuditDocument
  39. {
  40. public string UserId { get; set; }
  41. public string id
  42. {
  43. get
  44. {
  45. Debug.Assert(Records.Count > 0);
  46. AuditRecord ar = Records[0];
  47. return GenPartitionKey(UserId, ar.EventTime, Index);
  48. }
  49. }
  50. }
  51. public class GroupAuditDocument : AuditDocument
  52. {
  53. public string GroupId { get; set; }
  54. public string id
  55. {
  56. get
  57. {
  58. Debug.Assert(Records.Count > 0);
  59. AuditRecord ar = Records[0];
  60. return GenPartitionKey(GroupId, ar.EventTime, Index);
  61. }
  62. }
  63. }
  64. public class TenantAuditDocument : AuditDocument
  65. {
  66. public string AppKey { get; set; }
  67. public string id
  68. {
  69. get
  70. {
  71. Debug.Assert(Records.Count > 0);
  72. AuditRecord ar = Records[0];
  73. return GenPartitionKey(AppKey, ar.EventTime, Index);
  74. }
  75. }
  76. }
  77. public class AuditRecord
  78. {
  79. public string AppKey { get; set; }
  80. public string FileId { get; set; }
  81. public string FileName { get; set; }
  82. public string UserId { get; set; }
  83. public string GroupId { get; set; }
  84. public string Action { get; set; }
  85. public string Message { get; set; }
  86. public DateTime EventTime { get; set; }
  87. public virtual string id { get; }
  88. public AuditRecord()
  89. {
  90. EventTime = DateTime.UtcNow;
  91. }
  92. public AuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message)
  93. {
  94. AppKey = appKey;
  95. FileId = fileId;
  96. FileName = fileName;
  97. UserId = userId;
  98. GroupId = groupId;
  99. Action = action;
  100. Message = message;
  101. EventTime = DateTime.UtcNow;
  102. }
  103. public int CalculateRecordSize()
  104. {
  105. int size = 0;
  106. // Calculate the size of each property
  107. size += 16; // sizeof(DateTime); // EventTime
  108. size += Encoding.UTF8.GetByteCount(UserId); // UserId
  109. size += sizeof(int); // EventType
  110. size += Encoding.UTF8.GetByteCount(Message); // Message
  111. return size;
  112. }
  113. }
  114. public class FileAuditRecord : AuditRecord
  115. {
  116. public override string id
  117. {
  118. get
  119. {
  120. return FileId;
  121. }
  122. }
  123. public FileAuditRecord() : base()
  124. {
  125. }
  126. public FileAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message)
  127. {
  128. }
  129. }
  130. public class TenantAuditRecord : AuditRecord
  131. {
  132. public override string id
  133. {
  134. get
  135. {
  136. return AppKey;
  137. }
  138. }
  139. public TenantAuditRecord() : base()
  140. {
  141. }
  142. public TenantAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message)
  143. {
  144. }
  145. }
  146. public class UserAuditRecord : AuditRecord
  147. {
  148. public override string id
  149. {
  150. get
  151. {
  152. return UserId;
  153. }
  154. }
  155. public UserAuditRecord() : base()
  156. {
  157. }
  158. public UserAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message)
  159. {
  160. }
  161. }
  162. public class GroupAuditRecord : AuditRecord
  163. {
  164. public override string id
  165. {
  166. get
  167. {
  168. return GroupId;
  169. }
  170. }
  171. public GroupAuditRecord() : base()
  172. {
  173. }
  174. public GroupAuditRecord(string appKey, string fileId, string fileName, string userId, string groupId, string action, string message) : base(appKey, fileId, fileName, userId, groupId, action, message)
  175. {
  176. }
  177. }
  178. public class MetadataDocument
  179. {
  180. public string id { get; set; }
  181. public List<string> PartitionKeys { get; set; }
  182. public MetadataDocument()
  183. {
  184. PartitionKeys = new List<string>();
  185. id = id + "-meta";
  186. }
  187. public string GetLatestKeyForDay(DateTime dt)
  188. {
  189. string rootKey = AuditDocument.GenRootPartitionKey(id, dt);
  190. List<string> dayKeys = new List<string>();
  191. PartitionKeys.Sort();
  192. foreach (string key in PartitionKeys)
  193. {
  194. var partitionKeyParts = key.Split('-');
  195. var year = int.Parse(partitionKeyParts[1]);
  196. var dayOfYear = int.Parse(partitionKeyParts[2]);
  197. if (year == dt.Year && dayOfYear == dt.DayOfYear)
  198. {
  199. dayKeys.Add(key);
  200. }
  201. }
  202. if (dayKeys.Count == 0)
  203. return AuditDocument.GenPartitionKey(id, dt);
  204. return dayKeys.Last();
  205. }
  206. }
  207. }