diff --git a/COA.EnterpriseServices.Creditors/COA.EnterpriseServices.Creditors.csproj b/COA.EnterpriseServices.Creditors/COA.EnterpriseServices.Creditors.csproj index 2a1a83b..286947f 100644 --- a/COA.EnterpriseServices.Creditors/COA.EnterpriseServices.Creditors.csproj +++ b/COA.EnterpriseServices.Creditors/COA.EnterpriseServices.Creditors.csproj @@ -5,6 +5,10 @@ COA.EnterpriseServices.Creditors + + + + diff --git a/COA.EnterpriseServices.Creditors/CreditorController.cs b/COA.EnterpriseServices.Creditors/CreditorController.cs index acf1d8a..2e0bc56 100644 --- a/COA.EnterpriseServices.Creditors/CreditorController.cs +++ b/COA.EnterpriseServices.Creditors/CreditorController.cs @@ -19,9 +19,9 @@ return creditorLibrary.SetCreditorStatus(creditorId, status); } - public void AddOfferResponse() + public void AddOfferResponse(OfferResponse response) { - creditorLibrary.AddOfferResponse(); + creditorLibrary.AddOfferResponse(response); } } } diff --git a/COA.EnterpriseServices.Creditors/CreditorLibrary.cs b/COA.EnterpriseServices.Creditors/CreditorLibrary.cs index 163519f..3d6079d 100644 --- a/COA.EnterpriseServices.Creditors/CreditorLibrary.cs +++ b/COA.EnterpriseServices.Creditors/CreditorLibrary.cs @@ -15,7 +15,7 @@ namespace COA.EnterpriseServices.Creditors { var creditor = creditorHelper.GetCreditor(creditorId); - return creditor.Status; + return creditor.creditorStatus; } public bool SetCreditorStatus(int creditorId, string status) @@ -23,11 +23,11 @@ namespace COA.EnterpriseServices.Creditors return creditorHelper.SetCreditorStatus(creditorId, status); } - public void AddOfferResponse() + public void AddOfferResponse(OfferResponse response) { // just a stub until we add actual DataObjects - creditorHelper.SetOriginalCreditorAsPrimary(1); + creditorHelper.SetOriginalCreditorAsPrimary(response.CreditorId); } } } diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015133238_add-account-number.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015133238_add-account-number.Designer.cs new file mode 100644 index 0000000..95283b5 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015133238_add-account-number.Designer.cs @@ -0,0 +1,122 @@ +// +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("20201015133238_add-account-number")] + partial class addaccountnumber + { + 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("AccountNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("CurrentCreditorProfileId") + .HasColumnType("int"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("OriginalCreditorProfileId") + .HasColumnType("int"); + + 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/20201015133238_add-account-number.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015133238_add-account-number.cs new file mode 100644 index 0000000..f10c7d7 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015133238_add-account-number.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addaccountnumber : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AccountNumber", + table: "Creditors", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AccountNumber", + table: "Creditors"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs index 44734ed..9c0bc54 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs @@ -68,6 +68,9 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations .HasColumnType("int") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + b.Property("AccountNumber") + .HasColumnType("nvarchar(max)"); + b.Property("ClientFirstName") .HasColumnType("nvarchar(max)"); diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs index 0bf15ca..ab7a800 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/QuickBaseContext.cs @@ -14,6 +14,6 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework public DbSet Creditors { get; set; } public DbSet SettlementAttempts { get; set; } - public DbSet Clients { get; set; } + public DbSet Clients { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/COA.EnterpriseServices.DataAccess.QuickBase.csproj b/COA.EnterpriseServices.DataAccess.QuickBase/COA.EnterpriseServices.DataAccess.QuickBase.csproj index da7db72..1072e82 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/COA.EnterpriseServices.DataAccess.QuickBase.csproj +++ b/COA.EnterpriseServices.DataAccess.QuickBase/COA.EnterpriseServices.DataAccess.QuickBase.csproj @@ -4,6 +4,10 @@ netcoreapp3.1 + + + + diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs index 77b197b..0d6bd96 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs @@ -24,13 +24,13 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase AddFieldMap(c => c.CurrentCreditorProfileId, 90); AddFieldMap(c => c.OriginalCreditorProfileId, 91); - 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); + 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/COA.EnterpriseServices.DataAccess.csproj b/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj index 9d6b8d4..77436bb 100644 --- a/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj +++ b/COA.EnterpriseServices.DataAccess/COA.EnterpriseServices.DataAccess.csproj @@ -6,6 +6,7 @@ + diff --git a/COA.EnterpriseServices.DataAccess/Dependencies.cs b/COA.EnterpriseServices.DataAccess/Dependencies.cs index 2355894..cf61d3f 100644 --- a/COA.EnterpriseServices.DataAccess/Dependencies.cs +++ b/COA.EnterpriseServices.DataAccess/Dependencies.cs @@ -1,4 +1,5 @@ -using COA.EnterpriseServices.DataAccess.Helpers; +using AutoMapper; +using COA.EnterpriseServices.DataAccess.Helpers; using StructureMap; namespace COA.EnterpriseServices.DataAccess @@ -23,6 +24,8 @@ namespace COA.EnterpriseServices.DataAccess c.For(typeof(IDataAccess<>)).Singleton(); c.For(typeof(DataAccessManager<>)).Singleton(); + c.For().Singleton().Use(() => Mapping.GetMapper()); + c.For().Singleton(); c.For().Singleton(); }); diff --git a/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs index 161780b..ff350ba 100644 --- a/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs +++ b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs @@ -12,5 +12,6 @@ namespace COA.EnterpriseServices.DataAccess.Entities public string ClientLastName { get; set; } public int CurrentCreditorProfileId { get; set; } public int OriginalCreditorProfileId { get; set; } + public string AccountNumber { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs index 2d325fe..9050ca2 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs @@ -1,20 +1,22 @@ -using COA.EnterpriseServices.DataAccess.Entities; +using AutoMapper; using System.Collections.Generic; namespace COA.EnterpriseServices.DataAccess.Helpers { public class ClientHelper { - private readonly DataAccessManager clientDataAccess; + private readonly DataAccessManager clientDataAccess; - public ClientHelper(DataAccessManager clientDataAccess) + public ClientHelper(DataAccessManager clientDataAccess, IMapper mapper) { this.clientDataAccess = clientDataAccess; } - public ICollection FindByEmail(string email) + public ICollection FindByEmail(string email) { - return clientDataAccess.Get(c => c.Email.Equals(email)); + var client = clientDataAccess.Get(c => c.Email.Equals(email)); + + return client; } } } diff --git a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs index 79d59f2..f81d49d 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs @@ -1,5 +1,5 @@ -using COA.EnterpriseServices.DataAccess.Entities; -using System.Collections.Generic; +using AutoMapper; +using COA.EnterpriseServices.DataAccess.Entities; namespace COA.EnterpriseServices.DataAccess.Helpers { @@ -7,16 +7,21 @@ namespace COA.EnterpriseServices.DataAccess.Helpers { private readonly DataAccessManager creditorDataAccess; private readonly DataAccessManager settlementAttemptDataAccess; + private readonly IMapper mapper; - public CreditorHelper(DataAccessManager creditorDataAccess, DataAccessManager settlementAttemptDataAccess) + public CreditorHelper(DataAccessManager creditorDataAccess, DataAccessManager settlementAttemptDataAccess, IMapper mapper) { this.creditorDataAccess = creditorDataAccess; this.settlementAttemptDataAccess = settlementAttemptDataAccess; + this.mapper = mapper; } - public Creditor GetCreditor(int id) + public Creditors.Creditor GetCreditor(int id) { - return creditorDataAccess.Get(id); + var creditor = creditorDataAccess.Get(id); + + // map EF => domain type + return mapper.Map(creditor); } public SettlementAttempt GetSettlementAttempt(int id) @@ -24,32 +29,18 @@ namespace COA.EnterpriseServices.DataAccess.Helpers return settlementAttemptDataAccess.Get(id); } - public ICollection FindByName(string name) + public bool AddCreditor(Creditors.Creditor creditor) { - // TODO: use AutoMapper to return mapped domain objects! + var creditorEntity = mapper.Map(creditor); - return creditorDataAccess.Get(c => c.ClientFirstName.Contains(name) || c.ClientLastName.Contains(name)); - } - - public ICollection FindByStatus(string status) - { - // TODO: use AutoMapper to return mapped domain objects! - - return creditorDataAccess.Get(c => c.Status == status); - } - - public bool AddCreditor(Creditor creditor) - { - // TODO: use AutoMapper to pass in mapped domain object! - - return creditorDataAccess.Add(creditor); + return creditorDataAccess.Add(creditorEntity); } public bool UpdateCreditor(Creditor creditor) { - // TODO: use AutoMapper to pass in mapped domain object! + var creditorEntity = mapper.Map(creditor); - return creditorDataAccess.Update(creditor); + return creditorDataAccess.Update(creditorEntity); } public bool SetCreditorStatus(int creditorId, string status) diff --git a/COA.EnterpriseServices.DataAccess/Mapping.cs b/COA.EnterpriseServices.DataAccess/Mapping.cs new file mode 100644 index 0000000..e6a35ae --- /dev/null +++ b/COA.EnterpriseServices.DataAccess/Mapping.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using AutoMapper.Configuration; + +namespace COA.EnterpriseServices.DataAccess +{ + public static class Mapping + { + public static IMapper GetMapper() + { + var cfg = new MapperConfigurationExpression(); + cfg.AddProfile(); + + //Mapper.Initialize(cfg); + // or + var mapperConfig = new MapperConfiguration(cfg); + + return new Mapper(mapperConfig); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess/MappingProfile.cs b/COA.EnterpriseServices.DataAccess/MappingProfile.cs index 3a9a81c..e4be049 100644 --- a/COA.EnterpriseServices.DataAccess/MappingProfile.cs +++ b/COA.EnterpriseServices.DataAccess/MappingProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using COA.EnterpriseServices.Creditors; namespace COA.EnterpriseServices.DataAccess { @@ -6,7 +7,23 @@ namespace COA.EnterpriseServices.DataAccess { public MappingProfile() { - // add mappings between domain and entity objects here + #region EF => Domain + + CreateMap() + .ForMember(d => d.creditorStatus, o => o.MapFrom(s => s.Status)); + + CreateMap(); + + #endregion + + #region Domain => EF + + CreateMap() + .ForMember(d => d.Status, o => o.MapFrom(s => s.creditorStatus)); + + CreateMap(); + + #endregion } } } diff --git a/COA.EnterpriseServices.Sandbox/Program.cs b/COA.EnterpriseServices.Sandbox/Program.cs index d7715c0..d48cc8c 100644 --- a/COA.EnterpriseServices.Sandbox/Program.cs +++ b/COA.EnterpriseServices.Sandbox/Program.cs @@ -1,7 +1,6 @@ using COA.EnterpriseServices.Creditors; using COA.EnterpriseServices.DataAccess; using System; -using System.Runtime.CompilerServices; namespace COA.EnterpriseServices.Sandbox { @@ -11,10 +10,13 @@ namespace COA.EnterpriseServices.Sandbox { var creditorController = Dependencies.Container.GetInstance(); - //Console.WriteLine(creditorController.GetCreditorStatus(1)); + Console.WriteLine(creditorController.GetCreditorStatus(1)); //Console.WriteLine(creditorController.SetCreditorStatus(1, "Active")); - creditorController.AddOfferResponse(); + //creditorController.AddOfferResponse(new OfferResponse + //{ + // CreditorId = 1 + //}); Console.ReadLine(); }