using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CDP { public class ContactsDocument { public string id { get { return GenPartitionKey(AppKey, UserId, Index); } } public string AppKey { get; set; } public string UserId { get; set; } public int Index { get; set; } public List Records { get; set; } public ContactsDocument() { 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 appKey, string userId, int index = 0) { return string.Format($"{appKey}-{userId}-{index}"); } } public class ContactRecord { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public string Address { get; set; } public string Company { get; set; } public DateTime EventTime { get; set; } public ContactRecord() { EventTime = DateTime.UtcNow; } public ContactRecord(string name, string email, string phone, string address, string company) { Name = name; Email = email; Phone = phone; Address = address; Company = company; EventTime = DateTime.UtcNow; } public int CalculateRecordSize() { int size = 0; size += 16; // sizeof(DateTime); // EventTime size += Encoding.UTF8.GetByteCount(Name) == 0 ? 20 : Encoding.UTF8.GetByteCount(Name); // UserId size += Encoding.UTF8.GetByteCount(Email) == 0 ? 50 : Encoding.UTF8.GetByteCount(Email); size += Encoding.UTF8.GetByteCount(Phone) == 0 ? 15 : Encoding.UTF8.GetByteCount(Phone); size += Encoding.UTF8.GetByteCount(Address) == 0 ? 70 : Encoding.UTF8.GetByteCount(Address); size += Encoding.UTF8.GetByteCount(Company) == 0 ? 20 : Encoding.UTF8.GetByteCount(Company); size += sizeof(int); return size; } } public class MetadataDocumentContact { public string id { get; set; } public List PartitionKeys { get; set; } public MetadataDocumentContact() { PartitionKeys = new List(); id = id + "-meta"; } public string GetLatestKey(string appKey, string userId) { PartitionKeys.Sort(); if (PartitionKeys.Count == 0) return GroupsDocument.GenPartitionKey(appKey, userId); return PartitionKeys.Last(); } } }