using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using TakeoutSaaS.Application.App.Products.Commands;
using TakeoutSaaS.Application.App.Products.Dto;
using TakeoutSaaS.Application.App.Products.Queries;
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Module.Authorization.Attributes;
using TakeoutSaaS.Shared.Abstractions.Constants;
using TakeoutSaaS.Shared.Abstractions.Results;
using TakeoutSaaS.Shared.Web.Api;
namespace TakeoutSaaS.AdminApi.Controllers;
///
/// 商品管理。
///
[ApiVersion("1.0")]
[Authorize]
[Route("api/admin/v{version:apiVersion}/products")]
public sealed class ProductsController : BaseApiController
{
private readonly IMediator _mediator;
///
/// 初始化控制器。
///
public ProductsController(IMediator mediator)
{
_mediator = mediator;
}
///
/// 创建商品。
///
[HttpPost]
[PermissionAuthorize("product:create")]
[ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
public async Task> Create([FromBody] CreateProductCommand command, CancellationToken cancellationToken)
{
var result = await _mediator.Send(command, cancellationToken);
return ApiResponse.Ok(result);
}
///
/// 查询商品列表。
///
[HttpGet]
[PermissionAuthorize("product:read")]
[ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
public async Task>> List(
[FromQuery] long? storeId,
[FromQuery] long? categoryId,
[FromQuery] ProductStatus? status,
[FromQuery] int page = 1,
[FromQuery] int pageSize = 20,
[FromQuery] string? sortBy = null,
[FromQuery] bool sortDesc = true,
CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(new SearchProductsQuery
{
StoreId = storeId,
CategoryId = categoryId,
Status = status,
Page = page,
PageSize = pageSize,
SortBy = sortBy,
SortDescending = sortDesc
}, cancellationToken);
return ApiResponse>.Ok(result);
}
///
/// 获取商品详情。
///
[HttpGet("{productId:long}")]
[PermissionAuthorize("product:read")]
[ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResponse