package handler import ( "strconv" "strings" "affiliate_dash/internal/pkg/response" "affiliate_dash/internal/service" "github.com/gin-gonic/gin" ) // DeliveryHandler 提供用户侧公开发货页面使用的接口。 type DeliveryHandler struct { deliverySvc *service.DeliveryService } func NewDeliveryHandler(deliverySvc *service.DeliveryService) *DeliveryHandler { return &DeliveryHandler{deliverySvc: deliverySvc} } func (h *DeliveryHandler) GetOrder(c *gin.Context) { order, err := h.deliverySvc.GetOrder(c.Param("order_no"), parseDeliveryAuth(c)) if err != nil { writeDeliveryError(c, err) return } response.OK(c, order) } type deliveryBindReq struct { GameAccount string `json:"game_account" binding:"required"` } func (h *DeliveryHandler) Bind(c *gin.Context) { var req deliveryBindReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请输入玩家编号") return } result, err := h.deliverySvc.Bind(c.Param("order_no"), req.GameAccount, parseDeliveryAuth(c)) if err != nil { writeDeliveryError(c, err) return } response.OK(c, result) } type deliverySubmitReq struct { GameAccount string `json:"game_account" binding:"required"` BindUUID string `json:"bind_uuid" binding:"required"` } func (h *DeliveryHandler) Submit(c *gin.Context) { var req deliverySubmitReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "玩家编号和绑定凭证不能为空") return } result, err := h.deliverySvc.Submit(c.Param("order_no"), req.GameAccount, req.BindUUID, parseDeliveryAuth(c)) if err != nil { writeDeliveryError(c, err) return } response.OK(c, result) } func parseDeliveryAuth(c *gin.Context) service.DeliveryLinkAuth { exp := int64(0) if value := strings.TrimSpace(c.Query("exp")); value != "" { if parsed, err := strconv.ParseInt(value, 10, 64); err == nil { exp = parsed } } return service.DeliveryLinkAuth{ Exp: exp, Sign: strings.TrimSpace(c.Query("sign")), } } func writeDeliveryError(c *gin.Context, err error) { type statusCoder interface { HTTPStatus() int } if sc, ok := err.(statusCoder); ok { status := sc.HTTPStatus() response.Fail(c, status, status, strings.TrimSpace(err.Error())) return } msg := strings.TrimSpace(err.Error()) if msg == "订单不存在" { response.NotFound(c, msg) return } if msg == "链接参数缺失" || msg == "发货链接未生成" || msg == "发货链接已失效" || msg == "发货链接已过期" || msg == "发货链接签名无效" { response.Forbidden(c, msg) return } response.BadRequest(c, msg) }