337 lines
10 KiB
Go
337 lines
10 KiB
Go
package handlers
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
|
|
"tyapi-server/internal/domains/finance/dto"
|
|
"tyapi-server/internal/domains/finance/services"
|
|
"tyapi-server/internal/shared/interfaces"
|
|
)
|
|
|
|
// FinanceHandler 财务HTTP处理器
|
|
type FinanceHandler struct {
|
|
financeService *services.FinanceService
|
|
responseBuilder interfaces.ResponseBuilder
|
|
logger *zap.Logger
|
|
}
|
|
|
|
// NewFinanceHandler 创建财务HTTP处理器
|
|
func NewFinanceHandler(
|
|
financeService *services.FinanceService,
|
|
responseBuilder interfaces.ResponseBuilder,
|
|
logger *zap.Logger,
|
|
) *FinanceHandler {
|
|
return &FinanceHandler{
|
|
financeService: financeService,
|
|
responseBuilder: responseBuilder,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// CreateWallet 创建钱包
|
|
// @Summary 创建钱包
|
|
// @Description 为用户创建钱包
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.CreateWalletRequest true "创建钱包请求"
|
|
// @Success 201 {object} dto.CreateWalletResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet [post]
|
|
func (h *FinanceHandler) CreateWallet(c *gin.Context) {
|
|
var req dto.CreateWalletRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("创建钱包参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.CreateWallet(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("创建钱包失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Created(c, response, "钱包创建成功")
|
|
}
|
|
|
|
// GetWallet 获取钱包信息
|
|
// @Summary 获取钱包信息
|
|
// @Description 获取用户钱包信息
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param user_id query string true "用户ID"
|
|
// @Success 200 {object} dto.WalletInfo
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet [get]
|
|
func (h *FinanceHandler) GetWallet(c *gin.Context) {
|
|
userID := c.Query("user_id")
|
|
if userID == "" {
|
|
h.responseBuilder.BadRequest(c, "用户ID不能为空")
|
|
return
|
|
}
|
|
|
|
wallet, err := h.financeService.GetWallet(c.Request.Context(), userID)
|
|
if err != nil {
|
|
h.logger.Error("获取钱包信息失败", zap.Error(err))
|
|
h.responseBuilder.NotFound(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, wallet, "获取钱包信息成功")
|
|
}
|
|
|
|
// UpdateWallet 更新钱包
|
|
// @Summary 更新钱包
|
|
// @Description 更新用户钱包信息
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.UpdateWalletRequest true "更新钱包请求"
|
|
// @Success 200 {object} interfaces.SuccessResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet [put]
|
|
func (h *FinanceHandler) UpdateWallet(c *gin.Context) {
|
|
var req dto.UpdateWalletRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("更新钱包参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
err := h.financeService.UpdateWallet(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("更新钱包失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, nil, "钱包更新成功")
|
|
}
|
|
|
|
// Recharge 充值
|
|
// @Summary 钱包充值
|
|
// @Description 为用户钱包充值
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.RechargeRequest true "充值请求"
|
|
// @Success 200 {object} dto.RechargeResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet/recharge [post]
|
|
func (h *FinanceHandler) Recharge(c *gin.Context) {
|
|
var req dto.RechargeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("充值参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.Recharge(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("充值失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, response, "充值成功")
|
|
}
|
|
|
|
// Withdraw 提现
|
|
// @Summary 钱包提现
|
|
// @Description 从用户钱包提现
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.WithdrawRequest true "提现请求"
|
|
// @Success 200 {object} dto.WithdrawResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet/withdraw [post]
|
|
func (h *FinanceHandler) Withdraw(c *gin.Context) {
|
|
var req dto.WithdrawRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("提现参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.Withdraw(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("提现失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, response, "提现成功")
|
|
}
|
|
|
|
// CreateUserSecrets 创建用户密钥
|
|
// @Summary 创建用户密钥
|
|
// @Description 为用户创建访问密钥
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.CreateUserSecretsRequest true "创建密钥请求"
|
|
// @Success 201 {object} dto.CreateUserSecretsResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Router /finance/secrets [post]
|
|
func (h *FinanceHandler) CreateUserSecrets(c *gin.Context) {
|
|
var req dto.CreateUserSecretsRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("创建密钥参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.CreateUserSecrets(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("创建密钥失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Created(c, response, "密钥创建成功")
|
|
}
|
|
|
|
// GetUserSecrets 获取用户密钥
|
|
// @Summary 获取用户密钥
|
|
// @Description 获取用户访问密钥信息
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param user_id query string true "用户ID"
|
|
// @Success 200 {object} dto.UserSecretsInfo
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/secrets [get]
|
|
func (h *FinanceHandler) GetUserSecrets(c *gin.Context) {
|
|
userID := c.Query("user_id")
|
|
if userID == "" {
|
|
h.responseBuilder.BadRequest(c, "用户ID不能为空")
|
|
return
|
|
}
|
|
|
|
secrets, err := h.financeService.GetUserSecrets(c.Request.Context(), userID)
|
|
if err != nil {
|
|
h.logger.Error("获取密钥失败", zap.Error(err))
|
|
h.responseBuilder.NotFound(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, secrets, "获取密钥成功")
|
|
}
|
|
|
|
// RegenerateAccessKey 重新生成访问密钥
|
|
// @Summary 重新生成访问密钥
|
|
// @Description 重新生成用户的访问密钥
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.RegenerateAccessKeyRequest true "重新生成密钥请求"
|
|
// @Success 200 {object} dto.RegenerateAccessKeyResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/secrets/regenerate [post]
|
|
func (h *FinanceHandler) RegenerateAccessKey(c *gin.Context) {
|
|
var req dto.RegenerateAccessKeyRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("重新生成密钥参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.RegenerateAccessKey(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("重新生成密钥失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, response, "密钥重新生成成功")
|
|
}
|
|
|
|
// DeactivateUserSecrets 停用用户密钥
|
|
// @Summary 停用用户密钥
|
|
// @Description 停用用户的访问密钥
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.DeactivateUserSecretsRequest true "停用密钥请求"
|
|
// @Success 200 {object} interfaces.SuccessResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/secrets/deactivate [post]
|
|
func (h *FinanceHandler) DeactivateUserSecrets(c *gin.Context) {
|
|
var req dto.DeactivateUserSecretsRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("停用密钥参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
err := h.financeService.DeactivateUserSecrets(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("停用密钥失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, nil, "密钥停用成功")
|
|
}
|
|
|
|
// WalletTransaction 钱包交易
|
|
// @Summary 钱包交易
|
|
// @Description 用户间钱包转账
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body dto.WalletTransactionRequest true "交易请求"
|
|
// @Success 200 {object} dto.WalletTransactionResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Failure 404 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet/transaction [post]
|
|
func (h *FinanceHandler) WalletTransaction(c *gin.Context) {
|
|
var req dto.WalletTransactionRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
h.logger.Warn("交易参数验证失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, "请求参数错误")
|
|
return
|
|
}
|
|
|
|
response, err := h.financeService.WalletTransaction(c.Request.Context(), &req)
|
|
if err != nil {
|
|
h.logger.Error("交易失败", zap.Error(err))
|
|
h.responseBuilder.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, response, "交易成功")
|
|
}
|
|
|
|
// GetWalletStats 获取钱包统计
|
|
// @Summary 获取钱包统计
|
|
// @Description 获取钱包系统统计信息
|
|
// @Tags 财务系统
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} dto.WalletStatsResponse
|
|
// @Failure 400 {object} interfaces.ErrorResponse
|
|
// @Router /finance/wallet/stats [get]
|
|
func (h *FinanceHandler) GetWalletStats(c *gin.Context) {
|
|
stats, err := h.financeService.GetWalletStats(c.Request.Context())
|
|
if err != nil {
|
|
h.logger.Error("获取钱包统计失败", zap.Error(err))
|
|
h.responseBuilder.InternalError(c, "获取统计信息失败")
|
|
return
|
|
}
|
|
|
|
h.responseBuilder.Success(c, stats, "获取统计信息成功")
|
|
}
|