From 2a03bc6bc85c19c398424a9bfe1238a84481ba86 Mon Sep 17 00:00:00 2001 From: Ryan Peters Date: Wed, 14 Oct 2020 11:03:25 -0400 Subject: [PATCH] add client. move common add/get helpers to Base helper --- .../20201014142201_add-client.Designer.cs | 71 +++++++++++ .../Migrations/20201014142201_add-client.cs | 17 +++ ...0201014142507_add-client-dbset.Designer.cs | 113 ++++++++++++++++++ .../20201014142507_add-client-dbset.cs | 39 ++++++ .../QuickBaseContextModelSnapshot.cs | 42 +++++++ .../QuickBaseContext.cs | 1 + .../FieldMapRegistry.cs | 10 ++ .../DataAccessManager.cs | 31 ++++- .../Entities/Client.cs | 19 +++ .../Helpers/BaseHelper.cs | 10 ++ .../Helpers/ClientHelper.cs | 13 ++ .../Helpers/CreditorHelper.cs | 12 +- COA.EnterpriseServices.Sandbox/Program.cs | 25 +++- 13 files changed, 388 insertions(+), 15 deletions(-) create mode 100644 COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.Designer.cs create mode 100644 COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.cs create mode 100644 COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.Designer.cs create mode 100644 COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.cs create mode 100644 COA.EnterpriseServices.DataAccess/Entities/Client.cs create mode 100644 COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.Designer.cs new file mode 100644 index 0000000..7ae7535 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.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("20201014142201_add-client")] + partial class addclient + { + 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/20201014142201_add-client.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.cs new file mode 100644 index 0000000..fba1bc5 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142201_add-client.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addclient : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.Designer.cs new file mode 100644 index 0000000..0d20104 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.Designer.cs @@ -0,0 +1,113 @@ +// +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("20201014142507_add-client-dbset")] + partial class addclientdbset + { + 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.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Address") + .HasColumnType("nvarchar(max)"); + + b.Property("City") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("State") + .HasColumnType("nvarchar(max)"); + + b.Property("Zip") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + 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/20201014142507_add-client-dbset.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.cs new file mode 100644 index 0000000..e98622a --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201014142507_add-client-dbset.cs @@ -0,0 +1,39 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addclientdbset : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Clients", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Created = table.Column(nullable: false), + Modified = table.Column(nullable: false), + FirstName = table.Column(nullable: true), + LastName = table.Column(nullable: true), + Email = table.Column(nullable: true), + Phone = table.Column(nullable: false), + Address = table.Column(nullable: true), + City = table.Column(nullable: true), + State = table.Column(nullable: true), + Zip = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Clients", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Clients"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs index 38903c1..df583ee 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs @@ -19,6 +19,48 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Address") + .HasColumnType("nvarchar(max)"); + + b.Property("City") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("State") + .HasColumnType("nvarchar(max)"); + + b.Property("Zip") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => { b.Property("Id") diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs index bc30f72..0bf15ca 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs @@ -14,5 +14,6 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework public DbSet Creditors { get; set; } public DbSet SettlementAttempts { get; set; } + public DbSet Clients { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs index 2938ab3..10552e6 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs @@ -13,12 +13,22 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase static FieldMapRegistry() { + // Map to QB field IDs. Obviously we will use actual IDs + 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); + + 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); } internal static void AddFieldMap(Expression> property, int fieldId) diff --git a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs index e86b2d6..ad650c6 100644 --- a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs +++ b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs @@ -7,12 +7,41 @@ namespace COA.EnterpriseServices.DataAccess { public static class DataAccessManager { - private static readonly IDictionary activeDataAccess = new Dictionary + { + #region Creditor + + ["COA.EnterpriseServices.DataAccess.Entities.Creditor"] = new[] + { + "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", + "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" + }, + + #endregion + + #region Client + + ["COA.EnterpriseServices.DataAccess.Entities.Client"] = new[] + { + "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", + "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" + } + + #endregion + }; public static ICollection> GetDataAccess() where T : class, IRecord { + var type = typeof(T); + return Dependencies.Container .GetAllInstances>() + .Where(i => + { + var dataAccessType = i.GetType().FullName; + + return activeDataAccess.ContainsKey(type.FullName) && activeDataAccess[type.FullName].Any(a => dataAccessType.StartsWith(a)); + }) .OrderBy(i => i.GetType().Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) .ToList(); } diff --git a/COA.EnterpriseServices.DataAccess/Entities/Client.cs b/COA.EnterpriseServices.DataAccess/Entities/Client.cs new file mode 100644 index 0000000..e8b3a62 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Entities/Client.cs @@ -0,0 +1,19 @@ +using System; + +namespace COA.EnterpriseServices.DataAccess.Entities +{ + public class Client : IRecord + { + public int Id { get; set; } + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public long Phone { get; set; } + public string Address { get; set; } + public string City { get; set; } + public string State { get; set; } + public string Zip { get; set; } + } +} diff --git a/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs index a6daa31..ace6721 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs @@ -25,5 +25,15 @@ namespace COA.EnterpriseServices.DataAccess.Helpers // if the "EF" version invokes first, return that value return results.FirstOrDefault(r => r != null && !r.Equals(default(TResult))); } + + public virtual T Get(int id) + { + return Invoke(d => d.Get(id)); + } + + public virtual bool Add(T item) + { + return Invoke(d => d.Add(item)); + } } } diff --git a/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs new file mode 100644 index 0000000..1440f65 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs @@ -0,0 +1,13 @@ +using COA.EnterpriseServices.DataAccess.Entities; +using System.Collections.Generic; + +namespace COA.EnterpriseServices.DataAccess.Helpers +{ + public class ClientHelper : BaseHelper + { + public ICollection FindByEmail(string email) + { + return Invoke(d => d.Get(c => c.Email.Equals(email))); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs index 1357728..b632e78 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs @@ -6,12 +6,7 @@ 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) + public ICollection FindByName(string name) { return Invoke(d => d.Get(c => c.ClientFirstName.Contains(name) || c.ClientLastName.Contains(name))); } @@ -20,10 +15,5 @@ namespace COA.EnterpriseServices.DataAccess.Helpers { 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.Sandbox/Program.cs b/COA.EnterpriseServices.Sandbox/Program.cs index 38b62a9..1a697c3 100644 --- a/COA.EnterpriseServices.Sandbox/Program.cs +++ b/COA.EnterpriseServices.Sandbox/Program.cs @@ -6,14 +6,20 @@ namespace COA.EnterpriseServices.Sandbox internal class Program { private static void Main(string[] args) + { + ClientStuff(); + //CreditorStuff(); + } + + private static void CreditorStuff() { var creditorHelper = new CreditorHelper(); // get single creditor - var singleCreditor = creditorHelper.GetCreditor(1); + var singleCreditor = creditorHelper.Get(1); // search creditors - var searchedCreditors = creditorHelper.FindCreditorsByName("Guy"); + var searchedCreditors = creditorHelper.FindByName("Guy"); // search active creditors var activeCreditors = creditorHelper.FindByStatus("Active"); @@ -25,9 +31,22 @@ namespace COA.EnterpriseServices.Sandbox Status = "Active" }; - creditorHelper.AddCreditor(newCreditor); + creditorHelper.Add(newCreditor); } + private static void ClientStuff() + { + var clientHelper = new ClientHelper(); + var newClient = new Client + { + FirstName = "Ryan", + LastName = "Peters", + Email = "ryan@binarydad.com", + Phone = 4102183673 + }; + + clientHelper.Add(newClient); + } } }