From a6c3014dd927873064a3bee5835dc63c3b7fcb5a Mon Sep 17 00:00:00 2001 From: Eduardo Pires Date: Fri, 1 Apr 2022 00:36:13 -0300 Subject: [PATCH] fix: Melhorias --- .../Configuration/SwaggerConfig.cs | Bin 4386 -> 4392 bytes .../Application/DTO/VoucherDTO.cs | Bin 578 -> 564 bytes .../Application/Queries/VoucherQueries.cs | Bin 2214 -> 2200 bytes .../DependencyInjectionConfig.cs | 1 + .../DevStore.ShoppingCart.API/Program.cs | 185 +----------------- .../ShoppingCartIntegrationHandler.cs | 3 +- .../DevStore.ShoppingCart.API/ShoppingCart.cs | 185 ++++++++++++++++++ .../Controllers/ShoppingCartController.cs | Bin 4992 -> 4984 bytes .../DevStore.WebApp.MVC.csproj | Bin 3376 -> 3526 bytes .../Services/CheckoutBffService.cs | Bin 11766 -> 11752 bytes .../Services/CustomerService.cs | Bin 3146 -> 3144 bytes .../DevStore.WebApp.MVC/Services/Service.cs | Bin 2982 -> 2980 bytes .../Views/Order/_NewAddress.cshtml | Bin 7302 -> 7222 bytes .../Views/ShoppingCart/Index.cshtml | Bin 27942 -> 27938 bytes .../DevStore.WebApp.MVC/wwwroot/js/payment.js | 6 +- .../wwwroot/js/payment.min.js | 2 +- .../DevStore.WebApp.MVC/wwwroot/js/site.js | 67 +------ 17 files changed, 202 insertions(+), 247 deletions(-) create mode 100644 src/services/DevStore.ShoppingCart.API/ShoppingCart.cs diff --git a/src/api-gateways/DevStore.Bff.Checkout/Configuration/SwaggerConfig.cs b/src/api-gateways/DevStore.Bff.Checkout/Configuration/SwaggerConfig.cs index 5f2ce2aaa390e8d544442d9852a504405cecbab8..fe32063996640cfd8d34e1adbf66aa0fc80453dd 100644 GIT binary patch delta 38 scmZ3av_fgaFJ{RMhE#@RhHQp>hEj$S1_cHu1~(v7V9?#n%Oc7P0L(84X#fBK delta 32 ncmZ3Xv`A^gFJ|FBnaLfDLX*uH`B)Pf(iu`G3o>a==3~_0cVWn6C}v1z$Y&^J$YUshii=G= cBfR!cfUj05;4J0Q*xHH2?qr delta 99 zcmdnOa)@QZnaL9vMOZT#(i!q6ehi#=kB_yKA(0^m$d(KPF&Oe0iWpoNQW=UFl7Z|z dh7yoMd-+T-Q-L9bA(Np1D1o6wbFvN-2LR{`8@B)e diff --git a/src/services/DevStore.Orders.API/Application/Queries/VoucherQueries.cs b/src/services/DevStore.Orders.API/Application/Queries/VoucherQueries.cs index d5ae7551d8959bc52f81a64f70d27d39f74a4854..71cf913d1420ff1a65326aeac5c37f665fe7f230 100644 GIT binary patch delta 59 zcmZ1`I74v53pU2o$%Y)#lR4P+CKs_wO!i|hU`=F5XMl*_W4GdWVaQ}CW=LkpXDDUJ KV<-WtE(HMnbr1Xi delta 93 zcmbOsxJ+=v3pUnFhIEGf$@|%*C$q5YiH9&`G88c6Gq^CMG88i;16g?tB|v#k_CnTD ZhD3%Opvq9mFc1qUSA?MsWR4w26aaiM7r_7k diff --git a/src/services/DevStore.ShoppingCart.API/Configuration/DependencyInjectionConfig.cs b/src/services/DevStore.ShoppingCart.API/Configuration/DependencyInjectionConfig.cs index 2a23a61..38e0cf8 100644 --- a/src/services/DevStore.ShoppingCart.API/Configuration/DependencyInjectionConfig.cs +++ b/src/services/DevStore.ShoppingCart.API/Configuration/DependencyInjectionConfig.cs @@ -10,6 +10,7 @@ public static void RegisterServices(this IServiceCollection services) services.AddSingleton(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } } \ No newline at end of file diff --git a/src/services/DevStore.ShoppingCart.API/Program.cs b/src/services/DevStore.ShoppingCart.API/Program.cs index 40e2c59..8abe9e5 100644 --- a/src/services/DevStore.ShoppingCart.API/Program.cs +++ b/src/services/DevStore.ShoppingCart.API/Program.cs @@ -1,10 +1,8 @@ +using DevStore.ShoppingCart.API; using DevStore.ShoppingCart.API.Configuration; -using DevStore.ShoppingCart.API.Data; using DevStore.ShoppingCart.API.Model; using DevStore.WebAPI.Core.Identity; -using DevStore.WebAPI.Core.User; using Microsoft.AspNetCore.Authorization; -using Microsoft.EntityFrameworkCore; #region Builder Configuration @@ -38,8 +36,6 @@ #region Configure Pipeline -var Errors = new List(); - app.UseSwaggerConfiguration(); app.UseApiConfiguration(app.Environment); @@ -57,30 +53,13 @@ void MapActions(WebApplication app) { app.MapGet("/shopping-cart", [Authorize] async ( - ShoppingCartContext context, - IAspNetUser user) => - - await GetShoppingCartClient(context, user) ?? new CustomerShoppingCart()) + ShoppingCart cart) => await cart.GetShoppingCart()) .WithName("GetShoppingCart") .WithTags("ShoppingCart"); app.MapPost("/shopping-cart", [Authorize] async ( - ShoppingCartContext context, - IAspNetUser user, - CartItem item) => - { - var shoppingCart = await GetShoppingCartClient(context, user); - - if (shoppingCart == null) - ManageNewCart(context, user, item); - else - ManageCart(context, shoppingCart, item); - - if (Errors.Any()) return CustomResponse(); - - await Persist(context); - return CustomResponse(); - }) + ShoppingCart cart, + CartItem item) => await cart.AddItem(item)) .ProducesValidationProblem() .Produces(StatusCodes.Status201Created) .Produces(StatusCodes.Status400BadRequest) @@ -88,26 +67,9 @@ await GetShoppingCartClient(context, user) ?? new CustomerShoppingCart()) .WithTags("ShoppingCart"); app.MapPut("/shopping-cart/{productId}", [Authorize] async ( - ShoppingCartContext context, - IAspNetUser user, + ShoppingCart cart, Guid productId, - CartItem item) => - { - var shoppingCart = await GetShoppingCartClient(context, user); - var shoppingCartItem = await GetValidItem(context, productId, shoppingCart, item); - if (shoppingCartItem == null) return CustomResponse(); - - shoppingCart.UpdateUnit(shoppingCartItem, item.Quantity); - - ValidateShoppingCart(shoppingCart); - if (Errors.Any()) return CustomResponse(); - - context.CartItems.Update(shoppingCartItem); - context.CustomerShoppingCart.Update(shoppingCart); - - await Persist(context); - return CustomResponse(); - }) + CartItem item) => await cart.UpdateItem(productId, item)) .ProducesValidationProblem() .Produces(StatusCodes.Status204NoContent) .Produces(StatusCodes.Status400BadRequest) @@ -115,26 +77,8 @@ await GetShoppingCartClient(context, user) ?? new CustomerShoppingCart()) .WithTags("ShoppingCart"); app.MapDelete("/shopping-cart/{productId}", [Authorize] async ( - ShoppingCartContext context, - IAspNetUser user, - Guid productId) => - { - var cart = await GetShoppingCartClient(context, user); - - var item = await GetValidItem(context, productId, cart); - if (item == null) return CustomResponse(); - - ValidateShoppingCart(cart); - if (Errors.Any()) return CustomResponse(); - - cart.RemoveItem(item); - - context.CartItems.Remove(item); - context.CustomerShoppingCart.Update(cart); - - await Persist(context); - return CustomResponse(); - }) + ShoppingCart cart, + Guid productId) => await cart.RemoveItem(productId)) .ProducesValidationProblem() .Produces(StatusCodes.Status204NoContent) .Produces(StatusCodes.Status400BadRequest) @@ -143,19 +87,8 @@ await GetShoppingCartClient(context, user) ?? new CustomerShoppingCart()) .WithTags("ShoppingCart"); app.MapPost("/shopping-cart/apply-voucher", [Authorize] async ( - ShoppingCartContext context, - IAspNetUser user, - Voucher voucher) => - { - var cart = await GetShoppingCartClient(context, user); - - cart.ApplyVoucher(voucher); - - context.CustomerShoppingCart.Update(cart); - - await Persist(context); - return CustomResponse(); - }) + ShoppingCart cart, + Voucher voucher) => await cart.ApplyVoucher(voucher)) .ProducesValidationProblem() .Produces(StatusCodes.Status204NoContent) .Produces(StatusCodes.Status400BadRequest) @@ -163,102 +96,4 @@ await GetShoppingCartClient(context, user) ?? new CustomerShoppingCart()) .WithTags("ShoppingCart"); } -#endregion - -#region Action Methods - -async Task GetShoppingCartClient(ShoppingCartContext context, IAspNetUser user) -{ - return await context.CustomerShoppingCart - .Include(c => c.Items) - .FirstOrDefaultAsync(c => c.CustomerId == user.GetUserId()); -} - -void ManageNewCart(ShoppingCartContext context, IAspNetUser user, CartItem item) -{ - var cart = new CustomerShoppingCart(user.GetUserId()); - cart.AddItem(item); - - ValidateShoppingCart(cart); - context.CustomerShoppingCart.Add(cart); -} - -void ManageCart(ShoppingCartContext context, CustomerShoppingCart cart, CartItem item) -{ - var savedItem = cart.HasItem(item); - - cart.AddItem(item); - ValidateShoppingCart(cart); - - if (savedItem) - { - context.CartItems.Update(cart.GetProductById(item.ProductId)); - } - else - { - context.CartItems.Add(item); - } - - context.CustomerShoppingCart.Update(cart); -} - -async Task GetValidItem(ShoppingCartContext context, Guid productId, CustomerShoppingCart cart, CartItem item = null) -{ - if (item != null && productId != item.ProductId) - { - AddErrorToStack("Current item is not the same sent item"); - return null; - } - - if (cart == null) - { - AddErrorToStack("Shopping cart not found"); - return null; - } - - var cartItem = await context.CartItems - .FirstOrDefaultAsync(i => i.ShoppingCartId == cart.Id && i.ProductId == productId); - - if (cartItem == null || !cart.HasItem(cartItem)) - { - AddErrorToStack("The item is not in cart"); - return null; - } - - return cartItem; -} - -async Task Persist(ShoppingCartContext context) -{ - var result = await context.SaveChangesAsync(); - if (result <= 0) AddErrorToStack("Error saving data"); -} - -bool ValidateShoppingCart(CustomerShoppingCart shoppingCart) -{ - if (shoppingCart.IsValid()) return true; - - shoppingCart.ValidationResult.Errors.ToList().ForEach(e => AddErrorToStack(e.ErrorMessage)); - return false; -} - -void AddErrorToStack(string error) -{ - Errors.Add(error); -} - -IResult CustomResponse(object result = null) -{ - if (!Errors.Any()) - { - return Results.Ok(result); - } - - return Results.BadRequest(Results.ValidationProblem( - new Dictionary - { - { "Messages", Errors.ToArray() } - })); -} - #endregion \ No newline at end of file diff --git a/src/services/DevStore.ShoppingCart.API/Services/ShoppingCartIntegrationHandler.cs b/src/services/DevStore.ShoppingCart.API/Services/ShoppingCartIntegrationHandler.cs index 9233e27..7ef9ecc 100644 --- a/src/services/DevStore.ShoppingCart.API/Services/ShoppingCartIntegrationHandler.cs +++ b/src/services/DevStore.ShoppingCart.API/Services/ShoppingCartIntegrationHandler.cs @@ -1,5 +1,6 @@ using DevStore.Core.Messages.Integration; using DevStore.MessageBus; +using DevStore.ShoppingCart.API.Data; using Microsoft.EntityFrameworkCore; namespace DevStore.ShoppingCart.API.Services @@ -29,7 +30,7 @@ private void SetSubscribers() private async Task RemoveShoppingCart(OrderDoneIntegrationEvent message) { using var scope = _serviceProvider.CreateScope(); - var context = scope.ServiceProvider.GetRequiredService(); + var context = scope.ServiceProvider.GetRequiredService(); var shoppingCart = await context.CustomerShoppingCart .FirstOrDefaultAsync(c => c.CustomerId == message.CustomerId); diff --git a/src/services/DevStore.ShoppingCart.API/ShoppingCart.cs b/src/services/DevStore.ShoppingCart.API/ShoppingCart.cs new file mode 100644 index 0000000..ffb0a10 --- /dev/null +++ b/src/services/DevStore.ShoppingCart.API/ShoppingCart.cs @@ -0,0 +1,185 @@ +using DevStore.ShoppingCart.API.Data; +using DevStore.ShoppingCart.API.Model; +using DevStore.WebAPI.Core.User; +using Microsoft.EntityFrameworkCore; + +namespace DevStore.ShoppingCart.API +{ + public class ShoppingCart + { + private readonly ShoppingCartContext _context; + private readonly IAspNetUser _user; + + private ICollection _errors = new List(); + + public ShoppingCart(ShoppingCartContext context, IAspNetUser user) + { + _context = context; + _user = user; + } + + public async Task GetShoppingCart() + { + return await GetShoppingCartClient() ?? new CustomerShoppingCart(); + } + + public async Task AddItem(CartItem item) + { + var shoppingCart = await GetShoppingCartClient(); + + if (shoppingCart == null) + ManageNewCart(item); + else + ManageCart(shoppingCart, item); + + if (_errors.Any()) return CustomResponse(); + + await Persist(); + return CustomResponse(); + } + + public async Task UpdateItem(Guid productId, CartItem item) + { + var shoppingCart = await GetShoppingCartClient(); + var shoppingCartItem = await GetValidItem(productId, shoppingCart, item); + if (shoppingCartItem == null) return CustomResponse(); + + shoppingCart.UpdateUnit(shoppingCartItem, item.Quantity); + + ValidateShoppingCart(shoppingCart); + if (_errors.Any()) return CustomResponse(); + + _context.CartItems.Update(shoppingCartItem); + _context.CustomerShoppingCart.Update(shoppingCart); + + await Persist(); + return CustomResponse(); + } + + public async Task RemoveItem(Guid productId) + { + var cart = await GetShoppingCartClient(); + + var item = await GetValidItem(productId, cart); + if (item == null) return CustomResponse(); + + ValidateShoppingCart(cart); + if (_errors.Any()) return CustomResponse(); + + cart.RemoveItem(item); + + _context.CartItems.Remove(item); + _context.CustomerShoppingCart.Update(cart); + + await Persist(); + return CustomResponse(); + } + + public async Task ApplyVoucher(Voucher voucher) + { + var cart = await GetShoppingCartClient(); + + cart.ApplyVoucher(voucher); + + _context.CustomerShoppingCart.Update(cart); + + await Persist(); + return CustomResponse(); + } + + + async Task GetShoppingCartClient() + { + return await _context.CustomerShoppingCart + .Include(c => c.Items) + .FirstOrDefaultAsync(c => c.CustomerId == _user.GetUserId()); + } + + void ManageNewCart(CartItem item) + { + var cart = new CustomerShoppingCart(_user.GetUserId()); + cart.AddItem(item); + + ValidateShoppingCart(cart); + _context.CustomerShoppingCart.Add(cart); + } + + void ManageCart(CustomerShoppingCart cart, CartItem item) + { + var savedItem = cart.HasItem(item); + + cart.AddItem(item); + ValidateShoppingCart(cart); + + if (savedItem) + { + _context.CartItems.Update(cart.GetProductById(item.ProductId)); + } + else + { + _context.CartItems.Add(item); + } + + _context.CustomerShoppingCart.Update(cart); + } + + async Task GetValidItem(Guid productId, CustomerShoppingCart cart, CartItem item = null) + { + if (item != null && productId != item.ProductId) + { + AddErrorToStack("Current item is not the same sent item"); + return null; + } + + if (cart == null) + { + AddErrorToStack("Shopping cart not found"); + return null; + } + + var cartItem = await _context.CartItems + .FirstOrDefaultAsync(i => i.ShoppingCartId == cart.Id && i.ProductId == productId); + + if (cartItem == null || !cart.HasItem(cartItem)) + { + AddErrorToStack("The item is not in cart"); + return null; + } + + return cartItem; + } + + async Task Persist() + { + var result = await _context.SaveChangesAsync(); + if (result <= 0) AddErrorToStack("Error saving data"); + } + + bool ValidateShoppingCart(CustomerShoppingCart shoppingCart) + { + if (shoppingCart.IsValid()) return true; + + shoppingCart.ValidationResult.Errors.ToList().ForEach(e => AddErrorToStack(e.ErrorMessage)); + return false; + } + + void AddErrorToStack(string error) + { + _errors.Add(error); + } + + IResult CustomResponse(object result = null) + { + if (!_errors.Any()) + { + return Results.Ok(result); + } + + return Results.BadRequest(Results.ValidationProblem( + new Dictionary + { + { "Messages", _errors.ToArray() } + })); + } + } +} diff --git a/src/web/DevStore.WebApp.MVC/Controllers/ShoppingCartController.cs b/src/web/DevStore.WebApp.MVC/Controllers/ShoppingCartController.cs index 6ce78bce3bc1905f686eeab9a652695db26659ab..edeb824e0421fa25e628296c4e886695f9c40af1 100644 GIT binary patch delta 24 gcmZor|Dm?QOOP>jvcKR~#?;Ll+0z*(7YGXg0B>RlJ^%m! delta 38 qcmeyN)}X$@OOQR2A)O(gL345d<1BjIeq;nWj8HyNufueapoW_tj*`8IJ+n7O*!3c;= Q7)&N7vifdLVL8JA04B%}S^xk5 delta 12 TcmX>my+LY23d`nSEN3_XBd!HW diff --git a/src/web/DevStore.WebApp.MVC/Services/CheckoutBffService.cs b/src/web/DevStore.WebApp.MVC/Services/CheckoutBffService.cs index f79dce15148b0ef6e63e3a6ed18b7eea1ce4af95..e97c32c10b1b4f318b6bf9c39f57f37e3d7c04c7 100644 GIT binary patch delta 97 zcmews{UUn94q?_(h9ZW%&HIIyGeek@_X}4}?qLntY$fr75lKja&0_N_DK$pc0)`xh Z%FU88?g&}c%{{Uq2>q&?c@$sq005GRASnO< delta 135 zcmaD6{VjUK4q^6uh9ZVMhWyQYg_kqKIFt7ZS5EF>4cTla@q-aXP=U>2^AjmGM$R0D zOon8JM24cx{4(yyYE(Bj$c7-Bq&m4lR%G%#ah1td>^761NLfuTkg%F;prW#wOX(gr E0K%;*tpET3 diff --git a/src/web/DevStore.WebApp.MVC/Services/CustomerService.cs b/src/web/DevStore.WebApp.MVC/Services/CustomerService.cs index 9fc54e92f91b239a2fe5be459c8bfeeecc19e5d1..0dca9ee042f150d7f270970b76551e3cc603b74b 100644 GIT binary patch delta 25 gcmX>laYAAP9}j0KLlHwBgFi#|OV delta 27 icmX>haY|wX9}jmvLlHwBLq3B)L-yo{OwyB$c*Fp4=Ld)Y diff --git a/src/web/DevStore.WebApp.MVC/Services/Service.cs b/src/web/DevStore.WebApp.MVC/Services/Service.cs index cb070a55f2081f2d48fc9da667c29a0be03a3591..2ecaf25348a3dc45d24f68c36a959006e9d44416 100644 GIT binary patch delta 17 YcmZ1`zC?Tj6E|xqLlHyXWKQn604i*eB{#tj8VjAfGxjTFJ8KxsDCOonuZ{LRaa*0YHRFcdLlG9)vkGAJ 0) { $("#card_number").validateCreditCard(function (e) { @@ -27,9 +26,8 @@ function CartaoCredito() { $(document).ready(function () { - CartaoCredito(); + CreditCard(); $('#card_number').mask('0000 0000 0000 0000'); $('#card_expiration').mask('00/00'); $('#card_cvv').mask('0000'); - }); diff --git a/src/web/DevStore.WebApp.MVC/wwwroot/js/payment.min.js b/src/web/DevStore.WebApp.MVC/wwwroot/js/payment.min.js index cbce812..86fa24f 100644 --- a/src/web/DevStore.WebApp.MVC/wwwroot/js/payment.min.js +++ b/src/web/DevStore.WebApp.MVC/wwwroot/js/payment.min.js @@ -1 +1 @@ -function CartaoCredito(){$("#card_number").length>0&&$("#card_number").validateCreditCard(function(n){$(this).removeClass();$(this).addClass("form-control");n.card_type!==null&&$(this).addClass(n.card_type.name);n.valid?$(this).addClass("valid"):$(this).removeClass("valid");n.length_valid&&!n.valid?$(this).addClass("invalid"):$(this).removeClass("invalid")})}$(document).ready(function(){CartaoCredito();$("#card_number").mask("0000 0000 0000 0000");$("#card_expiration").mask("00/00");$("#card_cvv").mask("0000")}); \ No newline at end of file +function CreditCard(){$("#card_number").length>0&&$("#card_number").validateCreditCard(function(n){$(this).removeClass();$(this).addClass("form-control");n.card_type!==null&&$(this).addClass(n.card_type.name);n.valid?$(this).addClass("valid"):$(this).removeClass("valid");n.length_valid&&!n.valid?$(this).addClass("invalid"):$(this).removeClass("invalid")})}$(document).ready(function(){CreditCard();$("#card_number").mask("0000 0000 0000 0000");$("#card_expiration").mask("00/00");$("#card_cvv").mask("0000")}); \ No newline at end of file diff --git a/src/web/DevStore.WebApp.MVC/wwwroot/js/site.js b/src/web/DevStore.WebApp.MVC/wwwroot/js/site.js index 4f0663c..b85e2b9 100644 --- a/src/web/DevStore.WebApp.MVC/wwwroot/js/site.js +++ b/src/web/DevStore.WebApp.MVC/wwwroot/js/site.js @@ -1,69 +1,4 @@ -function BuscaCep() { - $(document).ready(function () { - - function limpa_formulário_ZipCode() { - // Limpa valores do formulário de ZipCode. - $("#Address_StreetAddress").val(""); - $("#Address_Neighborhood").val(""); - $("#Address_City").val(""); - $("#Address_State").val(""); - } - - //Quando o campo ZipCode perde o foco. - $("#Address_ZipCode").blur(function () { - - //Nova variável "ZipCode" somente com dígitos. - var ZipCode = $(this).val().replace(/\D/g, ''); - - //Verifica se campo ZipCode possui valor informado. - if (ZipCode != "") { - - //Expressão regular para validar o ZipCode. - var validaZipCode = /^[0-9]{8}$/; - - //Valida o formato do ZipCode. - if (validaZipCode.test(ZipCode)) { - - //Preenche os campos com "..." enquanto consulta webservice. - $("#Address_StreetAddress").val("..."); - $("#Address_Neighborhood").val("..."); - $("#Address_City").val("..."); - $("#Address_State").val("..."); - - //Consulta o webservice viaZipCode.com.br/ - $.getJSON("https://viacep.com.br/ws/" + ZipCode + "/json/?callback=?", - function (dados) { - - if (!("erro" in dados)) { - //Atualiza os campos com os valores da consulta. - $("#Address_StreetAddress").val(dados.logradouro); - $("#Address_Neighborhood").val(dados.bairro); - $("#Address_City").val(dados.localidade); - $("#Address_State").val(dados.uf); - } //end if. - else { - //ZipCode pesquisado não foi encontrado. - limpa_formulário_ZipCode(); - alert("Zip Code not found."); - } - }); - } //end if. - else { - //ZipCode é inválido. - limpa_formulário_ZipCode(); - alert("Invalid Zip Code."); - } - } //end if. - else { - //ZipCode sem valor, limpa formulário. - limpa_formulário_ZipCode(); - } - }); - }); -} - - -function CartaoCredito() { +function CreditCard() { if ($("#card_number").length > 0) {