using System.Security.Claims; using HoneyBox.Core.Interfaces; using HoneyBox.Model.Base; using HoneyBox.Model.Models; using HoneyBox.Model.Models.Goods; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace HoneyBox.Api.Controllers; /// /// 商品控制器 /// [ApiController] [Route("api")] public class GoodsController : ControllerBase { private readonly IGoodsService _goodsService; private readonly IPrizeService _prizeService; private readonly ILogger _logger; public GoodsController( IGoodsService goodsService, IPrizeService prizeService, ILogger logger) { _goodsService = goodsService; _prizeService = prizeService; _logger = logger; } /// /// 获取商品列表 /// POST /api/goods_list /// Requirements: 1.1-1.6 /// [HttpPost("goods_list")] [Authorize] public async Task>> GetGoodsList([FromBody] GoodsListRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { request ??= new GoodsListRequest(); if (request.Page < 1) request.Page = 1; if (request.PageSize < 1) request.PageSize = 15; var result = await _goodsService.GetGoodsListAsync(request, userId.Value); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get goods list: UserId={UserId}", userId); return ApiResponse>.Fail("获取商品列表失败"); } } /// /// 获取商品详情 /// POST /api/goods_detail /// Requirements: 2.1-2.7 /// [HttpPost("goods_detail")] [Authorize] public async Task> GetGoodsDetail([FromBody] GoodsDetailRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var result = await _goodsService.GetGoodsDetailAsync(request.GoodsId, request.GoodsNum, userId.Value); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get goods detail failed: GoodsId={GoodsId}, Error={Error}", request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get goods detail: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取商品详情失败"); } } /// /// 获取商品子奖品列表 /// POST /api/goods_children /// Requirements: 3.1-3.3 /// [HttpPost("goods_children")] [Authorize] public async Task>> GetGoodsChildren([FromBody] GoodsChildrenRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { if (request == null || request.GoodsId <= 0 || request.GoodsListId <= 0) { return ApiResponse>.Fail("参数不能为空"); } var result = await _goodsService.GetGoodsChildrenAsync(request.GoodsId, request.GoodsNum, request.GoodsListId); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get goods children: GoodsId={GoodsId}, GoodsListId={GoodsListId}", request?.GoodsId, request?.GoodsListId); return ApiResponse>.Fail("获取子奖品列表失败"); } } /// /// 获取商品扩展配置 /// POST /api/goods_extend /// Requirements: 4.1-4.3 /// [HttpPost("goods_extend")] [Authorize] public async Task> GetGoodsExtend([FromBody] GoodsExtendRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var result = await _goodsService.GetGoodsExtendAsync(request.GoodsId, request.GoodsType); return ApiResponse.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get goods extend: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取商品扩展配置失败"); } } /// /// 获取箱号列表 /// POST /api/goods_num_list /// Requirements: 5.1 /// [HttpPost("goods_num_list")] [Authorize] public async Task>> GetBoxList([FromBody] BoxListRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse>.Fail("商品ID不能为空"); } var result = await _goodsService.GetBoxListAsync(request.GoodsId); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get box list: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse>.Fail("获取箱号列表失败"); } } /// /// 获取箱号详情 /// POST /api/goods_num_detail /// Requirements: 5.2-5.4 /// [HttpPost("goods_num_detail")] [Authorize] public async Task>> GetBoxDetail([FromBody] BoxDetailRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse>.Fail("商品ID不能为空"); } var result = await _goodsService.GetBoxDetailAsync(request.GoodsId, request.PageNo, request.Sort); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get box detail: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse>.Fail("获取箱号详情失败"); } } /// /// 获取奖品数量统计 /// POST /api/goods_prize_count /// Requirements: 7.1 /// [HttpPost("goods_prize_count")] [Authorize] public async Task> GetPrizeCount([FromBody] PrizeCountRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var result = await _prizeService.GetPrizeCountAsync(request.GoodsId); return ApiResponse.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get prize count: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取奖品统计失败"); } } /// /// 获取奖品内容 /// POST /api/goods_prize_content /// Requirements: 7.2 /// [HttpPost("goods_prize_content")] [Authorize] public async Task> GetPrizeContent([FromBody] PrizeContentRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var result = await _prizeService.GetPrizeContentAsync(request.GoodsId, request.Num); return ApiResponse.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get prize content: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取奖品内容失败"); } } /// /// 获取中奖记录 /// POST /api/goods_prize_logs /// Requirements: 8.1-8.4 /// [HttpPost("goods_prize_logs")] [Authorize] public async Task> GetPrizeLogs([FromBody] PrizeLogsRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var page = request.Page < 1 ? 1 : request.Page; var pageSize = request.PageSize < 1 ? 15 : request.PageSize; var result = await _prizeService.GetPrizeLogsAsync( request.GoodsId, request.GoodsNum, request.ShangId, page, pageSize); return ApiResponse.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get prize logs: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取中奖记录失败"); } } #region Private Helper Methods /// /// 获取当前登录用户ID /// private int? GetCurrentUserId() { var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier); if (userIdClaim == null || !int.TryParse(userIdClaim.Value, out var userId)) { return null; } return userId; } #endregion }