Files
platform/web/handlers/trade.go

118 lines
2.5 KiB
Go

package handlers
import (
"log/slog"
"platform/web/auth"
"platform/web/core"
g "platform/web/globals"
m "platform/web/models"
s "platform/web/services"
"time"
"github.com/gofiber/fiber/v2"
)
type TradeCreateReq struct {
s.CreateTradeData
Type m.TradeType `json:"type" validate:"required"`
Resource *s.CreateResourceData `json:"resource,omitempty"`
Recharge *s.RechargeProductInfo `json:"recharge,omitempty"`
}
type TradeCreateResp struct {
PayUrl string `json:"pay_url"`
TradeNo string `json:"trade_no"`
}
func TradeCreate(c *fiber.Ctx) error {
// 检查权限
authCtx, err := auth.GetAuthCtx(c).PermitUser()
if err != nil {
return err
}
// 解析请求参数
req := new(TradeCreateReq)
if err := g.Validator.Validate(c, req); err != nil {
return err
}
switch req.Type {
case m.TradeTypePurchase:
if req.Resource == nil {
return core.NewBizErr("购买信息不能为空")
}
req.Product = req.Resource
case m.TradeTypeRecharge:
if req.Recharge == nil {
return core.NewBizErr("充值信息不能为空")
}
req.Product = req.Recharge
}
// 创建交易
result, err := s.Trade.CreateTrade(authCtx.User.ID, time.Now(), &req.CreateTradeData)
if err != nil {
slog.Error("创建交易失败", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "创建交易失败"})
}
return c.JSON(&TradeCreateResp{
PayUrl: result.PaymentUrl,
TradeNo: result.TradeNo,
})
}
type TradeCompleteReq struct {
s.ModifyTradeData
}
func TradeComplete(c *fiber.Ctx) error {
// 检查权限
_, err := auth.GetAuthCtx(c).PermitUser()
if err != nil {
return err
}
// 解析请求参数
req := new(TradeCompleteReq)
if err := g.Validator.Validate(c, req); err != nil {
return err
}
// 检查订单状态
err = s.Trade.CompleteTrade(&req.ModifyTradeData)
if err != nil {
return err
}
return c.SendStatus(fiber.StatusNoContent)
}
type TradeCancelReq struct {
s.ModifyTradeData
}
func TradeCancel(c *fiber.Ctx) error {
// 检查权限
_, err := auth.GetAuthCtx(c).PermitUser()
if err != nil {
return err
}
// 解析请求参数
req := new(TradeCancelReq)
if err := g.Validator.Validate(c, req); err != nil {
return err
}
// 取消交易
err = s.Trade.CancelTrade(&req.ModifyTradeData, time.Now())
if err != nil {
slog.Error("取消交易失败", "trade_no", req.TradeNo, "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "取消交易失败"})
}
return c.SendStatus(fiber.StatusNoContent)
}