Browse Source

Move create, update and delete method to ProductManager

pull/49/head
gdlcf88 6 years ago
parent
commit
02f0bd341c
  1. 2
      modules/EasyAbp.EShop.Baskets/common.props
  2. 2
      modules/EasyAbp.EShop.Orders/common.props
  3. 2
      modules/EasyAbp.EShop.Payments/common.props
  4. 2
      modules/EasyAbp.EShop.Products/common.props
  5. 68
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs
  6. 9
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs
  7. 0
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductCodeDuplicatedException.cs
  8. 108
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs
  9. 2
      modules/EasyAbp.EShop.Stores/common.props

2
modules/EasyAbp.EShop.Baskets/common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>0.1.16</Version> <Version>0.1.17</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors> <Authors>EasyAbp Team</Authors>

2
modules/EasyAbp.EShop.Orders/common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>0.1.16</Version> <Version>0.1.17</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors> <Authors>EasyAbp Team</Authors>

2
modules/EasyAbp.EShop.Payments/common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>0.1.16</Version> <Version>0.1.17</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors> <Authors>EasyAbp Team</Authors>

2
modules/EasyAbp.EShop.Products/common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>0.1.16</Version> <Version>0.1.17</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors> <Authors>EasyAbp Team</Authors>

68
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs

@ -64,52 +64,13 @@ namespace EasyAbp.EShop.Products.Products
TryToSetTenantId(product); TryToSetTenantId(product);
await CheckProductCodeUniqueAsync(product);
await UpdateProductAttributesAsync(product, input); await UpdateProductAttributesAsync(product, input);
await Repository.InsertAsync(product, autoSave: true);
await CheckProductDetailAvailableAsync(product.Id, input.ProductDetailId);
await AddProductToStoreAsync(product.Id, input.StoreId);
await UpdateProductCategoriesAsync(product.Id, input.CategoryIds); await _productManager.CreateAsync(product, input.StoreId, input.CategoryIds);
return MapToGetOutputDto(product); return MapToGetOutputDto(product);
} }
private async Task CheckProductCodeUniqueAsync(Product product)
{
if (product.Code.IsNullOrEmpty())
{
return;
}
if (await _repository.FindAsync(x => x.Code == product.Code && x.Id != product.Id) != null)
{
throw new ProductCodeDuplicatedException(product.Code);
}
}
protected virtual async Task CheckProductDetailAvailableAsync(Guid currentProductId, Guid desiredProductDetailId)
{
var otherOwner = await _repository.FindAsync(x =>
x.ProductDetailId == desiredProductDetailId && x.Id != currentProductId);
// Todo: should also check ProductSku owner
if (otherOwner != null)
{
throw new EntityNotFoundException(typeof(ProductDetail), desiredProductDetailId);
}
}
protected virtual async Task AddProductToStoreAsync(Guid productId, Guid storeId)
{
await _productStoreRepository.InsertAsync(new ProductStore(GuidGenerator.Create(), CurrentTenant.Id,
storeId, productId, true), true);
}
public override async Task<ProductDto> UpdateAsync(Guid id, CreateUpdateProductDto input) public override async Task<ProductDto> UpdateAsync(Guid id, CreateUpdateProductDto input)
{ {
@ -122,16 +83,10 @@ namespace EasyAbp.EShop.Products.Products
CheckProductIsNotStatic(product); CheckProductIsNotStatic(product);
MapToEntity(input, product); MapToEntity(input, product);
await CheckProductCodeUniqueAsync(product);
await UpdateProductAttributesAsync(product, input); await UpdateProductAttributesAsync(product, input);
await Repository.UpdateAsync(product, autoSave: true); await _productManager.UpdateAsync(product, input.CategoryIds);
await CheckProductDetailAvailableAsync(product.Id, input.ProductDetailId);
await UpdateProductCategoriesAsync(product.Id, input.CategoryIds);
return MapToGetOutputDto(product); return MapToGetOutputDto(product);
} }
@ -326,12 +281,10 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(id); var product = await GetEntityByIdAsync(id);
CheckProductIsNotStatic(product); CheckProductIsNotStatic(product);
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(id));
await CheckStoreIsProductOwnerAsync(id, storeId); await CheckStoreIsProductOwnerAsync(id, storeId);
await _repository.DeleteAsync(product); await _productManager.DeleteAsync(product);
} }
private static void CheckProductIsNotStatic(Product product) private static void CheckProductIsNotStatic(Product product)
@ -417,15 +370,6 @@ namespace EasyAbp.EShop.Products.Products
return ObjectMapper.Map<Product, ProductDto>(product); return ObjectMapper.Map<Product, ProductDto>(product);
} }
protected virtual async Task UpdateProductCategoriesAsync(Guid productId, IEnumerable<Guid> categoryIds)
{
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(productId));
foreach (var categoryId in categoryIds)
{
await _productCategoryRepository.InsertAsync(
new ProductCategory(GuidGenerator.Create(), CurrentTenant.Id, categoryId, productId), true);
}
}
} }
} }

9
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
@ -6,6 +7,14 @@ namespace EasyAbp.EShop.Products.Products
{ {
public interface IProductManager : IDomainService public interface IProductManager : IDomainService
{ {
Task<Product> CreateAsync(Product product, Guid? storeId = null, IEnumerable<Guid> categoryIds = null);
Task<Product> UpdateAsync(Product product, IEnumerable<Guid> categoryIds = null);
Task DeleteAsync(Product product);
Task DeleteAsync(Guid id);
Task<bool> IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity); Task<bool> IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity);
Task<int> GetInventoryAsync(Product product, ProductSku productSku, Guid storeId); Task<int> GetInventoryAsync(Product product, ProductSku productSku, Guid storeId);

0
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductCodeDuplicatedException.cs → modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductCodeDuplicatedException.cs

108
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs

@ -1,21 +1,127 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using EasyAbp.EShop.Products.ProductCategories;
using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.ProductStores;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
namespace EasyAbp.EShop.Products.Products namespace EasyAbp.EShop.Products.Products
{ {
public class ProductManager : DomainService, IProductManager public class ProductManager : DomainService, IProductManager
{ {
private readonly IProductRepository _productRepository;
private readonly IProductStoreRepository _productStoreRepository;
private readonly IProductCategoryRepository _productCategoryRepository;
private readonly IProductInventoryProvider _productInventoryProvider; private readonly IProductInventoryProvider _productInventoryProvider;
public ProductManager( public ProductManager(
IProductRepository productRepository,
IProductStoreRepository productStoreRepository,
IProductCategoryRepository productCategoryRepository,
IProductInventoryProvider productInventoryProvider) IProductInventoryProvider productInventoryProvider)
{ {
_productRepository = productRepository;
_productStoreRepository = productStoreRepository;
_productCategoryRepository = productCategoryRepository;
_productInventoryProvider = productInventoryProvider; _productInventoryProvider = productInventoryProvider;
} }
public virtual async Task<Product> CreateAsync(Product product, Guid? storeId = null,
IEnumerable<Guid> categoryIds = null)
{
await CheckProductCodeUniqueAsync(product);
await _productRepository.InsertAsync(product, autoSave: true);
await CheckProductDetailAvailableAsync(product.Id, product.ProductDetailId);
await UpdateProductCategoriesAsync(product.Id, categoryIds);
if (storeId.HasValue)
{
await AddProductToStoreAsync(product.Id, storeId.Value);
}
return product;
}
public virtual async Task<Product> UpdateAsync(Product product, IEnumerable<Guid> categoryIds = null)
{
await CheckProductCodeUniqueAsync(product);
await _productRepository.UpdateAsync(product, autoSave: true);
await CheckProductDetailAvailableAsync(product.Id, product.ProductDetailId);
await UpdateProductCategoriesAsync(product.Id, categoryIds);
return product;
}
public virtual async Task DeleteAsync(Product product)
{
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(product.Id));
await _productRepository.DeleteAsync(product);
}
public virtual async Task DeleteAsync(Guid id)
{
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(id));
await _productRepository.DeleteAsync(id);
}
protected virtual async Task AddProductToStoreAsync(Guid productId, Guid storeId)
{
await _productStoreRepository.InsertAsync(new ProductStore(GuidGenerator.Create(), CurrentTenant.Id,
storeId, productId, true), true);
}
protected virtual async Task CheckProductCodeUniqueAsync(Product product)
{
if (product.Code.IsNullOrEmpty())
{
return;
}
if (await _productRepository.FindAsync(x => x.Code == product.Code && x.Id != product.Id) != null)
{
throw new ProductCodeDuplicatedException(product.Code);
}
}
protected virtual async Task CheckProductDetailAvailableAsync(Guid currentProductId, Guid desiredProductDetailId)
{
var otherOwner = await _productRepository.FindAsync(x =>
x.ProductDetailId == desiredProductDetailId && x.Id != currentProductId);
// Todo: should also check ProductSku owner
if (otherOwner != null)
{
throw new EntityNotFoundException(typeof(ProductDetail), desiredProductDetailId);
}
}
protected virtual async Task UpdateProductCategoriesAsync(Guid productId, IEnumerable<Guid> categoryIds)
{
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(productId));
if (categoryIds == null)
{
return;
}
foreach (var categoryId in categoryIds)
{
await _productCategoryRepository.InsertAsync(
new ProductCategory(GuidGenerator.Create(), CurrentTenant.Id, categoryId, productId), true);
}
}
public virtual async Task<bool> IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity) public virtual async Task<bool> IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity)
{ {
var inventory = await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId); var inventory = await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId);

2
modules/EasyAbp.EShop.Stores/common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>0.1.16</Version> <Version>0.1.17</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors> <Authors>EasyAbp Team</Authors>

Loading…
Cancel
Save