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
}