101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
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)
|
|
}
|