diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs index 7a08141..4e4fd70 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs @@ -1,8 +1,10 @@ -namespace COA.EnterpriseServices.DataAccess.QuickBase +using System; + +namespace COA.EnterpriseServices.DataAccess.QuickBase { internal class FieldMap { - internal string DeclaringTypeName { get; set; } + internal Type ItemType { get; set; } internal string PropertyName { get; set; } internal int FieldId { get; set; } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs index 7a6e97c..b34e897 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs @@ -9,13 +9,6 @@ using System.Reflection; namespace COA.EnterpriseServices.DataAccess.QuickBase { - internal class QuickBaseRecordContext - { - internal string Table { get; set; } - internal IDictionary FieldIds { get; set; } = new Dictionary(); - - } - internal static class FieldMapRegistry { private static readonly ICollection fieldRegistry = new List(); @@ -23,50 +16,90 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase static FieldMapRegistry() { - // Map to QB field IDs. Obviously we will use actual IDs - AddTable() - .WithProperty(c => c.Id, CreditorsFieldMap.RecordId) - .WithProperty(c => c.Modified, CreditorsFieldMap.DateModified); + .WithDefaults() + .WithProperty(c => c.Status, CreditorsFieldMap.CreditorStatus) + .WithProperty(c => c.ClientFirstName, CreditorsFieldMap.ClientFirstName) + .WithProperty(c => c.ClientLastName, CreditorsFieldMap.ClientLastName) + .WithProperty(c => c.CurrentCreditorProfileId, CreditorsFieldMap.RelatedCurrentCreditorPrimary) + .WithProperty(c => c.OriginalCreditorProfileId, CreditorsFieldMap.RelatedOriginalCreditor) + .WithProperty(c => c.AccountNumber, CreditorsFieldMap.AccountNum); - AddFieldMap(c => c.Id, CreditorsFieldMap.RecordId); - AddFieldMap(c => c.Created, CreditorsFieldMap.DateCreated); - AddFieldMap(c => c.Modified, CreditorsFieldMap.DateModified); - AddFieldMap(c => c.Status, CreditorsFieldMap.CreditorStatus); - AddFieldMap(c => c.ClientFirstName, CreditorsFieldMap.ClientFirstName); - AddFieldMap(c => c.ClientLastName, CreditorsFieldMap.ClientLastName); - AddFieldMap(c => c.CurrentCreditorProfileId, CreditorsFieldMap.RelatedCurrentCreditorPrimary); - AddFieldMap(c => c.OriginalCreditorProfileId, CreditorsFieldMap.RelatedOriginalCreditor); - AddFieldMap(c => c.AccountNumber, CreditorsFieldMap.AccountNum); - - //AddFieldMap(c => c.Id, 1); - //AddFieldMap(c => c.Created, 2); - //AddFieldMap(c => c.Modified, 3); - //AddFieldMap(c => c.Email, 10); - //AddFieldMap(c => c.Phone, 11); - //AddFieldMap(c => c.FirstName, 20); - //AddFieldMap(c => c.LastName, 21); + AddTable() + .WithDefaults() + .WithProperty(c => c.FirstName, ClientFieldMap.FirstName) + .WithProperty(c => c.LastName, ClientFieldMap.LastName) + .WithProperty(c => c.Email, ClientFieldMap.ClientPrimaryEmail) + .WithProperty(c => c.Phone, ClientFieldMap.ClientPrimaryPhone); } - public static TableMap AddTable() + /// + /// Adds a table mapping for a QuickBase field map + /// + /// + /// + /// + private static TableMap AddTable() where TEntity : IRecord { - tableRegistry.Add(typeof(TEntity), "asdas"); + var tableNameAttribute = typeof(TEnumFieldMap).GetCustomAttribute(); - throw new NotImplementedException(); + if (tableNameAttribute != null) + { + tableRegistry.Add(typeof(TEntity), tableNameAttribute.Name); + } + + return default; } - public static TableMap WithProperty(this TableMap table, Expression> property, Enum field) + /// + /// Adds default property mappings for common fields + /// + /// + /// + /// + /// + internal static TableMap WithDefaults(this TableMap table) where TEntity : IRecord where TEnumFieldMap : Enum { - throw new NotImplementedException(); + fieldRegistry.Add(new FieldMap + { + ItemType = typeof(TEntity), + PropertyName = nameof(IRecord.Id), + FieldId = PartnerApis.QuickBase.Constants.RecordIdFieldId + }); + + fieldRegistry.Add(new FieldMap + { + ItemType = typeof(TEntity), + PropertyName = nameof(IRecord.Created), + FieldId = PartnerApis.QuickBase.Constants.DateCreatedFieldId + }); + + fieldRegistry.Add(new FieldMap + { + ItemType = typeof(TEntity), + PropertyName = nameof(IRecord.Modified), + FieldId = PartnerApis.QuickBase.Constants.DateModifiedFieldId + }); + + return default; } - internal static void AddFieldMap(Expression> property, Enum field) + /// + /// Adds a propert mapping for an entity property + /// + /// + /// + /// + /// + /// + /// + internal static TableMap WithProperty(this TableMap table, Expression> property, TEnumFieldMap field) { if (property.Body is MemberExpression memberExpression) { fieldRegistry.Add(new FieldMap { - DeclaringTypeName = memberExpression.Member.DeclaringType.FullName, + ItemType = memberExpression.Member.DeclaringType, PropertyName = memberExpression.Member.Name, FieldId = field.To() }); @@ -75,17 +108,18 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase { fieldRegistry.Add(new FieldMap { - DeclaringTypeName = unaryMemberExpression.Member.DeclaringType.FullName, + ItemType = unaryMemberExpression.Member.DeclaringType, PropertyName = unaryMemberExpression.Member.Name, - //FieldId = fieldId, FieldId = field.To() }); } + + return default; } internal static int? GetFieldId(PropertyInfo info) { - var map = fieldRegistry.FirstOrDefault(m => m.DeclaringTypeName == info.DeclaringType.FullName && m.PropertyName == info.Name); + var map = fieldRegistry.FirstOrDefault(m => m.ItemType == info.DeclaringType && m.PropertyName == info.Name); return map != null ? map.FieldId : default; } @@ -93,11 +127,14 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase internal static QuickBaseRecordContext GetTableContext(object item) { var context = new QuickBaseRecordContext(); - var properties = item.GetType().GetProperties(); + var itemType = item.GetType(); + var properties = itemType.GetProperties(); + + context.Table = tableRegistry.FirstOrDefault(r => r.Key == itemType).Value; foreach (var property in properties) { - var fieldId = FieldMapRegistry.GetFieldId(property); + var fieldId = GetFieldId(property); var value = property.GetValue(item); if (fieldId != null) diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs index 5761858..2353e9e 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs @@ -27,6 +27,8 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase public bool Update(T item) { + var fieldData = FieldMapRegistry.GetTableContext(item); + return true; } @@ -35,21 +37,5 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase // we'll never get data from QB return null; } - - private IEnumerable> GetFieldData(T item) - { - var properties = item.GetType().GetProperties(); - - foreach (var property in properties) - { - var fieldId = FieldMapRegistry.GetFieldId(property); - var value = property.GetValue(item); - - if (fieldId != null) - { - yield return new KeyValuePair(fieldId.Value, value); - } - } - } } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseRecordContext.cs b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseRecordContext.cs new file mode 100644 index 0000000..a124e8c --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseRecordContext.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace COA.EnterpriseServices.DataAccess.QuickBase +{ + internal class QuickBaseRecordContext + { + internal string Table { get; set; } + internal IDictionary FieldIds { get; set; } = new Dictionary(); + } +}