using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Application.Commerce; using Tiku.Application.Security; namespace Tiku.Api.Controllers; [ApiController] [Authorize(Policy = TikuPolicies.CurrentTenantMember)] [Produces("application/json")] [Route("api/commerce")] public sealed class CommerceController( ICommerceService commerceService, ICurrentUser currentUser, ICurrentTenant currentTenant) : ControllerBase { [HttpPost("orders")] [EndpointSummary("创建学生端订单")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> CreateOrder( CreateCommerceOrderDto request, CancellationToken cancellationToken) { return Ok(await commerceService.CreateOrderAsync( ResolveActor(), request.ToCommand(), cancellationToken)); } [HttpGet("orders")] [EndpointSummary("查询当前用户订单")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> Orders( [FromQuery] CommerceOrderQueryDto query, CancellationToken cancellationToken) { return Ok(await commerceService.GetOrdersAsync( ResolveActor(), new CommerceOrderQuery(query.Limit, query.Status), cancellationToken)); } [HttpGet("orders/{orderNo}")] [EndpointSummary("查询当前用户订单详情")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> Order( string orderNo, CancellationToken cancellationToken) { return Ok(await commerceService.GetOrderAsync( ResolveActor(), orderNo, cancellationToken)); } [HttpPost("payments")] [EndpointSummary("创建订单支付")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> CreatePayment( CreateCommercePaymentDto request, CancellationToken cancellationToken) { return Ok(await commerceService.CreatePaymentAsync( ResolveActor(), request.ToCommand(), cancellationToken)); } [HttpGet("entitlements/current")] [EndpointSummary("查询当前用户权益")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> CurrentEntitlement( CancellationToken cancellationToken) { return Ok(await commerceService.GetCurrentEntitlementAsync( ResolveActor(), cancellationToken)); } private CommerceActor ResolveActor() { if (currentTenant.TenantId is null || currentUser.UserId is null) { throw new CommerceException("Current commerce actor was not resolved.", "commerce_access_denied"); } return new CommerceActor(currentTenant.TenantId.Value, currentUser.UserId.Value); } }