feat: 菜品菜单查询与子资源替换完善
This commit is contained in:
@@ -171,4 +171,89 @@ public sealed class ProductsController(IMediator mediator) : BaseApiController
|
||||
? ApiResponse<ProductDto>.Error(ErrorCodes.NotFound, "商品不存在")
|
||||
: ApiResponse<ProductDto>.Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 替换商品 SKU。
|
||||
/// </summary>
|
||||
[HttpPut("{productId:long}/skus")]
|
||||
[PermissionAuthorize("product-sku:update")]
|
||||
[ProducesResponseType(typeof(ApiResponse<IReadOnlyList<ProductSkuDto>>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<IReadOnlyList<ProductSkuDto>>> ReplaceSkus(long productId, [FromBody] ReplaceProductSkusCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.ProductId == 0)
|
||||
{
|
||||
command = command with { ProductId = productId };
|
||||
}
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
return ApiResponse<IReadOnlyList<ProductSkuDto>>.Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 替换商品规格。
|
||||
/// </summary>
|
||||
[HttpPut("{productId:long}/attributes")]
|
||||
[PermissionAuthorize("product-attr:update")]
|
||||
[ProducesResponseType(typeof(ApiResponse<IReadOnlyList<ProductAttributeGroupDto>>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<IReadOnlyList<ProductAttributeGroupDto>>> ReplaceAttributes(long productId, [FromBody] ReplaceProductAttributesCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.ProductId == 0)
|
||||
{
|
||||
command = command with { ProductId = productId };
|
||||
}
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
return ApiResponse<IReadOnlyList<ProductAttributeGroupDto>>.Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 替换商品加料。
|
||||
/// </summary>
|
||||
[HttpPut("{productId:long}/addons")]
|
||||
[PermissionAuthorize("product-addon:update")]
|
||||
[ProducesResponseType(typeof(ApiResponse<IReadOnlyList<ProductAddonGroupDto>>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<IReadOnlyList<ProductAddonGroupDto>>> ReplaceAddons(long productId, [FromBody] ReplaceProductAddonsCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.ProductId == 0)
|
||||
{
|
||||
command = command with { ProductId = productId };
|
||||
}
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
return ApiResponse<IReadOnlyList<ProductAddonGroupDto>>.Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 替换商品媒资。
|
||||
/// </summary>
|
||||
[HttpPut("{productId:long}/media")]
|
||||
[PermissionAuthorize("product-media:update")]
|
||||
[ProducesResponseType(typeof(ApiResponse<IReadOnlyList<ProductMediaAssetDto>>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<IReadOnlyList<ProductMediaAssetDto>>> ReplaceMedia(long productId, [FromBody] ReplaceProductMediaCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.ProductId == 0)
|
||||
{
|
||||
command = command with { ProductId = productId };
|
||||
}
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
return ApiResponse<IReadOnlyList<ProductMediaAssetDto>>.Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 替换商品价格策略。
|
||||
/// </summary>
|
||||
[HttpPut("{productId:long}/pricing-rules")]
|
||||
[PermissionAuthorize("product-pricing:update")]
|
||||
[ProducesResponseType(typeof(ApiResponse<IReadOnlyList<ProductPricingRuleDto>>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<IReadOnlyList<ProductPricingRuleDto>>> ReplacePricingRules(long productId, [FromBody] ReplaceProductPricingRulesCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.ProductId == 0)
|
||||
{
|
||||
command = command with { ProductId = productId };
|
||||
}
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
return ApiResponse<IReadOnlyList<ProductPricingRuleDto>>.Ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,6 +113,16 @@
|
||||
"product:update",
|
||||
"product:delete",
|
||||
"product:publish",
|
||||
"product-sku:read",
|
||||
"product-sku:update",
|
||||
"product-attr:read",
|
||||
"product-attr:update",
|
||||
"product-addon:read",
|
||||
"product-addon:update",
|
||||
"product-media:read",
|
||||
"product-media:update",
|
||||
"product-pricing:read",
|
||||
"product-pricing:update",
|
||||
"order:create",
|
||||
"order:read",
|
||||
"order:update",
|
||||
@@ -197,6 +207,17 @@
|
||||
"product:read",
|
||||
"product:update",
|
||||
"product:delete",
|
||||
"product:publish",
|
||||
"product-sku:read",
|
||||
"product-sku:update",
|
||||
"product-attr:read",
|
||||
"product-attr:update",
|
||||
"product-addon:read",
|
||||
"product-addon:update",
|
||||
"product-media:read",
|
||||
"product-media:update",
|
||||
"product-pricing:read",
|
||||
"product-pricing:update",
|
||||
"order:create",
|
||||
"order:read",
|
||||
"order:update",
|
||||
@@ -242,6 +263,17 @@
|
||||
"product:create",
|
||||
"product:read",
|
||||
"product:update",
|
||||
"product:publish",
|
||||
"product-sku:read",
|
||||
"product-sku:update",
|
||||
"product-attr:read",
|
||||
"product-attr:update",
|
||||
"product-addon:read",
|
||||
"product-addon:update",
|
||||
"product-media:read",
|
||||
"product-media:update",
|
||||
"product-pricing:read",
|
||||
"product-pricing:update",
|
||||
"order:create",
|
||||
"order:read",
|
||||
"order:update",
|
||||
@@ -331,6 +363,17 @@
|
||||
"product:read",
|
||||
"product:update",
|
||||
"product:delete",
|
||||
"product:publish",
|
||||
"product-sku:read",
|
||||
"product-sku:update",
|
||||
"product-attr:read",
|
||||
"product-attr:update",
|
||||
"product-addon:read",
|
||||
"product-addon:update",
|
||||
"product-media:read",
|
||||
"product-media:update",
|
||||
"product-pricing:read",
|
||||
"product-pricing:update",
|
||||
"order:create",
|
||||
"order:read",
|
||||
"order:update",
|
||||
|
||||
38
src/Api/TakeoutSaaS.MiniApi/Controllers/MenusController.cs
Normal file
38
src/Api/TakeoutSaaS.MiniApi/Controllers/MenusController.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using TakeoutSaaS.Application.App.Products.Dto;
|
||||
using TakeoutSaaS.Application.App.Products.Queries;
|
||||
using TakeoutSaaS.Shared.Abstractions.Results;
|
||||
using TakeoutSaaS.Shared.Web.Api;
|
||||
|
||||
namespace TakeoutSaaS.MiniApi.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// 小程序端菜单查询。
|
||||
/// </summary>
|
||||
[ApiVersion("1.0")]
|
||||
[Authorize]
|
||||
[Route("api/mini/v{version:apiVersion}/stores/{storeId:long}/menu")]
|
||||
public sealed class MenusController(IMediator mediator) : BaseApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取门店菜单(含分类与商品详情)。
|
||||
/// </summary>
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(ApiResponse<StoreMenuDto>), StatusCodes.Status200OK)]
|
||||
public async Task<ApiResponse<StoreMenuDto>> GetMenu(long storeId, [FromQuery] DateTime? updatedAfter, CancellationToken cancellationToken)
|
||||
{
|
||||
// 1. 组装查询
|
||||
var query = new GetStoreMenuQuery
|
||||
{
|
||||
StoreId = storeId,
|
||||
UpdatedAfter = updatedAfter
|
||||
};
|
||||
// 2. 拉取菜单
|
||||
var result = await mediator.Send(query, cancellationToken);
|
||||
return ApiResponse<StoreMenuDto>.Ok(result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user