diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs index 57c5590..a7e5721 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs @@ -32,15 +32,9 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework return true; } - public ICollection Get(int id) + public T Get(int id) { - using (var context = new QuickBaseContext()) - { - return context - .Set() - .Where(r => r.Id == id) - .ToList(); - } + return Get(r => r.Id == id).FirstOrDefault(); } public ICollection Get(Expression> query) diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.Designer.cs new file mode 100644 index 0000000..9b7871e --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.Designer.cs @@ -0,0 +1,43 @@ +// +using COA.EnterpriseServices.DataAccess.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + [DbContext(typeof(QuickBaseContext))] + [Migration("20201014110259_updated-creditor")] + partial class updatedcreditor + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Creditors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.cs new file mode 100644 index 0000000..f0b3f71 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014110259_updated-creditor.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class updatedcreditor : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ClientFirstName", + table: "Creditors", + nullable: true); + + migrationBuilder.AddColumn( + name: "ClientLastName", + table: "Creditors", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ClientFirstName", + table: "Creditors"); + + migrationBuilder.DropColumn( + name: "ClientLastName", + table: "Creditors"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.Designer.cs new file mode 100644 index 0000000..ce0338d --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.Designer.cs @@ -0,0 +1,50 @@ +// +using System; +using COA.EnterpriseServices.DataAccess.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + [DbContext(typeof(QuickBaseContext))] + [Migration("20201014122348_added-create-modified-dates")] + partial class addedcreatemodifieddates + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Creditors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.cs new file mode 100644 index 0000000..f905091 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122348_added-create-modified-dates.cs @@ -0,0 +1,34 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addedcreatemodifieddates : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Created", + table: "Creditors", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "Modified", + table: "Creditors", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Created", + table: "Creditors"); + + migrationBuilder.DropColumn( + name: "Modified", + table: "Creditors"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.Designer.cs new file mode 100644 index 0000000..c45cd15 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.Designer.cs @@ -0,0 +1,68 @@ +// +using System; +using COA.EnterpriseServices.DataAccess.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + [DbContext(typeof(QuickBaseContext))] + [Migration("20201014122738_settlement-attempt")] + partial class settlementattempt + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Creditors"); + }); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.SettlementAttempt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("SettlementAttempts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.cs new file mode 100644 index 0000000..dd4fce2 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014122738_settlement-attempt.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class settlementattempt : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "SettlementAttempts", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Created = table.Column(nullable: false), + Modified = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SettlementAttempts", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SettlementAttempts"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.Designer.cs new file mode 100644 index 0000000..a0b3429 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.Designer.cs @@ -0,0 +1,71 @@ +// +using System; +using COA.EnterpriseServices.DataAccess.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + [DbContext(typeof(QuickBaseContext))] + [Migration("20201014123332_added-creditor-status")] + partial class addedcreditorstatus + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("Status") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Creditors"); + }); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.SettlementAttempt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("SettlementAttempts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.cs new file mode 100644 index 0000000..74a5f68 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014123332_added-creditor-status.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addedcreditorstatus : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Status", + table: "Creditors", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Status", + table: "Creditors"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs index a250ce2..38903c1 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs @@ -1,4 +1,5 @@ // +using System; using COA.EnterpriseServices.DataAccess.EntityFramework; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -18,17 +19,50 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("COA.EnterpriseServices.DataAccess.EntityFramework.Entities.Creditor", b => + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("int") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("Status") + .HasColumnType("nvarchar(max)"); + b.HasKey("Id"); b.ToTable("Creditors"); }); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.SettlementAttempt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("SettlementAttempts"); + }); #pragma warning restore 612, 618 } } diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs index ddb3218..bc30f72 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs @@ -1,8 +1,5 @@ -using COA.EnterpriseServices.DataAccess.EntityFramework.Entities; +using COA.EnterpriseServices.DataAccess.Entities; using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Text; namespace COA.EnterpriseServices.DataAccess.EntityFramework { @@ -16,5 +13,6 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework } public DbSet Creditors { get; set; } + public DbSet SettlementAttempts { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs new file mode 100644 index 0000000..7f2b231 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMap.cs @@ -0,0 +1,9 @@ +namespace COA.EnterpriseServices.DataAccess.QuickBase +{ + internal class FieldMap + { + internal string DeclaringTypeName { 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 new file mode 100644 index 0000000..2938ab3 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs @@ -0,0 +1,53 @@ +using COA.EnterpriseServices.DataAccess.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace COA.EnterpriseServices.DataAccess.QuickBase +{ + internal static class FieldMapRegistry + { + private static readonly ICollection registry = new List(); + + static FieldMapRegistry() + { + AddFieldMap(c => c.Id, 1); + AddFieldMap(c => c.Created, 2); + AddFieldMap(c => c.Modified, 3); + AddFieldMap(c => c.Status, 10); + AddFieldMap(c => c.ClientFirstName, 20); + AddFieldMap(c => c.ClientLastName, 21); + } + + internal static void AddFieldMap(Expression> property, int fieldId) + { + if (property.Body is MemberExpression memberExpression) + { + registry.Add(new FieldMap + { + DeclaringTypeName = memberExpression.Member.DeclaringType.FullName, + PropertyName = memberExpression.Member.Name, + FieldId = fieldId + }); + } + else if (property.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression unaryMemberExpression) + { + registry.Add(new FieldMap + { + DeclaringTypeName = unaryMemberExpression.Member.DeclaringType.FullName, + PropertyName = unaryMemberExpression.Member.Name, + FieldId = fieldId + }); + } + } + + internal static int? GetFieldId(PropertyInfo info) + { + var map = registry.FirstOrDefault(m => m.DeclaringTypeName == info.DeclaringType.FullName && m.PropertyName == info.Name); + + return map != null ? map.FieldId : default; + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs index ec0288e..cf20ad6 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs @@ -4,10 +4,14 @@ using System.Linq.Expressions; namespace COA.EnterpriseServices.DataAccess.QuickBase { - public class QuickBaseDataAccess : IDataAccess where T : class, IRecord + public class QuickBaseDataAccess : IDataAccess where T : class, IRecord, new() { public bool Add(T item) { + var fieldData = GetFieldData(item); + + // use fieldData to create mapped data to push to quickbase API + return true; } @@ -16,14 +20,32 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase throw new NotImplementedException(); } - public ICollection Get(int id) + public T Get(int id) { - throw new NotImplementedException(); + // we'll never get data from QB + return null; } public ICollection Get(Expression> query) { - throw new NotImplementedException(); + // 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/COA.EnterpriseServices.DataAccess.csproj b/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj index cb63190..9cfacb7 100644 --- a/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj +++ b/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj @@ -4,4 +4,8 @@ netcoreapp3.1 + + + + diff --git a/COA.EnterpriseServices.DataAccess/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/CreditorHelper.cs deleted file mode 100644 index 975778b..0000000 --- a/COA.EnterpriseServices.DataAccess/CreditorHelper.cs +++ /dev/null @@ -1,15 +0,0 @@ -using COA.EnterpriseServices.DataAccess.Models; -using System; -using System.Collections.Generic; -using System.Text; - -namespace COA.EnterpriseServices.DataAccess -{ - public class CreditorHelper - { - public Creditor GetCreditor(int id) - { - throw new NotImplementedException(); - } - } -} diff --git a/COA.EnterpriseServices.DataAccess/Dependencies.cs b/COA.EnterpriseServices.DataAccess/Dependencies.cs new file mode 100644 index 0000000..15ba280 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Dependencies.cs @@ -0,0 +1,23 @@ +using StructureMap; + +namespace COA.EnterpriseServices.DataAccess +{ + public static class Dependencies + { + public static IContainer Container { get; } + + static Dependencies() + { + Container = new Container(c => + { + c.Scan(s => + { + s.AddAllTypesOf(typeof(IDataAccess<>)); + + s.WithDefaultConventions(); + s.AssembliesFromApplicationBaseDirectory(); + }); + }); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Entities/Creditor.cs b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs similarity index 58% rename from COA.EnterpriseServices.DataAccess.EntityFramework/Entities/Creditor.cs rename to COA.EnterpriseServices.DataAccess/Entities/Creditor.cs index a978a46..c80ad05 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/Entities/Creditor.cs +++ b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs @@ -2,11 +2,14 @@ using System.Collections.Generic; using System.Text; -namespace COA.EnterpriseServices.DataAccess.EntityFramework.Entities +namespace COA.EnterpriseServices.DataAccess.Entities { public class Creditor : IRecord { public int Id { get; set; } + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + public string Status { get; set; } public string ClientFirstName { get; set; } public string ClientLastName { get; set; } } diff --git a/COA.EnterpriseServices.DataAccess/Entities/SettlementAttempt.cs b/COA.EnterpriseServices.DataAccess/Entities/SettlementAttempt.cs new file mode 100644 index 0000000..ae02a09 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Entities/SettlementAttempt.cs @@ -0,0 +1,11 @@ +using System; + +namespace COA.EnterpriseServices.DataAccess.Entities +{ + public class SettlementAttempt : IRecord + { + public int Id { get; set; } + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + } +} diff --git a/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs new file mode 100644 index 0000000..10e6f06 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace COA.EnterpriseServices.DataAccess.Helpers +{ + public class BaseHelper where T : class, IRecord + { + protected readonly ICollection> dataAccessInstances; + + public BaseHelper() + { + dataAccessInstances = Dependencies.Container + .GetAllInstances>() + .OrderBy(i => i.GetType().Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + + protected TResult Invoke(Func, TResult> func) + { + var results = new List(); + + foreach (var dataAccessInstance in dataAccessInstances) + { + results.Add(func(dataAccessInstance)); + } + + // if the "EF" version invokes first, return that value + return results.FirstOrDefault(r => r != null && !r.Equals(default(TResult))); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs new file mode 100644 index 0000000..1357728 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs @@ -0,0 +1,29 @@ +using COA.EnterpriseServices.DataAccess.Entities; +using System.Collections.Generic; +using System.Text; + +namespace COA.EnterpriseServices.DataAccess.Helpers +{ + public class CreditorHelper : BaseHelper + { + public Creditor GetCreditor(int id) + { + return Invoke(d => d.Get(id)); + } + + public ICollection FindCreditorsByName(string name) + { + return Invoke(d => d.Get(c => c.ClientFirstName.Contains(name) || c.ClientLastName.Contains(name))); + } + + public ICollection FindByStatus(string status) + { + return Invoke(d => d.Get(c => c.Status == status)); + } + + public bool AddCreditor(Creditor creditor) + { + return Invoke(d => d.Add(creditor)); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess/IDataAccess.cs b/COA.EnterpriseServices.DataAccess/IDataAccess.cs index 03e10c7..ede728b 100644 --- a/COA.EnterpriseServices.DataAccess/IDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess/IDataAccess.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Linq.Expressions; -using System.Reflection; namespace COA.EnterpriseServices.DataAccess { @@ -12,60 +10,8 @@ namespace COA.EnterpriseServices.DataAccess bool Update(T item); - ICollection Get(int id); + T Get(int id); ICollection Get(Expression> query); } - - //public class AggregateDataAccess : IDataAccess where T : class, IRecord - //{ - // private static ICollection dataAccessTypes; - - // static AggregateDataAccess() => LoadInstances(); - - // /// - // /// Invokes a method for all instances of - // /// - // /// - // /// - // /// - // protected TResult Invoke(Func, TResult> func) - // { - // var results = new List(); - - // foreach (var dataAccessType in dataAccessTypes) - // { - // var instance = Activator.CreateInstance(dataAccessType) as IDataAccess; - - // results.Add(func(instance)); - // } - - // // if the "EF" version invokes first, return that value - // return results.FirstOrDefault(r => !r.Equals(default(T))); - // } - - // private static void LoadInstances() - // { - // if (dataAccessTypes == null) - // { - // var type = typeof(IDataAccess); - // var aggregateType = typeof(AggregateDataAccess<>); - - // // load all types except for 1) the interface itself, 2) any interface, and 3) is not implementing AggregateDataAccess - // // NOTE: the "EF" version will load first, allowing for the "QuickBase" version to run last, in a separate thread if desired - // dataAccessTypes = AppDomain.CurrentDomain - // .GetAssemblies() - // .Where(a => a.FullName.StartsWith("COA.EnterpriseServices.DataAccess")) - // .SelectMany(a => a.ExportedTypes) - // //.Where(t => type.IsAssignableFrom(t)/* && !t.IsInterface && !aggregateType.IsAssignableFrom(t)*/) - // //.OrderBy(t => t.Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) - // .ToList(); - // } - // } - - // public bool Add(T item) => Invoke(d => d.Add(item)); - // public bool Update(T item) => Invoke(d => d.Update(item)); - // public ICollection Get(int id) => Invoke(d => d.Get(id)); - // public ICollection Get(Expression> query) => Invoke(d => d.Get(query)); - //} } diff --git a/COA.EnterpriseServices.DataAccess/IRecord.cs b/COA.EnterpriseServices.DataAccess/IRecord.cs index 7c505c8..8920b8f 100644 --- a/COA.EnterpriseServices.DataAccess/IRecord.cs +++ b/COA.EnterpriseServices.DataAccess/IRecord.cs @@ -1,7 +1,11 @@ -namespace COA.EnterpriseServices.DataAccess +using System; + +namespace COA.EnterpriseServices.DataAccess { public interface IRecord { int Id { get; set; } + DateTime Created { get; set; } + DateTime Modified { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess/Models/Creditor.cs b/COA.EnterpriseServices.DataAccess/Models/Creditor.cs deleted file mode 100644 index 170abe0..0000000 --- a/COA.EnterpriseServices.DataAccess/Models/Creditor.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace COA.EnterpriseServices.DataAccess.Models -{ - public class Creditor : IRecord - { - public int Id { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - } -} diff --git a/COA.EnterpriseServices.Sandbox/COA.EnterpriseServices.Sandbox.csproj b/COA.EnterpriseServices.Sandbox/COA.EnterpriseServices.Sandbox.csproj index a1345e8..ddd1894 100644 --- a/COA.EnterpriseServices.Sandbox/COA.EnterpriseServices.Sandbox.csproj +++ b/COA.EnterpriseServices.Sandbox/COA.EnterpriseServices.Sandbox.csproj @@ -5,10 +5,6 @@ netcoreapp3.1 - - - - diff --git a/COA.EnterpriseServices.Sandbox/Program.cs b/COA.EnterpriseServices.Sandbox/Program.cs index d7a1d59..38b62a9 100644 --- a/COA.EnterpriseServices.Sandbox/Program.cs +++ b/COA.EnterpriseServices.Sandbox/Program.cs @@ -1,40 +1,33 @@ -using COA.EnterpriseServices.DataAccess; -using COA.EnterpriseServices.DataAccess.EntityFramework; -using COA.EnterpriseServices.DataAccess.EntityFramework.Entities; -using COA.EnterpriseServices.DataAccess.QuickBase; -using StructureMap; -using System; +using COA.EnterpriseServices.DataAccess.Entities; +using COA.EnterpriseServices.DataAccess.Helpers; namespace COA.EnterpriseServices.Sandbox { - class Program + internal class Program { - static void Main(string[] args) + private static void Main(string[] args) { - var container = CreateContainer(); + var creditorHelper = new CreditorHelper(); - var creditorDataAccess = container.GetAllInstances>(); + // get single creditor + var singleCreditor = creditorHelper.GetCreditor(1); + // search creditors + var searchedCreditors = creditorHelper.FindCreditorsByName("Guy"); - } + // search active creditors + var activeCreditors = creditorHelper.FindByStatus("Active"); - private static IContainer CreateContainer() - { - return new Container(c => + var newCreditor = new Creditor { - //c.Scan(s => - //{ - // s.WithDefaultConventions(); - // s.AssembliesFromApplicationBaseDirectory(); - //}); + ClientFirstName = "New", + ClientLastName = "Guy", + Status = "Active" + }; - // when saving to QuickBase is needed (as well as SQL) - c.For>().Add>(); - c.For>().Add>(); - - // when only SQL is needed - //c.For().Singleton().Use(); - }); + creditorHelper.AddCreditor(newCreditor); } + + } }