From fde6728b1bf8667dfbd2ad3fad2fef319531763e Mon Sep 17 00:00:00 2001 From: gdlcf88 Date: Fri, 4 Sep 2020 02:11:27 +0800 Subject: [PATCH] Remove IPurchasableChecker and introduce OrderCreationAuthorizationHandler Close #79 Remove CreatePaymentEto in PaymentCreationResource Fix BasicPaymentCreationAuthorizationHandler --- .../Orders/Orders/Dtos/CreateOrderLineDto.cs | 1 + .../Orders/EShopOrdersApplicationModule.cs | 9 ++- .../BasicOrderCreationAuthorizationHandler.cs | 53 ++++++++++++++++++ .../Orders/BasicPurchasableCheckProvider.cs | 55 ------------------- .../Orders/Orders/CurrencyIsLimitException.cs | 14 +++++ .../EShop/Orders/Orders/INewOrderGenerator.cs | 3 +- .../Orders/IPurchasableCheckProvider.cs | 14 ----- .../Orders/Orders/IPurchasableChecker.cs | 14 ----- .../EShop/Orders/Orders/NewOrderGenerator.cs | 44 ++++++++------- .../Orders/Orders/NotPurchasableException.cs | 13 ----- .../EShop/Orders/Orders/OrderAppService.cs | 16 +++--- .../OrderCreationAuthorizationHandler.cs | 22 ++++++++ .../Orders/Orders/OrderCreationResource.cs | 14 +++++ .../EShop/Orders/Orders/OrderOperation.cs | 10 ++++ .../OrderOperationAuthorizationRequirement.cs | 14 +++++ .../EShop/Orders/Orders/PurchasableChecker.cs | 31 ----------- ...asicPaymentCreationAuthorizationHandler.cs | 3 + .../Payments/Payments/PaymentAppService.cs | 17 +++--- .../Payments/PaymentCreationResource.cs | 2 - 19 files changed, 181 insertions(+), 168 deletions(-) create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicOrderCreationAuthorizationHandler.cs delete mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicPurchasableCheckProvider.cs create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/CurrencyIsLimitException.cs delete mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableCheckProvider.cs delete mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableChecker.cs delete mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NotPurchasableException.cs create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationAuthorizationHandler.cs create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationResource.cs create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperation.cs create mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperationAuthorizationRequirement.cs delete mode 100644 modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/PurchasableChecker.cs diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CreateOrderLineDto.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CreateOrderLineDto.cs index 5cd072f4..f9e1725b 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CreateOrderLineDto.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CreateOrderLineDto.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using Volo.Abp.Data; namespace EasyAbp.EShop.Orders.Orders.Dtos { diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs index 44915df7..6f6cad8a 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs @@ -1,5 +1,7 @@ -using EasyAbp.EShop.Products; +using EasyAbp.EShop.Orders.Orders; +using EasyAbp.EShop.Products; using EasyAbp.EShop.Stores; +using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; @@ -18,6 +20,11 @@ namespace EasyAbp.EShop.Orders )] public class EShopOrdersApplicationModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddSingleton(); + } + public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAutoMapperObjectMapper(); diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicOrderCreationAuthorizationHandler.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicOrderCreationAuthorizationHandler.cs new file mode 100644 index 00000000..441e79de --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicOrderCreationAuthorizationHandler.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using EasyAbp.EShop.Orders.Orders.Dtos; +using EasyAbp.EShop.Products.Products; +using EasyAbp.EShop.Products.Products.Dtos; +using Microsoft.AspNetCore.Authorization; + +namespace EasyAbp.EShop.Orders.Orders +{ + public class BasicOrderCreationAuthorizationHandler : OrderCreationAuthorizationHandler + { + protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context, + OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource) + { + if (!await IsProductsPublishedAsync(resource.Input, resource.ProductDictionary)) + { + context.Fail(); + return; + } + + if (!await IsInventoriesSufficientAsync(resource.Input, resource.ProductDictionary)) + { + context.Fail(); + return; + } + + context.Succeed(requirement); + } + + protected virtual Task IsProductsPublishedAsync(CreateOrderDto input, + Dictionary productDictionary) + { + return Task.FromResult( + input.OrderLines.Select(dto => dto.ProductId).Distinct().ToArray() + .All(productId => productDictionary[productId].IsPublished) + ); + } + + protected virtual Task IsInventoriesSufficientAsync(CreateOrderDto input, + Dictionary productDictionary) + { + return Task.FromResult( + !(from orderLine in input.OrderLines + let product = productDictionary[orderLine.ProductId] + let inventory = product.ProductSkus.Single(sku => sku.Id == orderLine.ProductSkuId).Inventory + where product.InventoryStrategy != InventoryStrategy.NoNeed && inventory < orderLine.Quantity + select orderLine).Any() + ); + } + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicPurchasableCheckProvider.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicPurchasableCheckProvider.cs deleted file mode 100644 index e0da78f4..00000000 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/BasicPurchasableCheckProvider.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using EasyAbp.EShop.Orders.Orders.Dtos; -using EasyAbp.EShop.Products.Products; -using EasyAbp.EShop.Products.Products.Dtos; -using Volo.Abp.DependencyInjection; - -namespace EasyAbp.EShop.Orders.Orders -{ - public class BasicPurchasableCheckProvider : IPurchasableCheckProvider, ITransientDependency - { - public virtual async Task CheckAsync(CreateOrderDto input, Dictionary productDict, - Dictionary orderExtraProperties) - { - await CheckProductsPublishedAsync(input, productDict); - - await CheckInventoriesSufficientAsync(input, productDict); - } - - protected virtual Task CheckProductsPublishedAsync(CreateOrderDto input, - Dictionary productDict) - { - foreach (var productId in input.OrderLines.Select(dto => dto.ProductId).Distinct().ToArray()) - { - if (!productDict[productId].IsPublished) - { - throw new NotPurchasableException(productId, null, "Unpublished project"); - } - } - - return Task.CompletedTask; - } - - protected virtual Task CheckInventoriesSufficientAsync(CreateOrderDto input, - Dictionary productDict) - { - foreach (var orderLine in input.OrderLines) - { - var product = productDict[orderLine.ProductId]; - var inventory = product.ProductSkus - .Single(sku => sku.Id == orderLine.ProductSkuId).Inventory; - - if (product.InventoryStrategy != InventoryStrategy.NoNeed && inventory < orderLine.Quantity) - { - throw new NotPurchasableException(orderLine.ProductId, orderLine.ProductSkuId, - "Insufficient inventory"); - } - } - - return Task.CompletedTask; - } - } -} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/CurrencyIsLimitException.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/CurrencyIsLimitException.cs new file mode 100644 index 00000000..98a54742 --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/CurrencyIsLimitException.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp; + +namespace EasyAbp.EShop.Orders.Orders +{ + public class CurrencyIsLimitException : BusinessException + { + public CurrencyIsLimitException(string expectedCurrency) : base( + "CurrencyIsLimit", + $"Only the specified currency {expectedCurrency} is allowed.") + { + } + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/INewOrderGenerator.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/INewOrderGenerator.cs index fe653e10..efbbd6b1 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/INewOrderGenerator.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/INewOrderGenerator.cs @@ -8,7 +8,6 @@ namespace EasyAbp.EShop.Orders.Orders { public interface INewOrderGenerator { - Task GenerateAsync(CreateOrderDto input, Dictionary productDict, - Dictionary orderExtraProperties); + Task GenerateAsync(CreateOrderDto input, Dictionary productDict); } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableCheckProvider.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableCheckProvider.cs deleted file mode 100644 index 98b3c1d1..00000000 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableCheckProvider.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using EasyAbp.EShop.Orders.Orders.Dtos; -using EasyAbp.EShop.Products.Products.Dtos; - -namespace EasyAbp.EShop.Orders.Orders -{ - public interface IPurchasableCheckProvider - { - Task CheckAsync(CreateOrderDto input, Dictionary productDict, - Dictionary orderExtraProperties); - } -} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableChecker.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableChecker.cs deleted file mode 100644 index 572cf8a8..00000000 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IPurchasableChecker.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using EasyAbp.EShop.Orders.Orders.Dtos; -using EasyAbp.EShop.Products.Products.Dtos; - -namespace EasyAbp.EShop.Orders.Orders -{ - public interface IPurchasableChecker - { - Task CheckAsync(CreateOrderDto input, Dictionary productDict, - Dictionary orderExtraProperties); - } -} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs index 59c47ac5..b430b2c9 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs @@ -1,17 +1,14 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using EasyAbp.EShop.Orders.Orders.Dtos; -using EasyAbp.EShop.Products.ProductInventories; using EasyAbp.EShop.Products.Products; using EasyAbp.EShop.Products.Products.Dtos; -using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; -using Volo.Abp.Json; using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectExtending; using Volo.Abp.Users; namespace EasyAbp.EShop.Orders.Orders @@ -38,13 +35,20 @@ namespace EasyAbp.EShop.Orders.Orders _productSkuDescriptionProvider = productSkuDescriptionProvider; } - public virtual async Task GenerateAsync(CreateOrderDto input, Dictionary productDict, Dictionary orderExtraProperties) + public virtual async Task GenerateAsync(CreateOrderDto input, Dictionary productDict) { var orderLines = new List(); - foreach (var orderLine in input.OrderLines) + foreach (var inputOrderLine in input.OrderLines) { - orderLines.Add(await GenerateOrderLineAsync(orderLine, productDict, orderExtraProperties)); + orderLines.Add(await GenerateOrderLineAsync(input, inputOrderLine, productDict)); + } + + var storeCurrency = await GetStoreCurrencyAsync(input.StoreId); + + if (orderLines.Any(x => x.Currency != storeCurrency)) + { + throw new CurrencyIsLimitException(storeCurrency); } var productTotalPrice = orderLines.Select(x => x.TotalPrice).Sum(); @@ -58,17 +62,14 @@ namespace EasyAbp.EShop.Orders.Orders tenantId: _currentTenant.Id, storeId: input.StoreId, customerUserId: _currentUser.GetId(), - currency: await GetStoreCurrencyAsync(input.StoreId), + currency: storeCurrency, productTotalPrice: productTotalPrice, totalDiscount: totalDiscount, totalPrice: totalPrice, actualTotalPrice: totalPrice - totalDiscount, customerRemark: input.CustomerRemark); - - foreach (var orderExtraProperty in orderExtraProperties) - { - order.SetProperty(orderExtraProperty.Key, orderExtraProperty.Value); - } + + input.MapExtraPropertiesTo(order, MappingPropertyDefinitionChecks.Destination); order.SetOrderLines(orderLines); @@ -77,18 +78,19 @@ namespace EasyAbp.EShop.Orders.Orders return order; } - protected virtual async Task GenerateOrderLineAsync(CreateOrderLineDto input, Dictionary productDict, Dictionary orderExtraProperties) + protected virtual async Task GenerateOrderLineAsync(CreateOrderDto input, + CreateOrderLineDto inputOrderLine, Dictionary productDict) { - var product = productDict[input.ProductId]; - var productSku = product.GetSkuById(input.ProductSkuId); + var product = productDict[inputOrderLine.ProductId]; + var productSku = product.GetSkuById(inputOrderLine.ProductSkuId); - if (!input.Quantity.IsBetween(productSku.OrderMinQuantity, productSku.OrderMaxQuantity)) + if (!inputOrderLine.Quantity.IsBetween(productSku.OrderMinQuantity, productSku.OrderMaxQuantity)) { - throw new OrderLineInvalidQuantityException(product.Id, productSku.Id, input.Quantity); + throw new OrderLineInvalidQuantityException(product.Id, productSku.Id, inputOrderLine.Quantity); } - - var totalPrice = productSku.Price * input.Quantity; + var totalPrice = productSku.Price * inputOrderLine.Quantity; + return new OrderLine( id: _guidGenerator.Create(), productId: product.Id, @@ -107,7 +109,7 @@ namespace EasyAbp.EShop.Orders.Orders totalPrice: totalPrice, totalDiscount: 0, actualTotalPrice: totalPrice, - quantity: input.Quantity + quantity: inputOrderLine.Quantity ); } diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NotPurchasableException.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NotPurchasableException.cs deleted file mode 100644 index 31536c98..00000000 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NotPurchasableException.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using Volo.Abp; - -namespace EasyAbp.EShop.Orders.Orders -{ - public class NotPurchasableException : BusinessException - { - public NotPurchasableException(Guid productId, Guid? productSkuId, string reason) : base( - message: $"Product {productId} (SKU: {productSkuId}) cannot be purchased, the reason is: {reason}") - { - } - } -} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs index 0ec98b00..751f6f2c 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs @@ -25,20 +25,17 @@ namespace EasyAbp.EShop.Orders.Orders private readonly INewOrderGenerator _newOrderGenerator; private readonly IProductAppService _productAppService; - private readonly IPurchasableChecker _purchasableChecker; private readonly IOrderManager _orderManager; private readonly IOrderRepository _repository; public OrderAppService( INewOrderGenerator newOrderGenerator, IProductAppService productAppService, - IPurchasableChecker purchasableChecker, IOrderManager orderManager, IOrderRepository repository) : base(repository) { _newOrderGenerator = newOrderGenerator; _productAppService = productAppService; - _purchasableChecker = purchasableChecker; _orderManager = orderManager; _repository = repository; } @@ -91,11 +88,16 @@ namespace EasyAbp.EShop.Orders.Orders var productDict = await GetProductDictionaryAsync(input.OrderLines.Select(dto => dto.ProductId).ToList(), input.StoreId); - var orderExtraProperties = new Dictionary(); + await AuthorizationService.CheckAsync( + new OrderCreationResource + { + Input = input, + ProductDictionary = productDict + }, + new OrderOperationAuthorizationRequirement(OrderOperation.Creation) + ); - await _purchasableChecker.CheckAsync(input, productDict, orderExtraProperties); - - var order = await _newOrderGenerator.GenerateAsync(input, productDict, orderExtraProperties); + var order = await _newOrderGenerator.GenerateAsync(input, productDict); await _orderManager.DiscountAsync(order, input.ExtraProperties); diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationAuthorizationHandler.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationAuthorizationHandler.cs new file mode 100644 index 00000000..797bd6f4 --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationAuthorizationHandler.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; + +namespace EasyAbp.EShop.Orders.Orders +{ + public abstract class OrderCreationAuthorizationHandler : AuthorizationHandler + { + protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, OrderOperationAuthorizationRequirement requirement, + OrderCreationResource resource) + { + if (requirement.OrderOperation != OrderOperation.Creation) + { + return; + } + + await HandleOrderCreationAsync(context, requirement, resource); + } + + protected abstract Task HandleOrderCreationAsync(AuthorizationHandlerContext context, + OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource); + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationResource.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationResource.cs new file mode 100644 index 00000000..b71e1fe0 --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderCreationResource.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using EasyAbp.EShop.Orders.Orders.Dtos; +using EasyAbp.EShop.Products.Products.Dtos; + +namespace EasyAbp.EShop.Orders.Orders +{ + public class OrderCreationResource + { + public CreateOrderDto Input { get; set; } + + public Dictionary ProductDictionary { get; set; } + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperation.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperation.cs new file mode 100644 index 00000000..ac057098 --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperation.cs @@ -0,0 +1,10 @@ +using System; + +namespace EasyAbp.EShop.Orders.Orders +{ + [Flags] + public enum OrderOperation + { + Creation = 0 + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperationAuthorizationRequirement.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperationAuthorizationRequirement.cs new file mode 100644 index 00000000..5f512340 --- /dev/null +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderOperationAuthorizationRequirement.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Authorization; + +namespace EasyAbp.EShop.Orders.Orders +{ + public class OrderOperationAuthorizationRequirement : IAuthorizationRequirement + { + public OrderOperation OrderOperation { get; } + + public OrderOperationAuthorizationRequirement(OrderOperation orderOperation) + { + OrderOperation = orderOperation; + } + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/PurchasableChecker.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/PurchasableChecker.cs deleted file mode 100644 index ed1bbf19..00000000 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/PurchasableChecker.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using EasyAbp.EShop.Orders.Orders.Dtos; -using EasyAbp.EShop.Products.Products.Dtos; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; - -namespace EasyAbp.EShop.Orders.Orders -{ - public class PurchasableChecker : IPurchasableChecker, ITransientDependency - { - private readonly IServiceProvider _serviceProvider; - - public PurchasableChecker(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public virtual async Task CheckAsync(CreateOrderDto input, Dictionary productDict, - Dictionary orderExtraProperties) - { - var providers = _serviceProvider.GetServices(); - - foreach (var provider in providers) - { - await provider.CheckAsync(input, productDict, orderExtraProperties); - } - } - } -} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/BasicPaymentCreationAuthorizationHandler.cs b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/BasicPaymentCreationAuthorizationHandler.cs index 915eb7f4..c88ebedd 100644 --- a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/BasicPaymentCreationAuthorizationHandler.cs +++ b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/BasicPaymentCreationAuthorizationHandler.cs @@ -17,14 +17,17 @@ namespace EasyAbp.EShop.Payments.Payments if (resource.Orders.Any(order => order.PaymentId.HasValue || order.PaidTime.HasValue)) { context.Fail(); + return Task.CompletedTask; } if (resource.Orders.Select(order => order.Currency).Distinct().Count() != 1) { // Todo: convert to a single currency. context.Fail(); + return Task.CompletedTask; } + context.Succeed(requirement); return Task.CompletedTask; } } diff --git a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentAppService.cs b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentAppService.cs index 26d746ef..0710160c 100644 --- a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentAppService.cs +++ b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentAppService.cs @@ -83,6 +83,15 @@ namespace EasyAbp.EShop.Payments.Payments { orders.Add(await _orderAppService.GetAsync(orderId)); } + + await AuthorizationService.CheckAsync( + new PaymentCreationResource + { + Input = input, + Orders = orders + }, + new PaymentOperationAuthorizationRequirement(PaymentOperation.Creation) + ); var createPaymentEto = new CreatePaymentEto { @@ -100,14 +109,6 @@ namespace EasyAbp.EShop.Payments.Payments }).ToList() }; - await AuthorizationService.CheckAsync(new PaymentCreationResource - { - Input = input, - Orders = orders, - CreatePaymentEto = createPaymentEto - }, - new PaymentOperationAuthorizationRequirement(PaymentOperation.Creation)); - await _distributedEventBus.PublishAsync(createPaymentEto); } } diff --git a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentCreationResource.cs b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentCreationResource.cs index 8ce63e1c..58eb1cad 100644 --- a/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentCreationResource.cs +++ b/modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application/EasyAbp/EShop/Payments/Payments/PaymentCreationResource.cs @@ -10,7 +10,5 @@ namespace EasyAbp.EShop.Payments.Payments public CreatePaymentDto Input { get; set; } public List Orders { get; set; } - - public CreatePaymentEto CreatePaymentEto { get; set; } } } \ No newline at end of file