All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 12m54s
公开扫码注册原先在审批准备前就消费短信验证码,落库前的任何失败都会烧掉验证码, 客户重试只能得到统一的“分销码不可用”,掩盖了真实失败原因。 - 验证码校验与消费拆分为 CheckCode 与 ConsumeCode,注册记录与审批实例落库成功后才原子消费; 校验不消费、消费一次性,落库前失败时同一验证码可直接重试 - 分销码无效、所属店铺已停用、上级店铺缺少启用的主账号、验证码错误分别返回各自错误码与提示 - 注册必填字段缺失与请求参数校验失败提示定位到具体字段 - 同步公开接口描述与 agent-distribution-withdrawal 主 Spec 行为契约
71 lines
2.8 KiB
Go
71 lines
2.8 KiB
Go
package app
|
||
|
||
import (
|
||
"github.com/go-playground/validator/v10"
|
||
"github.com/gofiber/fiber/v2"
|
||
|
||
distributionapp "github.com/break/junhong_cmp_fiber/internal/application/distributionwithdrawal"
|
||
distributiondomain "github.com/break/junhong_cmp_fiber/internal/domain/distribution"
|
||
"github.com/break/junhong_cmp_fiber/internal/handler/validation"
|
||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||
"github.com/break/junhong_cmp_fiber/pkg/response"
|
||
)
|
||
|
||
// AgentDistributionHandler 代理分销扫码注册公开 Handler。
|
||
type AgentDistributionHandler struct {
|
||
service *distributionapp.RegistrationService
|
||
validator *validator.Validate
|
||
}
|
||
|
||
// NewAgentDistributionHandler 创建代理分销扫码注册公开 Handler。
|
||
func NewAgentDistributionHandler(
|
||
service *distributionapp.RegistrationService,
|
||
validate *validator.Validate,
|
||
) *AgentDistributionHandler {
|
||
return &AgentDistributionHandler{service: service, validator: validate}
|
||
}
|
||
|
||
// RegisterAgentDistribution 提交代理扫码注册
|
||
// POST /api/c/v1/agent-distribution-registrations
|
||
// 无需认证、JWT、角色或权限;只创建待审批注册记录,不返回任何账号凭证。
|
||
// 分销码无效、上级店铺停用、上级店铺缺少启用的主账号、短信验证码无效分别返回各自提示且不落库;
|
||
// 短信验证码在注册记录落库成功后消费,落库前的失败不消耗验证码。
|
||
func (h *AgentDistributionHandler) RegisterAgentDistribution(c *fiber.Ctx) error {
|
||
if h.service == nil {
|
||
return errors.New(errors.CodeServiceUnavailable, "代理分销注册能力尚未配置")
|
||
}
|
||
var req dto.CreateAgentDistributionRegistrationReq
|
||
if err := c.BodyParser(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
||
}
|
||
if h.validator == nil {
|
||
return errors.New(errors.CodeInternalError, "代理分销注册校验器未配置")
|
||
}
|
||
if err := h.validator.Struct(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam, validation.Message("注册参数不合法", &req, err))
|
||
}
|
||
result, err := h.service.Register(c.UserContext(), distributiondomain.RegistrationInput{
|
||
DistributionCode: req.DistributionCode,
|
||
Phone: req.Phone,
|
||
Username: req.Username,
|
||
Password: req.Password,
|
||
ShopName: req.ShopName,
|
||
ShopCode: req.ShopCode,
|
||
ContactName: req.ContactName,
|
||
Province: req.Province,
|
||
City: req.City,
|
||
District: req.District,
|
||
Address: req.Address,
|
||
}, req.Code)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return response.Success(c, &dto.CreateAgentDistributionRegistrationResp{
|
||
ID: result.RegistrationID,
|
||
Status: result.Status,
|
||
StatusName: constants.GetAgentDistributionRegistrationStatusName(result.Status),
|
||
})
|
||
}
|