From eba9c46450676b0f6dc4d6e18058b439f30bf26a Mon Sep 17 00:00:00 2001 From: Soumilgit Date: Sun, 7 Jun 2026 02:00:11 +0530 Subject: [PATCH] Fix: Credit Card Numbers are still an issue #979 --- src/ClientApp/Models/Orders/Order.cs | 11 +- src/ClientApp/Models/Orders/OrderCheckout.cs | 12 +- src/ClientApp/Models/User/PaymentInfo.cs | 15 --- src/ClientApp/Models/User/UserInfo.cs | 7 -- .../Services/Identity/IdentityMockService.cs | 3 - .../Services/Identity/IdentityService.cs | 4 - .../Services/Order/OrderMockService.cs | 49 +------- src/ClientApp/Services/Order/OrderService.cs | 6 +- src/ClientApp/ViewModels/CheckoutViewModel.cs | 15 +-- ...07000000_RemoveSensitiveCardProfileData.cs | 70 +++++++++++ .../ApplicationDbContextModelSnapshot.cs | 19 --- src/Identity.API/Models/ApplicationUser.cs | 10 -- src/Identity.API/Services/ProfileService.cs | 12 -- src/Identity.API/UsersSeed.cs | 14 +-- src/Ordering.API/Apis/OrdersApi.cs | 26 ++-- .../Commands/CreateOrderCommand.cs | 23 +--- .../Commands/CreateOrderCommandHandler.cs | 2 +- ...egateWhenOrderStartedDomainEventHandler.cs | 9 +- .../CreateOrderCommandValidator.cs | 11 +- .../AggregatesModel/BuyerAggregate/Buyer.cs | 8 +- .../BuyerAggregate/PaymentMethod.cs | 29 +---- .../AggregatesModel/OrderAggregate/Order.cs | 15 +-- .../Events/OrderStartedDomainEvent.cs | 6 +- .../PaymentMethodEntityTypeConfiguration.cs | 24 +--- ...000000_RemoveSensitivePaymentMethodData.cs | 111 ++++++++++++++++++ .../OrderingContextModelSnapshot.cs | 28 +---- .../Components/Pages/Checkout/Checkout.razor | 1 - src/WebApp/Services/BasketCheckoutInfo.cs | 11 +- src/WebApp/Services/BasketState.cs | 12 +- .../OrderingApiTests.cs | 3 +- .../IdentifiedCommandHandlerTest.cs | 6 +- .../Application/NewOrderCommandHandlerTest.cs | 11 +- tests/Ordering.UnitTests/Builders.cs | 6 +- .../Domain/BuyerAggregateTest.cs | 45 ++----- .../Domain/OrderAggregateTest.cs | 28 ++--- 35 files changed, 260 insertions(+), 402 deletions(-) delete mode 100644 src/ClientApp/Models/User/PaymentInfo.cs create mode 100644 src/Identity.API/Data/Migrations/20260607000000_RemoveSensitiveCardProfileData.cs create mode 100644 src/Ordering.Infrastructure/Migrations/20260607000000_RemoveSensitivePaymentMethodData.cs diff --git a/src/ClientApp/Models/Orders/Order.cs b/src/ClientApp/Models/Orders/Order.cs index ab8a6fd4f..7e49b9741 100644 --- a/src/ClientApp/Models/Orders/Order.cs +++ b/src/ClientApp/Models/Orders/Order.cs @@ -32,15 +32,8 @@ public Order() [JsonPropertyName("zipCode")] public string ShippingZipCode { get; set; } - public int CardTypeId { get; set; } - - public string CardNumber { get; set; } - - public string CardHolderName { get; set; } - - public DateTime CardExpiration { get; set; } - - public string CardSecurityNumber { get; set; } + [JsonPropertyName("paymentMethodId")] + public string PaymentMethodId { get; set; } [JsonPropertyName("items")] public List OrderItems { get; set; } diff --git a/src/ClientApp/Models/Orders/OrderCheckout.cs b/src/ClientApp/Models/Orders/OrderCheckout.cs index 344064e8d..44408dd55 100644 --- a/src/ClientApp/Models/Orders/OrderCheckout.cs +++ b/src/ClientApp/Models/Orders/OrderCheckout.cs @@ -16,17 +16,7 @@ public class OrderCheckout public string ZipCode { get; set; } [Required] - public string CardNumber { get; set; } - [Required] - public string CardHolderName { get; set; } - - [Required] - public DateTime CardExpiration { get; set; } - - [Required] - public string CardSecurityNumber { get; set; } - - public int CardTypeId { get; set; } + public string PaymentMethodId { get; set; } public string Buyer { get; set; } diff --git a/src/ClientApp/Models/User/PaymentInfo.cs b/src/ClientApp/Models/User/PaymentInfo.cs deleted file mode 100644 index f46841ac7..000000000 --- a/src/ClientApp/Models/User/PaymentInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using eShop.ClientApp.Models.Orders; - -namespace eShop.ClientApp.Models.User; - -public class PaymentInfo -{ - public Guid Id { get; set; } - public string CardNumber { get; set; } - public string SecurityNumber { get; set; } - public int ExpirationMonth { get; set; } - public int ExpirationYear { get; set; } - public string CardHolderName { get; set; } - public CardType CardType { get; set; } - public string Expiration { get; set; } -} diff --git a/src/ClientApp/Models/User/UserInfo.cs b/src/ClientApp/Models/User/UserInfo.cs index b98be38db..6b7ed802d 100644 --- a/src/ClientApp/Models/User/UserInfo.cs +++ b/src/ClientApp/Models/User/UserInfo.cs @@ -13,13 +13,6 @@ public class UserInfo [JsonPropertyName("last_name")] public string LastName { get; set; } - [JsonPropertyName("card_number")] public string CardNumber { get; set; } - - [JsonPropertyName("card_holder")] public string CardHolder { get; set; } - - [JsonPropertyName("card_security_number")] - public string CardSecurityNumber { get; set; } - [JsonPropertyName("address_city")] public string Address { get; set; } [JsonPropertyName("address_country")] public string Country { get; set; } diff --git a/src/ClientApp/Services/Identity/IdentityMockService.cs b/src/ClientApp/Services/Identity/IdentityMockService.cs index 4e06f6f79..981c650cd 100644 --- a/src/ClientApp/Services/Identity/IdentityMockService.cs +++ b/src/ClientApp/Services/Identity/IdentityMockService.cs @@ -31,9 +31,6 @@ public Task GetUserInfoAsync() PreferredUsername = "sampleUser", Name = "Sample", LastName = "User", - CardNumber = "XXXXXXXXXXXX3456", - CardHolder = "Sample User", - CardSecurityNumber = "123", Address = "123 Sample Street", Country = "USA", State = "Washington", diff --git a/src/ClientApp/Services/Identity/IdentityService.cs b/src/ClientApp/Services/Identity/IdentityService.cs index 086759e26..dd3277b72 100644 --- a/src/ClientApp/Services/Identity/IdentityService.cs +++ b/src/ClientApp/Services/Identity/IdentityService.cs @@ -82,10 +82,6 @@ public async Task GetUserInfoAsync() userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value, Name = userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "name")?.Value, LastName = userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "last_name")?.Value, - CardNumber = userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "card_number")?.Value, - CardHolder = userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "card_holder")?.Value, - CardSecurityNumber = - userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "card_security_number")?.Value, PhoneNumberVerified = bool.Parse(userInfoWithClaims.Claims.FirstOrDefault(c => c.Type == "phone_number_verified") ?.Value ?? "false"), diff --git a/src/ClientApp/Services/Order/OrderMockService.cs b/src/ClientApp/Services/Order/OrderMockService.cs index f18219415..bdc47257d 100644 --- a/src/ClientApp/Services/Order/OrderMockService.cs +++ b/src/ClientApp/Services/Order/OrderMockService.cs @@ -1,12 +1,11 @@ using eShop.ClientApp.Models.Basket; using eShop.ClientApp.Models.Orders; -using eShop.ClientApp.Models.User; namespace eShop.ClientApp.Services.Order; public class OrderMockService : IOrderService { - private static readonly DateTime MockExpirationDate = DateTime.Now.AddYears(5); + private const string MockPaymentMethodId = "pm_mock_mobile"; private static readonly Address MockAdress = new() { @@ -22,22 +21,6 @@ public class OrderMockService : IOrderService ZipCode = "98101" }; - private static readonly PaymentInfo MockPaymentInfo = new() - { - Id = Guid.NewGuid(), - CardHolderName = "American Express", - CardNumber = "XXXXXXXXXXXX0005", - CardType = new CardType - { - Id = 3, - Name = "MasterCard" - }, - Expiration = MockExpirationDate.ToString(), - ExpirationMonth = MockExpirationDate.Month, - ExpirationYear = MockExpirationDate.Year, - SecurityNumber = "123" - }; - private static readonly List MockOrderItems = new() { new OrderItem @@ -64,11 +47,7 @@ public class OrderMockService : IOrderService private static readonly OrderCheckout MockOrderCheckout = new() { - CardExpiration = DateTime.UtcNow, - CardHolderName = "FakeCardHolderName", - CardNumber = "XXXXXXXXXXXX3224", - CardSecurityNumber = "1234", - CardTypeId = 1, + PaymentMethodId = MockPaymentMethodId, City = "FakeCity", Country = "FakeCountry", ZipCode = "FakeZipCode", @@ -84,11 +63,7 @@ public class OrderMockService : IOrderService OrderDate = DateTime.Now, OrderStatus = "Submitted", OrderItems = MockOrderItems, - CardTypeId = MockPaymentInfo.CardType.Id, - CardHolderName = MockPaymentInfo.CardHolderName, - CardNumber = MockPaymentInfo.CardNumber, - CardSecurityNumber = MockPaymentInfo.SecurityNumber, - CardExpiration = new DateTime(MockPaymentInfo.ExpirationYear, MockPaymentInfo.ExpirationMonth, 1), + PaymentMethodId = MockPaymentMethodId, ShippingCity = MockAdress.City, ShippingState = MockAdress.State, ShippingCountry = MockAdress.Country, @@ -102,11 +77,7 @@ public class OrderMockService : IOrderService OrderDate = DateTime.Now, OrderStatus = "Paid", OrderItems = MockOrderItems, - CardTypeId = MockPaymentInfo.CardType.Id, - CardHolderName = MockPaymentInfo.CardHolderName, - CardNumber = MockPaymentInfo.CardNumber, - CardSecurityNumber = MockPaymentInfo.SecurityNumber, - CardExpiration = new DateTime(MockPaymentInfo.ExpirationYear, MockPaymentInfo.ExpirationMonth, 1), + PaymentMethodId = MockPaymentMethodId, ShippingCity = MockAdress.City, ShippingState = MockAdress.State, ShippingCountry = MockAdress.Country, @@ -120,11 +91,7 @@ public class OrderMockService : IOrderService OrderDate = DateTime.Now, OrderStatus = "Cancelled", OrderItems = MockOrderItems, - CardTypeId = MockPaymentInfo.CardType.Id, - CardHolderName = MockPaymentInfo.CardHolderName, - CardNumber = MockPaymentInfo.CardNumber, - CardSecurityNumber = MockPaymentInfo.SecurityNumber, - CardExpiration = new DateTime(MockPaymentInfo.ExpirationYear, MockPaymentInfo.ExpirationMonth, 1), + PaymentMethodId = MockPaymentMethodId, ShippingCity = MockAdress.City, ShippingState = MockAdress.State, ShippingCountry = MockAdress.Country, @@ -138,11 +105,7 @@ public class OrderMockService : IOrderService OrderDate = DateTime.Now, OrderStatus = "Shipped", OrderItems = MockOrderItems, - CardTypeId = MockPaymentInfo.CardType.Id, - CardHolderName = MockPaymentInfo.CardHolderName, - CardNumber = MockPaymentInfo.CardNumber, - CardSecurityNumber = MockPaymentInfo.SecurityNumber, - CardExpiration = new DateTime(MockPaymentInfo.ExpirationYear, MockPaymentInfo.ExpirationMonth, 1), + PaymentMethodId = MockPaymentMethodId, ShippingCity = MockAdress.City, ShippingState = MockAdress.State, ShippingCountry = MockAdress.Country, diff --git a/src/ClientApp/Services/Order/OrderService.cs b/src/ClientApp/Services/Order/OrderService.cs index d7f6a9887..627dbfadd 100644 --- a/src/ClientApp/Services/Order/OrderService.cs +++ b/src/ClientApp/Services/Order/OrderService.cs @@ -113,11 +113,7 @@ public OrderCheckout MapOrderToBasket(Models.Orders.Order order) { return new OrderCheckout { - CardExpiration = order.CardExpiration, - CardHolderName = order.CardHolderName, - CardNumber = order.CardNumber, - CardSecurityNumber = order.CardSecurityNumber, - CardTypeId = order.CardTypeId, + PaymentMethodId = order.PaymentMethodId, City = order.ShippingCity, State = order.ShippingState, Country = order.ShippingCountry, diff --git a/src/ClientApp/ViewModels/CheckoutViewModel.cs b/src/ClientApp/ViewModels/CheckoutViewModel.cs index b4e251d6c..1362b6cf0 100644 --- a/src/ClientApp/ViewModels/CheckoutViewModel.cs +++ b/src/ClientApp/ViewModels/CheckoutViewModel.cs @@ -55,15 +55,6 @@ await IsBusyFor( City = userInfo?.Address }; - // Create Payment Info - var paymentInfo = new PaymentInfo - { - CardNumber = userInfo?.CardNumber, - CardHolderName = userInfo?.CardHolder, - CardType = new CardType {Id = 3, Name = "MasterCard"}, - SecurityNumber = userInfo?.CardSecurityNumber - }; - var orderItems = CreateOrderItems(basketItems); // Create new Order @@ -76,11 +67,7 @@ await IsBusyFor( OrderItems = orderItems, OrderStatus = "Submitted", OrderDate = DateTime.Now, - CardHolderName = paymentInfo.CardHolderName, - CardNumber = paymentInfo.CardNumber, - CardSecurityNumber = paymentInfo.SecurityNumber, - CardExpiration = DateTime.UtcNow.AddYears(5), - CardTypeId = paymentInfo.CardType.Id, + PaymentMethodId = "pm_sample_mobile", ShippingState = ShippingAddress.State, ShippingCountry = ShippingAddress.Country, ShippingStreet = ShippingAddress.Street, diff --git a/src/Identity.API/Data/Migrations/20260607000000_RemoveSensitiveCardProfileData.cs b/src/Identity.API/Data/Migrations/20260607000000_RemoveSensitiveCardProfileData.cs new file mode 100644 index 000000000..4d089f1aa --- /dev/null +++ b/src/Identity.API/Data/Migrations/20260607000000_RemoveSensitiveCardProfileData.cs @@ -0,0 +1,70 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace eShop.Identity.API.Data.Migrations +{ + public partial class RemoveSensitiveCardProfileData : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CardHolderName", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "CardNumber", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "CardType", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "Expiration", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "SecurityNumber", + table: "AspNetUsers"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CardHolderName", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "CardNumber", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "CardType", + table: "AspNetUsers", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "Expiration", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "SecurityNumber", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: ""); + } + } +} diff --git a/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs index 92d3a0943..a55eaecb4 100644 --- a/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs @@ -162,17 +162,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("AccessFailedCount") .HasColumnType("integer"); - b.Property("CardHolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardType") - .HasColumnType("integer"); - b.Property("City") .IsRequired() .HasColumnType("text"); @@ -192,10 +181,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("EmailConfirmed") .HasColumnType("boolean"); - b.Property("Expiration") - .IsRequired() - .HasColumnType("text"); - b.Property("LastName") .IsRequired() .HasColumnType("text"); @@ -227,10 +212,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("PhoneNumberConfirmed") .HasColumnType("boolean"); - b.Property("SecurityNumber") - .IsRequired() - .HasColumnType("text"); - b.Property("SecurityStamp") .HasColumnType("text"); diff --git a/src/Identity.API/Models/ApplicationUser.cs b/src/Identity.API/Models/ApplicationUser.cs index 11a151a1f..40c390365 100644 --- a/src/Identity.API/Models/ApplicationUser.cs +++ b/src/Identity.API/Models/ApplicationUser.cs @@ -3,16 +3,6 @@ // Add profile data for application users by adding properties to the ApplicationUser class public class ApplicationUser : IdentityUser { - [Required] - public string CardNumber { get; set; } - [Required] - public string SecurityNumber { get; set; } - [Required] - [RegularExpression(@"(0[1-9]|1[0-2])\/[0-9]{2}", ErrorMessage = "Expiration should match a valid MM/YY value")] - public string Expiration { get; set; } - [Required] - public string CardHolderName { get; set; } - public int CardType { get; set; } [Required] public string Street { get; set; } [Required] diff --git a/src/Identity.API/Services/ProfileService.cs b/src/Identity.API/Services/ProfileService.cs index f42a50fad..6c4341247 100644 --- a/src/Identity.API/Services/ProfileService.cs +++ b/src/Identity.API/Services/ProfileService.cs @@ -67,18 +67,6 @@ private IEnumerable GetClaimsFromUser(ApplicationUser user) if (!string.IsNullOrWhiteSpace(user.LastName)) claims.Add(new Claim("last_name", user.LastName)); - if (!string.IsNullOrWhiteSpace(user.CardNumber)) - claims.Add(new Claim("card_number", user.CardNumber)); - - if (!string.IsNullOrWhiteSpace(user.CardHolderName)) - claims.Add(new Claim("card_holder", user.CardHolderName)); - - if (!string.IsNullOrWhiteSpace(user.SecurityNumber)) - claims.Add(new Claim("card_security_number", user.SecurityNumber)); - - if (!string.IsNullOrWhiteSpace(user.Expiration)) - claims.Add(new Claim("card_expiration", user.Expiration)); - if (!string.IsNullOrWhiteSpace(user.City)) claims.Add(new Claim("address_city", user.City)); diff --git a/src/Identity.API/UsersSeed.cs b/src/Identity.API/UsersSeed.cs index 881cc097f..ea94ed15b 100644 --- a/src/Identity.API/UsersSeed.cs +++ b/src/Identity.API/UsersSeed.cs @@ -14,20 +14,15 @@ public async Task SeedAsync(ApplicationDbContext context) UserName = "alice", Email = "AliceSmith@email.com", EmailConfirmed = true, - CardHolderName = "Alice Smith", - CardNumber = "XXXXXXXXXXXX1881", - CardType = 1, City = "Redmond", Country = "U.S.", - Expiration = "12/24", Id = Guid.NewGuid().ToString(), LastName = "Smith", Name = "Alice", PhoneNumber = "1234567890", ZipCode = "98052", State = "WA", - Street = "15703 NE 61st Ct", - SecurityNumber = "123" + Street = "15703 NE 61st Ct" }; var result = await userManager.CreateAsync(alice, "Pass123$"); @@ -59,20 +54,15 @@ public async Task SeedAsync(ApplicationDbContext context) UserName = "bob", Email = "BobSmith@email.com", EmailConfirmed = true, - CardHolderName = "Bob Smith", - CardNumber = "XXXXXXXXXXXX1881", - CardType = 1, City = "Redmond", Country = "U.S.", - Expiration = "12/24", Id = Guid.NewGuid().ToString(), LastName = "Smith", Name = "Bob", PhoneNumber = "1234567890", ZipCode = "98052", State = "WA", - Street = "15703 NE 61st Ct", - SecurityNumber = "456" + Street = "15703 NE 61st Ct" }; var result = await userManager.CreateAsync(bob, "Pass123$"); diff --git a/src/Ordering.API/Apis/OrdersApi.cs b/src/Ordering.API/Apis/OrdersApi.cs index b8c339cf8..2e34cc7ec 100644 --- a/src/Ordering.API/Apis/OrdersApi.cs +++ b/src/Ordering.API/Apis/OrdersApi.cs @@ -121,36 +121,34 @@ public static async Task>> CreateOrderAsync( [AsParameters] OrderServices services) { - //mask the credit card number - services.Logger.LogInformation( "Sending command: {CommandName} - {IdProperty}: {CommandId}", request.GetGenericTypeName(), nameof(request.UserId), - request.UserId); //don't log the request as it has CC number + request.UserId); if (requestId == Guid.Empty) { - services.Logger.LogWarning("Invalid IntegrationEvent - RequestId is missing - {@IntegrationEvent}", request); + services.Logger.LogWarning( + "Invalid IntegrationEvent - RequestId is missing - UserId: {UserId}", + request.UserId); return TypedResults.BadRequest("RequestId is missing."); } using (services.Logger.BeginScope(new List> { new("IdentifiedCommandId", requestId) })) { - var maskedCCNumber = request.CardNumber.Substring(request.CardNumber.Length - 4).PadLeft(request.CardNumber.Length, 'X'); var createOrderCommand = new CreateOrderCommand(request.Items, request.UserId, request.UserName, request.City, request.Street, request.State, request.Country, request.ZipCode, - maskedCCNumber, request.CardHolderName, request.CardExpiration, - request.CardSecurityNumber, request.CardTypeId); + request.PaymentMethodId); var requestCreateOrder = new IdentifiedCommand(createOrderCommand, requestId); services.Logger.LogInformation( - "Sending command: {CommandName} - {IdProperty}: {CommandId} ({@Command})", + "Sending command: {CommandName} - {IdProperty}: {CommandId} - RequestId: {RequestId}", requestCreateOrder.GetGenericTypeName(), - nameof(requestCreateOrder.Id), - requestCreateOrder.Id, - requestCreateOrder); + nameof(requestCreateOrder.Command.UserId), + requestCreateOrder.Command.UserId, + requestCreateOrder.Id); var result = await services.Mediator.Send(requestCreateOrder); @@ -176,10 +174,6 @@ public record CreateOrderRequest( string State, string Country, string ZipCode, - string CardNumber, - string CardHolderName, - DateTime CardExpiration, - string CardSecurityNumber, - int CardTypeId, + string PaymentMethodId, string Buyer, List Items); diff --git a/src/Ordering.API/Application/Commands/CreateOrderCommand.cs b/src/Ordering.API/Application/Commands/CreateOrderCommand.cs index 61f46c124..c2d4e4e7a 100644 --- a/src/Ordering.API/Application/Commands/CreateOrderCommand.cs +++ b/src/Ordering.API/Application/Commands/CreateOrderCommand.cs @@ -41,19 +41,7 @@ public class CreateOrderCommand public string ZipCode { get; private set; } [DataMember] - public string CardNumber { get; private set; } - - [DataMember] - public string CardHolderName { get; private set; } - - [DataMember] - public DateTime CardExpiration { get; private set; } - - [DataMember] - public string CardSecurityNumber { get; private set; } - - [DataMember] - public int CardTypeId { get; private set; } + public string PaymentMethodId { get; private set; } [DataMember] public IEnumerable OrderItems => _orderItems; @@ -64,8 +52,7 @@ public CreateOrderCommand() } public CreateOrderCommand(List basketItems, string userId, string userName, string city, string street, string state, string country, string zipcode, - string cardNumber, string cardHolderName, DateTime cardExpiration, - string cardSecurityNumber, int cardTypeId) + string paymentMethodId) { _orderItems = basketItems.ToOrderItemsDTO().ToList(); UserId = userId; @@ -75,11 +62,7 @@ public CreateOrderCommand(List basketItems, string userId, string us State = state; Country = country; ZipCode = zipcode; - CardNumber = cardNumber; - CardHolderName = cardHolderName; - CardExpiration = cardExpiration; - CardSecurityNumber = cardSecurityNumber; - CardTypeId = cardTypeId; + PaymentMethodId = paymentMethodId; } } diff --git a/src/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs b/src/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs index 8a0365ee0..6d9a5071c 100644 --- a/src/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs +++ b/src/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs @@ -37,7 +37,7 @@ public async Task Handle(CreateOrderCommand message, CancellationToken can // methods and constructor so validations, invariants and business logic // make sure that consistency is preserved across the whole aggregate var address = new Address(message.Street, message.City, message.State, message.Country, message.ZipCode); - var order = new Order(message.UserId, message.UserName, address, message.CardTypeId, message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration); + var order = new Order(message.UserId, message.UserName, address, message.PaymentMethodId); foreach (var item in message.OrderItems) { diff --git a/src/Ordering.API/Application/DomainEventHandlers/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs b/src/Ordering.API/Application/DomainEventHandlers/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs index 8cde0d406..42859217e 100644 --- a/src/Ordering.API/Application/DomainEventHandlers/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs +++ b/src/Ordering.API/Application/DomainEventHandlers/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs @@ -19,7 +19,6 @@ public ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler( public async Task Handle(OrderStartedDomainEvent domainEvent, CancellationToken cancellationToken) { - var cardTypeId = domainEvent.CardTypeId != 0 ? domainEvent.CardTypeId : 1; var buyer = await _buyerRepository.FindAsync(domainEvent.UserId); var buyerExisted = buyer is not null; @@ -31,12 +30,8 @@ public async Task Handle(OrderStartedDomainEvent domainEvent, CancellationToken // REVIEW: The event this creates needs to be sent after SaveChanges has propagated the buyer Id. It currently only // works by coincidence. If we remove HiLo or if anything decides to yield earlier, it will break. - buyer.VerifyOrAddPaymentMethod(cardTypeId, - $"Payment Method on {DateTime.UtcNow}", - domainEvent.CardNumber, - domainEvent.CardSecurityNumber, - domainEvent.CardHolderName, - domainEvent.CardExpiration, + buyer.VerifyOrAddPaymentMethod($"Payment Method on {DateTime.UtcNow}", + domainEvent.PaymentMethodId, domainEvent.Order.Id); if (!buyerExisted) diff --git a/src/Ordering.API/Application/Validations/CreateOrderCommandValidator.cs b/src/Ordering.API/Application/Validations/CreateOrderCommandValidator.cs index 4781ca264..d9ff190ba 100644 --- a/src/Ordering.API/Application/Validations/CreateOrderCommandValidator.cs +++ b/src/Ordering.API/Application/Validations/CreateOrderCommandValidator.cs @@ -8,11 +8,7 @@ public CreateOrderCommandValidator(ILogger logger) RuleFor(command => command.State).NotEmpty(); RuleFor(command => command.Country).NotEmpty(); RuleFor(command => command.ZipCode).NotEmpty(); - RuleFor(command => command.CardNumber).NotEmpty().Length(12, 19); - RuleFor(command => command.CardHolderName).NotEmpty(); - RuleFor(command => command.CardExpiration).NotEmpty().Must(BeValidExpirationDate).WithMessage("Please specify a valid card expiration date"); - RuleFor(command => command.CardSecurityNumber).NotEmpty().Length(3); - RuleFor(command => command.CardTypeId).NotEmpty(); + RuleFor(command => command.PaymentMethodId).NotEmpty().MaximumLength(200); RuleFor(command => command.OrderItems).Must(ContainOrderItems).WithMessage("No order items found"); if (logger.IsEnabled(LogLevel.Trace)) @@ -21,11 +17,6 @@ public CreateOrderCommandValidator(ILogger logger) } } - private bool BeValidExpirationDate(DateTime dateTime) - { - return dateTime >= DateTime.UtcNow; - } - private bool ContainOrderItems(IEnumerable orderItems) { return orderItems.Any(); diff --git a/src/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs b/src/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs index 825cdc73a..3bca5641d 100644 --- a/src/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs +++ b/src/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs @@ -26,12 +26,10 @@ public Buyer(string identity, string name) : this() Name = !string.IsNullOrWhiteSpace(name) ? name : throw new ArgumentNullException(nameof(name)); } - public PaymentMethod VerifyOrAddPaymentMethod( - int cardTypeId, string alias, string cardNumber, - string securityNumber, string cardHolderName, DateTime expiration, int orderId) + public PaymentMethod VerifyOrAddPaymentMethod(string alias, string paymentMethodId, int orderId) { var existingPayment = _paymentMethods - .SingleOrDefault(p => p.IsEqualTo(cardTypeId, cardNumber, expiration)); + .SingleOrDefault(p => p.IsEqualTo(paymentMethodId)); if (existingPayment != null) { @@ -40,7 +38,7 @@ public PaymentMethod VerifyOrAddPaymentMethod( return existingPayment; } - var payment = new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration); + var payment = new PaymentMethod(alias, paymentMethodId); _paymentMethods.Add(payment); diff --git a/src/Ordering.Domain/AggregatesModel/BuyerAggregate/PaymentMethod.cs b/src/Ordering.Domain/AggregatesModel/BuyerAggregate/PaymentMethod.cs index c6964291f..fcd20f60e 100644 --- a/src/Ordering.Domain/AggregatesModel/BuyerAggregate/PaymentMethod.cs +++ b/src/Ordering.Domain/AggregatesModel/BuyerAggregate/PaymentMethod.cs @@ -7,37 +7,18 @@ public class PaymentMethod : Entity [Required] private string _alias; [Required] - private string _cardNumber; - private string _securityNumber; - [Required] - private string _cardHolderName; - private DateTime _expiration; - - private int _cardTypeId; - public CardType CardType { get; private set; } + private string _paymentMethodId; protected PaymentMethod() { } - public PaymentMethod(int cardTypeId, string alias, string cardNumber, string securityNumber, string cardHolderName, DateTime expiration) + public PaymentMethod(string alias, string paymentMethodId) { - _cardNumber = !string.IsNullOrWhiteSpace(cardNumber) ? cardNumber : throw new OrderingDomainException(nameof(cardNumber)); - _securityNumber = !string.IsNullOrWhiteSpace(securityNumber) ? securityNumber : throw new OrderingDomainException(nameof(securityNumber)); - _cardHolderName = !string.IsNullOrWhiteSpace(cardHolderName) ? cardHolderName : throw new OrderingDomainException(nameof(cardHolderName)); - - if (expiration < DateTime.UtcNow) - { - throw new OrderingDomainException(nameof(expiration)); - } - _alias = alias; - _expiration = expiration; - _cardTypeId = cardTypeId; + _paymentMethodId = !string.IsNullOrWhiteSpace(paymentMethodId) ? paymentMethodId : throw new OrderingDomainException(nameof(paymentMethodId)); } - public bool IsEqualTo(int cardTypeId, string cardNumber, DateTime expiration) + public bool IsEqualTo(string paymentMethodId) { - return _cardTypeId == cardTypeId - && _cardNumber == cardNumber - && _expiration == expiration; + return _paymentMethodId == paymentMethodId; } } diff --git a/src/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index 3f51f71c2..ea8fbce9b 100644 --- a/src/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -49,19 +49,17 @@ protected Order() _isDraft = false; } - public Order(string userId, string userName, Address address, int cardTypeId, string cardNumber, string cardSecurityNumber, - string cardHolderName, DateTime cardExpiration, int? buyerId = null, int? paymentMethodId = null) : this() + public Order(string userId, string userName, Address address, string paymentMethodId, int? buyerId = null, int? paymentMethodRecordId = null) : this() { BuyerId = buyerId; - PaymentId = paymentMethodId; + PaymentId = paymentMethodRecordId; OrderStatus = OrderStatus.Submitted; OrderDate = DateTime.UtcNow; Address = address; // Add the OrderStarterDomainEvent to the domain events collection // to be raised/dispatched when committing changes into the Database [ After DbContext.SaveChanges() ] - AddOrderStartedDomainEvent(userId, userName, cardTypeId, cardNumber, - cardSecurityNumber, cardHolderName, cardExpiration); + AddOrderStartedDomainEvent(userId, userName, paymentMethodId); } // DDD Patterns comment @@ -167,12 +165,9 @@ public void SetCancelledStatusWhenStockIsRejected(IEnumerable orderStockRej } } - private void AddOrderStartedDomainEvent(string userId, string userName, int cardTypeId, string cardNumber, - string cardSecurityNumber, string cardHolderName, DateTime cardExpiration) + private void AddOrderStartedDomainEvent(string userId, string userName, string paymentMethodId) { - var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, userName, cardTypeId, - cardNumber, cardSecurityNumber, - cardHolderName, cardExpiration); + var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, userName, paymentMethodId); this.AddDomainEvent(orderStartedDomainEvent); } diff --git a/src/Ordering.Domain/Events/OrderStartedDomainEvent.cs b/src/Ordering.Domain/Events/OrderStartedDomainEvent.cs index 7bb0b17e4..c600afe57 100644 --- a/src/Ordering.Domain/Events/OrderStartedDomainEvent.cs +++ b/src/Ordering.Domain/Events/OrderStartedDomainEvent.cs @@ -8,8 +8,4 @@ public record class OrderStartedDomainEvent( Order Order, string UserId, string UserName, - int CardTypeId, - string CardNumber, - string CardSecurityNumber, - string CardHolderName, - DateTime CardExpiration) : INotification; + string PaymentMethodId) : INotification; diff --git a/src/Ordering.Infrastructure/EntityConfigurations/PaymentMethodEntityTypeConfiguration.cs b/src/Ordering.Infrastructure/EntityConfigurations/PaymentMethodEntityTypeConfiguration.cs index cd6697acd..a4729a456 100644 --- a/src/Ordering.Infrastructure/EntityConfigurations/PaymentMethodEntityTypeConfiguration.cs +++ b/src/Ordering.Infrastructure/EntityConfigurations/PaymentMethodEntityTypeConfiguration.cs @@ -14,33 +14,15 @@ public void Configure(EntityTypeBuilder paymentConfiguration) paymentConfiguration.Property("BuyerId"); - paymentConfiguration - .Property("_cardHolderName") - .HasColumnName("CardHolderName") - .HasMaxLength(200); - paymentConfiguration .Property("_alias") .HasColumnName("Alias") .HasMaxLength(200); paymentConfiguration - .Property("_cardNumber") - .HasColumnName("CardNumber") - .HasMaxLength(25) + .Property("_paymentMethodId") + .HasColumnName("PaymentMethodId") + .HasMaxLength(200) .IsRequired(); - - paymentConfiguration - .Property("_expiration") - .HasColumnName("Expiration") - .HasMaxLength(25); - - paymentConfiguration - .Property("_cardTypeId") - .HasColumnName("CardTypeId"); - - paymentConfiguration.HasOne(p => p.CardType) - .WithMany() - .HasForeignKey("_cardTypeId"); } } diff --git a/src/Ordering.Infrastructure/Migrations/20260607000000_RemoveSensitivePaymentMethodData.cs b/src/Ordering.Infrastructure/Migrations/20260607000000_RemoveSensitivePaymentMethodData.cs new file mode 100644 index 000000000..54ca72414 --- /dev/null +++ b/src/Ordering.Infrastructure/Migrations/20260607000000_RemoveSensitivePaymentMethodData.cs @@ -0,0 +1,111 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Ordering.Infrastructure.Migrations +{ + public partial class RemoveSensitivePaymentMethodData : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_paymentmethods_cardtypes_CardTypeId", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.DropIndex( + name: "IX_paymentmethods_CardTypeId", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.DropColumn( + name: "CardHolderName", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.DropColumn( + name: "CardNumber", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.DropColumn( + name: "CardTypeId", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.DropColumn( + name: "Expiration", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.AddColumn( + name: "PaymentMethodId", + schema: "ordering", + table: "paymentmethods", + type: "character varying(200)", + maxLength: 200, + nullable: false, + defaultValue: ""); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "PaymentMethodId", + schema: "ordering", + table: "paymentmethods"); + + migrationBuilder.AddColumn( + name: "CardHolderName", + schema: "ordering", + table: "paymentmethods", + type: "character varying(200)", + maxLength: 200, + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "CardNumber", + schema: "ordering", + table: "paymentmethods", + type: "character varying(25)", + maxLength: 25, + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "CardTypeId", + schema: "ordering", + table: "paymentmethods", + type: "integer", + nullable: false, + defaultValue: 1); + + migrationBuilder.AddColumn( + name: "Expiration", + schema: "ordering", + table: "paymentmethods", + type: "timestamp with time zone", + maxLength: 25, + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)); + + migrationBuilder.CreateIndex( + name: "IX_paymentmethods_CardTypeId", + schema: "ordering", + table: "paymentmethods", + column: "CardTypeId"); + + migrationBuilder.AddForeignKey( + name: "FK_paymentmethods_cardtypes_CardTypeId", + schema: "ordering", + table: "paymentmethods", + column: "CardTypeId", + principalSchema: "ordering", + principalTable: "cardtypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/src/Ordering.Infrastructure/Migrations/OrderingContextModelSnapshot.cs b/src/Ordering.Infrastructure/Migrations/OrderingContextModelSnapshot.cs index cd26856d7..12d412caf 100644 --- a/src/Ordering.Infrastructure/Migrations/OrderingContextModelSnapshot.cs +++ b/src/Ordering.Infrastructure/Migrations/OrderingContextModelSnapshot.cs @@ -122,33 +122,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("character varying(200)") .HasColumnName("Alias"); - b.Property("_cardHolderName") + b.Property("_paymentMethodId") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)") - .HasColumnName("CardHolderName"); - - b.Property("_cardNumber") - .IsRequired() - .HasMaxLength(25) - .HasColumnType("character varying(25)") - .HasColumnName("CardNumber"); - - b.Property("_cardTypeId") - .HasColumnType("integer") - .HasColumnName("CardTypeId"); - - b.Property("_expiration") - .HasMaxLength(25) - .HasColumnType("timestamp with time zone") - .HasColumnName("Expiration"); + .HasColumnName("PaymentMethodId"); b.HasKey("Id"); b.HasIndex("BuyerId"); - b.HasIndex("_cardTypeId"); - b.ToTable("paymentmethods", "ordering"); }); @@ -257,13 +240,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("eShop.Ordering.Domain.AggregatesModel.BuyerAggregate.CardType", "CardType") - .WithMany() - .HasForeignKey("_cardTypeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CardType"); }); modelBuilder.Entity("eShop.Ordering.Domain.AggregatesModel.OrderAggregate.Order", b => diff --git a/src/WebApp/Components/Pages/Checkout/Checkout.razor b/src/WebApp/Components/Pages/Checkout/Checkout.razor index b266ec6a5..c77c23b3c 100644 --- a/src/WebApp/Components/Pages/Checkout/Checkout.razor +++ b/src/WebApp/Components/Pages/Checkout/Checkout.razor @@ -110,7 +110,6 @@ private async Task HandleValidSubmitAsync() { - Info.CardTypeId = 1; await Basket.CheckoutAsync(Info); Nav.NavigateTo("user/orders"); } diff --git a/src/WebApp/Services/BasketCheckoutInfo.cs b/src/WebApp/Services/BasketCheckoutInfo.cs index e1fd8afe3..132cfd9cc 100644 --- a/src/WebApp/Services/BasketCheckoutInfo.cs +++ b/src/WebApp/Services/BasketCheckoutInfo.cs @@ -19,15 +19,8 @@ public class BasketCheckoutInfo [Required] public string? ZipCode { get; set; } - public string? CardNumber { get; set; } - - public string? CardHolderName { get; set; } - - public string? CardSecurityNumber { get; set; } - - public DateTime? CardExpiration { get; set; } - - public int CardTypeId { get; set; } + [Required] + public string PaymentMethodId { get; set; } = "pm_sample_visa"; public string? Buyer { get; set; } public Guid RequestId { get; set; } diff --git a/src/WebApp/Services/BasketState.cs b/src/WebApp/Services/BasketState.cs index e03b37730..de41ce0cc 100644 --- a/src/WebApp/Services/BasketState.cs +++ b/src/WebApp/Services/BasketState.cs @@ -97,11 +97,7 @@ public async Task CheckoutAsync(BasketCheckoutInfo checkoutInfo) State: checkoutInfo.State!, Country: checkoutInfo.Country!, ZipCode: checkoutInfo.ZipCode!, - CardNumber: "1111222233334444", - CardHolderName: "TESTUSER", - CardExpiration: DateTime.UtcNow.AddYears(1), - CardSecurityNumber: "111", - CardTypeId: checkoutInfo.CardTypeId, + PaymentMethodId: checkoutInfo.PaymentMethodId, Buyer: buyerId, Items: [.. orderItems]); await orderingService.CreateOrder(request, checkoutInfo.RequestId); @@ -163,10 +159,6 @@ public record CreateOrderRequest( string State, string Country, string ZipCode, - string CardNumber, - string CardHolderName, - DateTime CardExpiration, - string CardSecurityNumber, - int CardTypeId, + string PaymentMethodId, string Buyer, List Items); diff --git a/tests/Ordering.FunctionalTests/OrderingApiTests.cs b/tests/Ordering.FunctionalTests/OrderingApiTests.cs index 9b96d9de3..6bd95f5a5 100644 --- a/tests/Ordering.FunctionalTests/OrderingApiTests.cs +++ b/tests/Ordering.FunctionalTests/OrderingApiTests.cs @@ -146,8 +146,7 @@ public async Task AddNewOrder() Quantity = 1, PictureUrl = null }; - var cardExpirationDate = Convert.ToDateTime("2023-12-22T12:34:24.334Z"); - var OrderRequest = new CreateOrderRequest("1", "TestUser", null, null, null, null, null, "XXXXXXXXXXXX0005", "Test User", cardExpirationDate, "test buyer", 1, null, new List { item }); + var OrderRequest = new CreateOrderRequest("1", "TestUser", null, null, null, null, null, "pm_test_123", null, new List { item }); var content = new StringContent(JsonSerializer.Serialize(OrderRequest), UTF8Encoding.UTF8, "application/json") { Headers = { { "x-requestid", Guid.NewGuid().ToString() } } diff --git a/tests/Ordering.UnitTests/Application/IdentifiedCommandHandlerTest.cs b/tests/Ordering.UnitTests/Application/IdentifiedCommandHandlerTest.cs index 60f419661..80ebdbb26 100644 --- a/tests/Ordering.UnitTests/Application/IdentifiedCommandHandlerTest.cs +++ b/tests/Ordering.UnitTests/Application/IdentifiedCommandHandlerTest.cs @@ -68,10 +68,6 @@ private CreateOrderCommand FakeOrderRequest(Dictionary args = nu state: args != null && args.ContainsKey("state") ? (string)args["state"] : null, country: args != null && args.ContainsKey("country") ? (string)args["country"] : null, zipcode: args != null && args.ContainsKey("zipcode") ? (string)args["zipcode"] : null, - cardNumber: args != null && args.ContainsKey("cardNumber") ? (string)args["cardNumber"] : "1234", - cardExpiration: args != null && args.ContainsKey("cardExpiration") ? (DateTime)args["cardExpiration"] : DateTime.MinValue, - cardSecurityNumber: args != null && args.ContainsKey("cardSecurityNumber") ? (string)args["cardSecurityNumber"] : "123", - cardHolderName: args != null && args.ContainsKey("cardHolderName") ? (string)args["cardHolderName"] : "XXX", - cardTypeId: args != null && args.ContainsKey("cardTypeId") ? (int)args["cardTypeId"] : 0); + paymentMethodId: args != null && args.ContainsKey("paymentMethodId") ? (string)args["paymentMethodId"] : "pm_test_123"); } } diff --git a/tests/Ordering.UnitTests/Application/NewOrderCommandHandlerTest.cs b/tests/Ordering.UnitTests/Application/NewOrderCommandHandlerTest.cs index 8a66f4ceb..73b108f0d 100644 --- a/tests/Ordering.UnitTests/Application/NewOrderCommandHandlerTest.cs +++ b/tests/Ordering.UnitTests/Application/NewOrderCommandHandlerTest.cs @@ -25,8 +25,7 @@ public async Task Handle_return_false_if_order_is_not_persisted() { var buyerId = "1234"; - var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary - { ["cardExpiration"] = DateTime.UtcNow.AddYears(1) }); + var fakeOrderCmd = FakeOrderRequestWithBuyer(); _orderRepositoryMock.GetAsync(Arg.Any()) .Returns(Task.FromResult(FakeOrder())); @@ -60,7 +59,7 @@ private Buyer FakeBuyer() private Order FakeOrder() { - return new Order("1", "fakeName", new Address("street", "city", "state", "country", "zipcode"), 1, "12", "111", "fakeName", DateTime.UtcNow.AddYears(1)); + return new Order("1", "fakeName", new Address("street", "city", "state", "country", "zipcode"), "pm_test_123"); } private CreateOrderCommand FakeOrderRequestWithBuyer(Dictionary args = null) @@ -74,10 +73,6 @@ private CreateOrderCommand FakeOrderRequestWithBuyer(Dictionary state: args != null && args.ContainsKey("state") ? (string)args["state"] : null, country: args != null && args.ContainsKey("country") ? (string)args["country"] : null, zipcode: args != null && args.ContainsKey("zipcode") ? (string)args["zipcode"] : null, - cardNumber: args != null && args.ContainsKey("cardNumber") ? (string)args["cardNumber"] : "1234", - cardExpiration: args != null && args.ContainsKey("cardExpiration") ? (DateTime)args["cardExpiration"] : DateTime.MinValue, - cardSecurityNumber: args != null && args.ContainsKey("cardSecurityNumber") ? (string)args["cardSecurityNumber"] : "123", - cardHolderName: args != null && args.ContainsKey("cardHolderName") ? (string)args["cardHolderName"] : "XXX", - cardTypeId: args != null && args.ContainsKey("cardTypeId") ? (int)args["cardTypeId"] : 0); + paymentMethodId: args != null && args.ContainsKey("paymentMethodId") ? (string)args["paymentMethodId"] : "pm_test_123"); } } diff --git a/tests/Ordering.UnitTests/Builders.cs b/tests/Ordering.UnitTests/Builders.cs index 1b52f2abe..c0690339a 100644 --- a/tests/Ordering.UnitTests/Builders.cs +++ b/tests/Ordering.UnitTests/Builders.cs @@ -20,11 +20,7 @@ public OrderBuilder(Address address) "userId", "fakeName", address, - cardTypeId: 5, - cardNumber: "12", - cardSecurityNumber: "123", - cardHolderName: "name", - cardExpiration: DateTime.UtcNow); + paymentMethodId: "pm_test_123"); } public OrderBuilder AddOne( diff --git a/tests/Ordering.UnitTests/Domain/BuyerAggregateTest.cs b/tests/Ordering.UnitTests/Domain/BuyerAggregateTest.cs index 58af6b514..ed94efd9d 100644 --- a/tests/Ordering.UnitTests/Domain/BuyerAggregateTest.cs +++ b/tests/Ordering.UnitTests/Domain/BuyerAggregateTest.cs @@ -35,19 +35,15 @@ public void Create_buyer_item_fail() public void add_payment_success() { //Arrange - var cardTypeId = 1; var alias = "fakeAlias"; - var cardNumber = "124"; - var securityNumber = "1234"; - var cardHolderName = "FakeHolderNAme"; - var expiration = DateTime.UtcNow.AddYears(1); + var paymentMethodId = "pm_test_123"; var orderId = 1; var name = "fakeUser"; var identity = new Guid().ToString(); var fakeBuyerItem = new Buyer(identity, name); //Act - var result = fakeBuyerItem.VerifyOrAddPaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration, orderId); + var result = fakeBuyerItem.VerifyOrAddPaymentMethod(alias, paymentMethodId, orderId); //Assert Assert.IsNotNull(result); @@ -57,50 +53,37 @@ public void add_payment_success() public void create_payment_method_success() { //Arrange - var cardTypeId = 1; var alias = "fakeAlias"; - var cardNumber = "124"; - var securityNumber = "1234"; - var cardHolderName = "FakeHolderNAme"; - var expiration = DateTime.UtcNow.AddYears(1); - var fakePaymentMethod = new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration); + var paymentMethodId = "pm_test_123"; //Act - var result = new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration); + var result = new PaymentMethod(alias, paymentMethodId); //Assert Assert.IsNotNull(result); } [TestMethod] - public void create_payment_method_expiration_fail() + public void create_payment_method_empty_reference_fail() { //Arrange - var cardTypeId = 1; var alias = "fakeAlias"; - var cardNumber = "124"; - var securityNumber = "1234"; - var cardHolderName = "FakeHolderNAme"; - var expiration = DateTime.UtcNow.AddYears(-1); + var paymentMethodId = string.Empty; //Act - Assert - Assert.ThrowsExactly(() => new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration)); + Assert.ThrowsExactly(() => new PaymentMethod(alias, paymentMethodId)); } [TestMethod] public void payment_method_isEqualTo() { //Arrange - var cardTypeId = 1; var alias = "fakeAlias"; - var cardNumber = "124"; - var securityNumber = "1234"; - var cardHolderName = "FakeHolderNAme"; - var expiration = DateTime.UtcNow.AddYears(1); + var paymentMethodId = "pm_test_123"; //Act - var fakePaymentMethod = new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration); - var result = fakePaymentMethod.IsEqualTo(cardTypeId, cardNumber, expiration); + var fakePaymentMethod = new PaymentMethod(alias, paymentMethodId); + var result = fakePaymentMethod.IsEqualTo(paymentMethodId); //Assert Assert.IsTrue(result); @@ -112,17 +95,13 @@ public void Add_new_PaymentMethod_raises_new_event() //Arrange var alias = "fakeAlias"; var orderId = 1; - var cardTypeId = 5; - var cardNumber = "12"; - var cardSecurityNumber = "123"; - var cardHolderName = "FakeName"; - var cardExpiration = DateTime.UtcNow.AddYears(1); + var paymentMethodId = "pm_test_123"; var expectedResult = 1; var name = "fakeUser"; //Act var fakeBuyer = new Buyer(Guid.NewGuid().ToString(), name); - fakeBuyer.VerifyOrAddPaymentMethod(cardTypeId, alias, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration, orderId); + fakeBuyer.VerifyOrAddPaymentMethod(alias, paymentMethodId, orderId); //Assert Assert.HasCount(expectedResult, fakeBuyer.DomainEvents); diff --git a/tests/Ordering.UnitTests/Domain/OrderAggregateTest.cs b/tests/Ordering.UnitTests/Domain/OrderAggregateTest.cs index f0af353a1..e91cf7dbe 100644 --- a/tests/Ordering.UnitTests/Domain/OrderAggregateTest.cs +++ b/tests/Ordering.UnitTests/Domain/OrderAggregateTest.cs @@ -114,15 +114,11 @@ public void Add_new_Order_raises_new_event() var state = "fakeState"; var country = "fakeCountry"; var zipcode = "FakeZipCode"; - var cardTypeId = 5; - var cardNumber = "12"; - var cardSecurityNumber = "123"; - var cardHolderName = "FakeName"; - var cardExpiration = DateTime.UtcNow.AddYears(1); + var paymentMethodId = "pm_test_123"; var expectedResult = 1; //Act - var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration); + var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), paymentMethodId); //Assert Assert.HasCount(expectedResult, fakeOrder.DomainEvents); @@ -137,16 +133,12 @@ public void Add_event_Order_explicitly_raises_new_event() var state = "fakeState"; var country = "fakeCountry"; var zipcode = "FakeZipCode"; - var cardTypeId = 5; - var cardNumber = "12"; - var cardSecurityNumber = "123"; - var cardHolderName = "FakeName"; - var cardExpiration = DateTime.UtcNow.AddYears(1); + var paymentMethodId = "pm_test_123"; var expectedResult = 2; //Act - var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration); - fakeOrder.AddDomainEvent(new OrderStartedDomainEvent(fakeOrder, "fakeName", "1", cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration)); + var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), paymentMethodId); + fakeOrder.AddDomainEvent(new OrderStartedDomainEvent(fakeOrder, "fakeName", "1", paymentMethodId)); //Assert Assert.HasCount(expectedResult, fakeOrder.DomainEvents); } @@ -160,13 +152,9 @@ public void Remove_event_Order_explicitly() var state = "fakeState"; var country = "fakeCountry"; var zipcode = "FakeZipCode"; - var cardTypeId = 5; - var cardNumber = "12"; - var cardSecurityNumber = "123"; - var cardHolderName = "FakeName"; - var cardExpiration = DateTime.UtcNow.AddYears(1); - var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration); - var @fakeEvent = new OrderStartedDomainEvent(fakeOrder, "1", "fakeName", cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration); + var paymentMethodId = "pm_test_123"; + var fakeOrder = new Order("1", "fakeName", new Address(street, city, state, country, zipcode), paymentMethodId); + var @fakeEvent = new OrderStartedDomainEvent(fakeOrder, "1", "fakeName", paymentMethodId); var expectedResult = 1; //Act