From 3e38b477df563e1ebc9d402bff8311fcfaee156b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Dec 2021 20:49:16 +0300 Subject: [PATCH] Implemented purchase --- .../wwwroot/client-proxies/basket-proxy.js | 8 ++++ .../wwwroot/components/basket-widget.js | 9 +++++ .../IBasketAppService.cs | 1 + .../BasketAppService.cs | 17 ++++++++- ...sketServiceApplicationAutoMapperProfile.cs | 2 + .../OrderAcceptedEto.cs | 8 ++++ .../OrderItemEto.cs | 9 +++++ .../BasketClientProxy.Generated.cs | 5 +++ .../ClientProxies/basket-generate-proxy.json | 15 ++++++++ .../OrderHandler.cs | 37 +++++++++++++++++++ 10 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderAcceptedEto.cs create mode 100644 services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderItemEto.cs create mode 100644 services/catalog/src/EShopOnAbp.CatalogService.Domain/OrderHandler.cs diff --git a/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/client-proxies/basket-proxy.js b/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/client-proxies/basket-proxy.js index 062b30fa..c3877617 100644 --- a/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/client-proxies/basket-proxy.js +++ b/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/client-proxies/basket-proxy.js @@ -33,6 +33,14 @@ }, ajaxParams)); }; + eShopOnAbp.basketService.basket.purchase = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/basket/basket/purchase', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + })(); })(); diff --git a/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/components/basket-widget.js b/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/components/basket-widget.js index 8911b43a..f709fc65 100644 --- a/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/components/basket-widget.js +++ b/apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/components/basket-widget.js @@ -16,6 +16,15 @@ abp.notify.info("Removed the product from your basket.", "Removed basket item"); }); }); + + $wrapper + .find('.basket-purchase-button') + .click(function(){ + eShopOnAbp.basketService.basket.purchase().then(function(){ + widgetManager.refresh(); + abp.notify.info("Thank you for the payment!", "Purchase completed!"); + }); + }); }; return { diff --git a/services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs b/services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs index 29efd077..00266aa7 100644 --- a/services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs +++ b/services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs @@ -8,4 +8,5 @@ public interface IBasketAppService : IApplicationService Task GetAsync(); Task AddProductAsync(AddProductDto input); Task RemoveProductAsync(RemoveProductDto input); + Task PurchaseAsync(); } \ No newline at end of file diff --git a/services/basket/src/EShopOnAbp.BasketService.Application/BasketAppService.cs b/services/basket/src/EShopOnAbp.BasketService.Application/BasketAppService.cs index 71fa38d9..76d77784 100644 --- a/services/basket/src/EShopOnAbp.BasketService.Application/BasketAppService.cs +++ b/services/basket/src/EShopOnAbp.BasketService.Application/BasketAppService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Volo.Abp.Users; using EShopOnAbp.CatalogService.Products; using Volo.Abp; +using Volo.Abp.EventBus.Distributed; namespace EShopOnAbp.BasketService; @@ -14,13 +15,16 @@ public class BasketAppService : BasketServiceAppService, IBasketAppService { private readonly IBasketRepository _basketRepository; private readonly IBasketProductService _basketProductService; + private readonly IDistributedEventBus _distributedEventBus; public BasketAppService( IBasketRepository basketRepository, - IBasketProductService basketProductService) + IBasketProductService basketProductService, + IDistributedEventBus distributedEventBus) { _basketRepository = basketRepository; _basketProductService = basketProductService; + _distributedEventBus = distributedEventBus; } public async Task GetAsync() @@ -57,7 +61,16 @@ public class BasketAppService : BasketServiceAppService, IBasketAppService return await GetBasketDtoAsync(basket); } - + + public async Task PurchaseAsync() + { + var basket = await _basketRepository.GetAsync(CurrentUser.GetId()); + var orderAcceptedEto = ObjectMapper.Map(basket); + await _distributedEventBus.PublishAsync(orderAcceptedEto); + basket.Clear(); + await _basketRepository.UpdateAsync(basket); + } + private async Task GetBasketDtoAsync(Basket basket) { var products = new Dictionary(); diff --git a/services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs b/services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs index 7d781826..1f64020d 100644 --- a/services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs +++ b/services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs @@ -8,6 +8,8 @@ namespace EShopOnAbp.BasketService public BasketServiceApplicationAutoMapperProfile() { CreateMap(); + CreateMap(); + CreateMap(); } } } diff --git a/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderAcceptedEto.cs b/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderAcceptedEto.cs new file mode 100644 index 00000000..56ad03b4 --- /dev/null +++ b/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderAcceptedEto.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace EShopOnAbp.BasketService; + +public class OrderAcceptedEto +{ + public List Items { get; set; } +} \ No newline at end of file diff --git a/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderItemEto.cs b/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderItemEto.cs new file mode 100644 index 00000000..16cfa7e6 --- /dev/null +++ b/services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderItemEto.cs @@ -0,0 +1,9 @@ +using System; + +namespace EShopOnAbp.BasketService; + +public class OrderItemEto +{ + public Guid ProductId { get; set; } + public int Count { get; set; } +} \ No newline at end of file diff --git a/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/BasketClientProxy.Generated.cs b/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/BasketClientProxy.Generated.cs index 3575940b..014328ed 100644 --- a/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/BasketClientProxy.Generated.cs +++ b/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/BasketClientProxy.Generated.cs @@ -35,5 +35,10 @@ namespace EShopOnAbp.BasketService.ClientProxies { typeof(RemoveProductDto), input } }); } + + public virtual async Task PurchaseAsync() + { + await RequestAsync(nameof(PurchaseAsync)); + } } } diff --git a/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/basket-generate-proxy.json b/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/basket-generate-proxy.json index 6b22bfa7..c6f742a4 100644 --- a/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/basket-generate-proxy.json +++ b/services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/basket-generate-proxy.json @@ -123,6 +123,21 @@ }, "allowAnonymous": false, "implementFrom": "EShopOnAbp.BasketService.IBasketAppService" + }, + "PurchaseAsync": { + "uniqueName": "PurchaseAsync", + "name": "PurchaseAsync", + "httpMethod": "POST", + "url": "api/basket/basket/purchase", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "EShopOnAbp.BasketService.IBasketAppService" } } } diff --git a/services/catalog/src/EShopOnAbp.CatalogService.Domain/OrderHandler.cs b/services/catalog/src/EShopOnAbp.CatalogService.Domain/OrderHandler.cs new file mode 100644 index 00000000..c2f08b40 --- /dev/null +++ b/services/catalog/src/EShopOnAbp.CatalogService.Domain/OrderHandler.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using EShopOnAbp.BasketService; +using EShopOnAbp.CatalogService.Products; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Uow; + +namespace EShopOnAbp.CatalogService; + +public class OrderHandler : IDistributedEventHandler, ITransientDependency +{ + private readonly IRepository _productRepository; + + public OrderHandler(IRepository productRepository) + { + _productRepository = productRepository; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(OrderAcceptedEto eventData) + { + foreach (var orderItemEto in eventData.Items) + { + var product = await _productRepository.FindAsync(orderItemEto.ProductId); + if (product == null) + { + continue; + } + + var remainingStockCount = product.StockCount - orderItemEto.Count; + product.SetStockCount(remainingStockCount); + await _productRepository.UpdateAsync(product); + } + } +} \ No newline at end of file