Browse Source

Implemented purchase

pull/37/head
Halil İbrahim Kalkan 5 years ago
parent
commit
3e38b477df
  1. 8
      apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/client-proxies/basket-proxy.js
  2. 9
      apps/public-web/src/EShopOnAbp.PublicWeb/wwwroot/components/basket-widget.js
  3. 1
      services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs
  4. 17
      services/basket/src/EShopOnAbp.BasketService.Application/BasketAppService.cs
  5. 2
      services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs
  6. 8
      services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderAcceptedEto.cs
  7. 9
      services/basket/src/EShopOnAbp.BasketService.Domain.Shared/OrderItemEto.cs
  8. 5
      services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/BasketClientProxy.Generated.cs
  9. 15
      services/basket/src/EShopOnAbp.BasketService.HttpApi.Client/ClientProxies/basket-generate-proxy.json
  10. 37
      services/catalog/src/EShopOnAbp.CatalogService.Domain/OrderHandler.cs

8
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));
};
})();
})();

9
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 {

1
services/basket/src/EShopOnAbp.BasketService.Application.Contracts/IBasketAppService.cs

@ -8,4 +8,5 @@ public interface IBasketAppService : IApplicationService
Task<BasketDto> GetAsync();
Task<BasketDto> AddProductAsync(AddProductDto input);
Task<BasketDto> RemoveProductAsync(RemoveProductDto input);
Task PurchaseAsync();
}

17
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<BasketDto> 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, OrderAcceptedEto>(basket);
await _distributedEventBus.PublishAsync(orderAcceptedEto);
basket.Clear();
await _basketRepository.UpdateAsync(basket);
}
private async Task<BasketDto> GetBasketDtoAsync(Basket basket)
{
var products = new Dictionary<Guid, ProductDto>();

2
services/basket/src/EShopOnAbp.BasketService.Application/BasketServiceApplicationAutoMapperProfile.cs

@ -8,6 +8,8 @@ namespace EShopOnAbp.BasketService
public BasketServiceApplicationAutoMapperProfile()
{
CreateMap<ProductEto, ProductDto>();
CreateMap<Basket, OrderAcceptedEto>();
CreateMap<BasketItem, OrderItemEto>();
}
}
}

8
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<OrderItemEto> Items { get; set; }
}

9
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; }
}

5
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));
}
}
}

15
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"
}
}
}

37
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<OrderAcceptedEto>, ITransientDependency
{
private readonly IRepository<Product, Guid> _productRepository;
public OrderHandler(IRepository<Product, Guid> 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);
}
}
}
Loading…
Cancel
Save