From 2babf6e4fee7753bc13d0186693d46c336c60693 Mon Sep 17 00:00:00 2001 From: CESARDELATORRE Date: Wed, 18 Jan 2017 16:51:44 -0800 Subject: [PATCH] Added field "Alias" to PaymentMethod and created EF migration for that Refactoring related to OrderCommand (instead NewOrderCommand) Refactoring in Buyer.IdentityGuid instead of fullname variables.. --- ...wOrderCommand.cs => CreateOrderCommand.cs} | 8 +- ...andler.cs => CreateOrderCommandHandler.cs} | 56 +++-- .../Controllers/OrdersController.cs | 10 +- .../AutofacModules/MediatorModule.cs | 2 +- ...8230807_PaymentMethodWithAlias.Designer.cs | 233 ++++++++++++++++++ .../20170118230807_PaymentMethodWithAlias.cs | 28 +++ .../OrderingContextModelSnapshot.cs | 152 ++++++------ .../AggregatesModel/BuyerAggregate/Buyer.cs | 8 +- .../AggregatesModel/BuyerAggregate/Payment.cs | 4 +- .../RepositoryContracts/IBuyerRepository.cs | 2 +- .../OrderingContext.cs | 4 + .../Repositories/BuyerRepository.cs | 4 +- .../Application/NewOrderCommandHandlerTest.cs | 14 +- 13 files changed, 404 insertions(+), 121 deletions(-) rename src/Services/Ordering/Ordering.API/Application/Commands/{NewOrderCommand.cs => CreateOrderCommand.cs} (89%) rename src/Services/Ordering/Ordering.API/Application/Commands/{NewOrderCommandHandler.cs => CreateOrderCommandHandler.cs} (65%) create mode 100644 src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.Designer.cs create mode 100644 src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.cs diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommand.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs similarity index 89% rename from src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommand.cs rename to src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs index 821b6d9f7..f699b369c 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommand.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs @@ -10,10 +10,10 @@ //Need to create a different DTO class, like OrderLineDTO or similar... using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; - public class NewOrderCommand + public class CreateOrderCommand :IAsyncRequest { - //(CDLTLL) TO DO: This is wrong, we must NOT use a child-entity class within a Command class!! + //(CDLTLL) TO DO: This is wrong, we must NOT use a child-entity class (OrderItem) within a Command class!! //Need to create a different DTO class, like OrderLineDTO or similar... private readonly List _orderItems; public string City { get; set; } @@ -36,7 +36,7 @@ public int CardTypeId { get; set; } - public string Buyer { get; set; } + public string BuyerIdentityGuid { get; set; } public IEnumerable OrderItems => _orderItems; @@ -45,7 +45,7 @@ _orderItems.Add(item); } - public NewOrderCommand() + public CreateOrderCommand() { _orderItems = new List(); } diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs similarity index 65% rename from src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommandHandler.cs rename to src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs index 0ea029c93..0019dfb32 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/NewOrderCommandHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs @@ -9,13 +9,13 @@ using System.Threading.Tasks; using Domain; - public class NewOrderCommandHandler - : IAsyncRequestHandler + public class CreateOrderCommandHandler + : IAsyncRequestHandler { private readonly IBuyerRepository _buyerRepository; private readonly IOrderRepository _orderRepository; - public NewOrderCommandHandler(IBuyerRepository buyerRepository,IOrderRepository orderRepository) + public CreateOrderCommandHandler(IBuyerRepository buyerRepository,IOrderRepository orderRepository) { if (buyerRepository == null) { @@ -30,11 +30,11 @@ _buyerRepository = buyerRepository; _orderRepository = orderRepository; } - public async Task Handle(NewOrderCommand message) + public async Task Handle(CreateOrderCommand message) { //find buyer/payment or add a new one buyer/payment - var buyer = await _buyerRepository.FindAsync(message.Buyer); + var buyer = await _buyerRepository.FindAsync(message.BuyerIdentityGuid); if (buyer == null) { @@ -70,9 +70,32 @@ return result > 0; } + Buyer CreateBuyer(CreateOrderCommand message) + { + return _buyerRepository.Add( + new Buyer(message.BuyerIdentityGuid)); + } + + Order CreateOrder(int buyerId, int paymentId, int addressId) + { + return new Order(buyerId, paymentId); + } + + //TO DO: + //(CDLTLL) This is wrong. We shouldn't be able to create a PaymentMethod from a CommandHandler or anywhere in the Application Layer + //because a PaymentMethod is a child-entity, part of the Buyer Aggregate. + //So, any creation/update of a PaymentMethod should be done through its Aggregate-Root: the Buyer root entity. + //Need to move this logic to the Buyer Aggregate-Root and rename to "AddPaymentMethod()" + Payment CreatePayment(CreateOrderCommand message) + { + return new Payment("My Default Payment Method", message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration, message.CardTypeId); + } - Payment GetExistingPaymentOrAddANewOne(Buyer buyer, NewOrderCommand message) + //TO DO: + //(CDLTLL) This is wrong. As explained, this logic should be part of the + //Buyer Aggregate Root, as a PaymentMethod is a child-entity of that Aggregate. + Payment GetExistingPaymentOrAddANewOne(Buyer buyer, CreateOrderCommand message) { Payment payment = PaymentAlreadyExist(buyer, message); @@ -86,7 +109,10 @@ } - Payment PaymentAlreadyExist(Buyer buyer, NewOrderCommand message) + //TO DO: + //(CDLTLL) This is wrong. As explained, this logic should be part of the + //Buyer Aggregate Root, as a PaymentMethod is a child-entity of that Aggregate. + Payment PaymentAlreadyExist(Buyer buyer, CreateOrderCommand message) { return buyer.Payments .SingleOrDefault(p => @@ -100,21 +126,5 @@ p.SecurityNumber == message.CardSecurityNumber; }); } - - Buyer CreateBuyer(NewOrderCommand message) - { - return _buyerRepository.Add( - new Buyer(message.Buyer)); - } - - Order CreateOrder(int buyerId, int paymentId, int addressId) - { - return new Order(buyerId, paymentId); - } - - Payment CreatePayment(NewOrderCommand message) - { - return new Payment(message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration, message.CardTypeId); - } } } diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index 43c170427..bc50824dd 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -43,14 +43,14 @@ [Route("new")] [HttpPost] - public async Task AddOrder([FromBody]NewOrderCommand order) + public async Task AddOrder([FromBody]CreateOrderCommand createOrderCommand) { - if (order.CardTypeId == 0) - order.CardTypeId = 1; + if (createOrderCommand.CardTypeId == 0) + createOrderCommand.CardTypeId = 1; - order.Buyer = _identityService.GetUserIdentity(); + createOrderCommand.BuyerIdentityGuid = _identityService.GetUserIdentity(); - var added = await _mediator.SendAsync(order); + var added = await _mediator.SendAsync(createOrderCommand); if (added) { return Ok(); diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs b/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs index 2af7a286a..0c911139e 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs @@ -16,7 +16,7 @@ builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly) .AsImplementedInterfaces(); - builder.RegisterAssemblyTypes(typeof(NewOrderCommand).GetTypeInfo().Assembly) + builder.RegisterAssemblyTypes(typeof(CreateOrderCommand).GetTypeInfo().Assembly) .As(o => o.GetInterfaces() .Where(i => i.IsClosedTypeOf(typeof(IAsyncRequestHandler<,>))) .Select(i => new KeyedService("IAsyncRequestHandler", i))); diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.Designer.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.Designer.cs new file mode 100644 index 000000000..4fe16d38a --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.Designer.cs @@ -0,0 +1,233 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure; + +namespace Ordering.API.Infrastructure.Migrations +{ + [DbContext(typeof(OrderingContext))] + [Migration("20170118230807_PaymentMethodWithAlias")] + partial class PaymentMethodWithAlias + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.1") + .HasAnnotation("SqlServer:Sequence:ordering.buyerseq", "'buyerseq', 'ordering', '1', '10', '', '', 'Int64', 'False'") + .HasAnnotation("SqlServer:Sequence:ordering.orderseq", "'orderseq', 'ordering', '1', '10', '', '', 'Int64', 'False'") + .HasAnnotation("SqlServer:Sequence:ordering.paymentseq", "'paymentseq', 'ordering', '1', '10', '', '', 'Int64', 'False'") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:HiLoSequenceName", "buyerseq") + .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); + + b.Property("FullName") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.HasKey("Id"); + + b.HasIndex("FullName") + .IsUnique(); + + b.ToTable("buyers","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.CardType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasDefaultValue(1); + + b.Property("Name") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.HasKey("Id"); + + b.ToTable("cardtypes","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:HiLoSequenceName", "paymentseq") + .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); + + b.Property("Alias") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.Property("BuyerId"); + + b.Property("CardHolderName") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.Property("CardNumber") + .IsRequired() + .HasAnnotation("MaxLength", 25); + + b.Property("CardTypeId"); + + b.Property("Expiration"); + + b.Property("SecurityNumber"); + + b.HasKey("Id"); + + b.HasIndex("BuyerId"); + + b.HasIndex("CardTypeId"); + + b.ToTable("payments","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("City"); + + b.Property("Country"); + + b.Property("State"); + + b.Property("Street"); + + b.Property("ZipCode"); + + b.HasKey("Id"); + + b.ToTable("address","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:HiLoSequenceName", "orderseq") + .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); + + b.Property("BuyerId"); + + b.Property("OrderDate"); + + b.Property("PaymentId"); + + b.Property("ShippingAddressId"); + + b.Property("StatusId"); + + b.HasKey("Id"); + + b.HasIndex("BuyerId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("ShippingAddressId"); + + b.HasIndex("StatusId"); + + b.ToTable("orders","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Discount"); + + b.Property("OrderId"); + + b.Property("PictureUrl"); + + b.Property("ProductId"); + + b.Property("ProductName") + .IsRequired(); + + b.Property("UnitPrice"); + + b.Property("Units") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:DefaultValue", 1); + + b.HasKey("Id"); + + b.HasIndex("OrderId"); + + b.ToTable("orderItems","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasDefaultValue(1); + + b.Property("Name") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.HasKey("Id"); + + b.ToTable("orderstatus","ordering"); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", b => + { + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer") + .WithMany("Payments") + .HasForeignKey("BuyerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.CardType", "CardType") + .WithMany() + .HasForeignKey("CardTypeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order", b => + { + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer", "Buyer") + .WithMany() + .HasForeignKey("BuyerId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", "Payment") + .WithMany() + .HasForeignKey("PaymentId"); + + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Address", "ShippingAddress") + .WithMany() + .HasForeignKey("ShippingAddressId"); + + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderItem", b => + { + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.cs new file mode 100644 index 000000000..a3152432b --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/20170118230807_PaymentMethodWithAlias.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Ordering.API.Infrastructure.Migrations +{ + public partial class PaymentMethodWithAlias : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Alias", + schema: "ordering", + table: "payments", + maxLength: 200, + nullable: false, + defaultValue: ""); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Alias", + schema: "ordering", + table: "payments"); + } + } +} diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/OrderingContextModelSnapshot.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/OrderingContextModelSnapshot.cs index 75837ccef..1f385a316 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/OrderingContextModelSnapshot.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Migrations/OrderingContextModelSnapshot.cs @@ -19,62 +19,99 @@ namespace Ordering.API.Infrastructure.Migrations .HasAnnotation("SqlServer:Sequence:ordering.paymentseq", "'paymentseq', 'ordering', '1', '10', '', '', 'Int64', 'False'") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Address", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer", b => { b.Property("Id") - .ValueGeneratedOnAdd(); + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:HiLoSequenceName", "buyerseq") + .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); - b.Property("City"); + b.Property("FullName") + .IsRequired() + .HasAnnotation("MaxLength", 200); - b.Property("Country"); + b.HasKey("Id"); - b.Property("State"); + b.HasIndex("FullName") + .IsUnique(); - b.Property("Street"); + b.ToTable("buyers","ordering"); + }); - b.Property("ZipCode"); + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.CardType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasDefaultValue(1); + + b.Property("Name") + .IsRequired() + .HasAnnotation("MaxLength", 200); b.HasKey("Id"); - b.ToTable("address","ordering"); + b.ToTable("cardtypes","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Buyer", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", b => { b.Property("Id") .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:HiLoSequenceName", "buyerseq") + .HasAnnotation("SqlServer:HiLoSequenceName", "paymentseq") .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); - b.Property("FullName") + b.Property("Alias") + .IsRequired() + .HasAnnotation("MaxLength", 200); + + b.Property("BuyerId"); + + b.Property("CardHolderName") .IsRequired() .HasAnnotation("MaxLength", 200); + b.Property("CardNumber") + .IsRequired() + .HasAnnotation("MaxLength", 25); + + b.Property("CardTypeId"); + + b.Property("Expiration"); + + b.Property("SecurityNumber"); + b.HasKey("Id"); - b.HasIndex("FullName") - .IsUnique(); + b.HasIndex("BuyerId"); - b.ToTable("buyers","ordering"); + b.HasIndex("CardTypeId"); + + b.ToTable("payments","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.CardType", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Address", b => { b.Property("Id") - .ValueGeneratedOnAdd() - .HasDefaultValue(1); + .ValueGeneratedOnAdd(); - b.Property("Name") - .IsRequired() - .HasAnnotation("MaxLength", 200); + b.Property("City"); + + b.Property("Country"); + + b.Property("State"); + + b.Property("Street"); + + b.Property("ZipCode"); b.HasKey("Id"); - b.ToTable("cardtypes","ordering"); + b.ToTable("address","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Order", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -105,7 +142,7 @@ namespace Ordering.API.Infrastructure.Migrations b.ToTable("orders","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.OrderItem", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderItem", b => { b.Property("Id") .ValueGeneratedOnAdd(); @@ -114,6 +151,8 @@ namespace Ordering.API.Infrastructure.Migrations b.Property("OrderId"); + b.Property("PictureUrl"); + b.Property("ProductId"); b.Property("ProductName") @@ -132,7 +171,7 @@ namespace Ordering.API.Infrastructure.Migrations b.ToTable("orderItems","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.OrderStatus", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderStatus", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -147,80 +186,47 @@ namespace Ordering.API.Infrastructure.Migrations b.ToTable("orderstatus","ordering"); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Payment", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", b => { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:HiLoSequenceName", "paymentseq") - .HasAnnotation("SqlServer:HiLoSequenceSchema", "ordering") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.SequenceHiLo); - - b.Property("BuyerId"); - - b.Property("CardHolderName") - .IsRequired() - .HasAnnotation("MaxLength", 200); - - b.Property("CardNumber") - .IsRequired() - .HasAnnotation("MaxLength", 25); - - b.Property("CardTypeId"); - - b.Property("Expiration"); - - b.Property("SecurityNumber"); - - b.HasKey("Id"); - - b.HasIndex("BuyerId"); - - b.HasIndex("CardTypeId"); + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer") + .WithMany("Payments") + .HasForeignKey("BuyerId") + .OnDelete(DeleteBehavior.Cascade); - b.ToTable("payments","ordering"); + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.CardType", "CardType") + .WithMany() + .HasForeignKey("CardTypeId") + .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Order", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order", b => { - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.Buyer", "Buyer") + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Buyer", "Buyer") .WithMany() .HasForeignKey("BuyerId") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.Payment", "Payment") + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate.Payment", "Payment") .WithMany() .HasForeignKey("PaymentId"); - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.Address", "ShippingAddress") + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Address", "ShippingAddress") .WithMany() .HasForeignKey("ShippingAddressId"); - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.OrderStatus", "Status") + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderStatus", "Status") .WithMany() .HasForeignKey("StatusId") .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.OrderItem", b => + modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.OrderItem", b => { - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.Order") + b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate.Order") .WithMany("OrderItems") .HasForeignKey("OrderId") .OnDelete(DeleteBehavior.Cascade); }); - - modelBuilder.Entity("Microsoft.eShopOnContainers.Services.Ordering.Domain.Payment", b => - { - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.Buyer") - .WithMany("Payments") - .HasForeignKey("BuyerId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Microsoft.eShopOnContainers.Services.Ordering.Domain.CardType", "CardType") - .WithMany() - .HasForeignKey("CardTypeId") - .OnDelete(DeleteBehavior.Cascade); - }); } } } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs index 543fb2755..c10f38ff3 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs @@ -13,14 +13,14 @@ protected Buyer() { } - public Buyer(string fullName) + public Buyer(string IdentityGuid) { - if (String.IsNullOrWhiteSpace(fullName)) + if (String.IsNullOrWhiteSpace(IdentityGuid)) { - throw new ArgumentNullException(nameof(fullName)); + throw new ArgumentNullException(nameof(IdentityGuid)); } - this.FullName = fullName; + this.FullName = IdentityGuid; this.Payments = new HashSet(); } } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Payment.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Payment.cs index 83a71bb9a..3644bba35 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Payment.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Payment.cs @@ -7,6 +7,7 @@ public class Payment : Entity { + public string Alias { get; private set; } public int BuyerId { get; private set; } public string CardNumber { get; private set; } @@ -23,7 +24,7 @@ protected Payment() { } - public Payment(string cardNumber, string securityNumber, string cardHolderName, DateTime expiration, int cardTypeId) + public Payment(string alias, string cardNumber, string securityNumber, string cardHolderName, DateTime expiration, int cardTypeId) { if (String.IsNullOrWhiteSpace(cardNumber)) { @@ -45,6 +46,7 @@ throw new ArgumentException(nameof(expiration)); } + this.Alias = alias; this.CardNumber = cardNumber; this.SecurityNumber = securityNumber; this.CardHolderName = cardHolderName; diff --git a/src/Services/Ordering/Ordering.Domain/RepositoryContracts/IBuyerRepository.cs b/src/Services/Ordering/Ordering.Domain/RepositoryContracts/IBuyerRepository.cs index 027f26f0c..025c7337d 100644 --- a/src/Services/Ordering/Ordering.Domain/RepositoryContracts/IBuyerRepository.cs +++ b/src/Services/Ordering/Ordering.Domain/RepositoryContracts/IBuyerRepository.cs @@ -9,6 +9,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.RepositoryContrac { Buyer Add(Buyer buyer); - Task FindAsync(string name); + Task FindAsync(string BuyerIdentityGuid); } } diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index 2a3c39dbb..b34a6ee05 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -78,6 +78,10 @@ .HasMaxLength(200) .IsRequired(); + paymentConfiguration.Property(p => p.Alias) + .HasMaxLength(200) + .IsRequired(); + paymentConfiguration.Property(p => p.CardNumber) .HasMaxLength(25) .IsRequired(); diff --git a/src/Services/Ordering/Ordering.Infrastructure/Repositories/BuyerRepository.cs b/src/Services/Ordering/Ordering.Infrastructure/Repositories/BuyerRepository.cs index 9428bc96b..ba60f6204 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/Repositories/BuyerRepository.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/Repositories/BuyerRepository.cs @@ -39,11 +39,11 @@ .Entity; } - public async Task FindAsync(string name) + public async Task FindAsync(string BuyerIdentityGuid) { var buyer = await _context.Buyers .Include(b => b.Payments) - .Where(b => b.FullName == name) + .Where(b => b.FullName == BuyerIdentityGuid) .SingleOrDefaultAsync(); return buyer; diff --git a/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs b/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs index 1e50e639d..47a57d578 100644 --- a/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs +++ b/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs @@ -26,7 +26,7 @@ public async Task Handle_returns_true_when_order_is_persisted_succesfully() { // Arrange - _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().Buyer)) + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().BuyerIdentityGuid)) .Returns(Task.FromResult(FakeBuyer())); _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken))) @@ -39,7 +39,7 @@ .Returns(Task.FromResult(1)); //Act - var handler = new NewOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); + var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); var result = await handler.Handle(FakeOrderRequestWithBuyer()); //Assert @@ -49,7 +49,7 @@ [Fact] public async Task Handle_return_false_if_order_is_not_persisted() { - _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().Buyer)) + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().BuyerIdentityGuid)) .Returns(Task.FromResult(FakeBuyer())); _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken))) @@ -60,7 +60,7 @@ .Returns(Task.FromResult(0)); //Act - var handler = new NewOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); + var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); var result = await handler.Handle(FakeOrderRequestWithBuyer()); //Assert @@ -80,11 +80,11 @@ }; } - private NewOrderCommand FakeOrderRequestWithBuyer() + private CreateOrderCommand FakeOrderRequestWithBuyer() { - return new NewOrderCommand + return new CreateOrderCommand { - Buyer = "1234", + BuyerIdentityGuid = "1234", CardNumber = "1234", CardExpiration = DateTime.Now.AddYears(1), CardSecurityNumber = "123",