Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
完成运营商实名回调、业务事件观测序列与受控配置装配,同时恢复 UR43 已交付的 packages[].remove 字段及旧响应兼容,统一更新 OpenSpec、OpenAPI 和交付文档。 Constraint: 七月测试环境里程碑不新增或运行自动化测试 Rejected: 以必填 operation_type 替换 packages[].remove | 会破坏已交付前端契约 Confidence: high Scope-risk: broad Directive: 后续修改系列套餐管理接口必须保持 packages[].remove 和 ShopSeriesGrantResponse 兼容 Tested: go run ./cmd/gendocs;go build -buildvcs=false ./...;openspec validate complete-july-iteration-test-release --strict;git diff --check Not-tested: 按本 Change 约定未运行 go test,真实运营商与 Gateway 联调延期
68 lines
2.4 KiB
Go
68 lines
2.4 KiB
Go
package carriercallback
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
|
|
"github.com/bytedance/sonic"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
pkgvalidator "github.com/break/junhong_cmp_fiber/pkg/validator"
|
|
)
|
|
|
|
// CUCCRealnameRemovalTranslation 是联通解除实名回调的受控语义。
|
|
type CUCCRealnameRemovalTranslation struct {
|
|
ICCID string
|
|
DateChanged string
|
|
}
|
|
|
|
// CUCCRealnameRemovalTranslator 解析外层 data 字符串及其内层 JSON。
|
|
type CUCCRealnameRemovalTranslator struct{}
|
|
|
|
// NewCUCCRealnameRemovalTranslator 创建联通解除实名 Translator。
|
|
func NewCUCCRealnameRemovalTranslator() *CUCCRealnameRemovalTranslator {
|
|
return &CUCCRealnameRemovalTranslator{}
|
|
}
|
|
|
|
// Translate 解析并校验联通解除实名报文,不执行任何业务写入。
|
|
func (t *CUCCRealnameRemovalTranslator) Translate(body []byte) (CUCCRealnameRemovalTranslation, error) {
|
|
var result CUCCRealnameRemovalTranslation
|
|
if len(bytes.TrimSpace(body)) == 0 {
|
|
return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调报文为空")
|
|
}
|
|
var outer struct {
|
|
Data string `json:"data"`
|
|
}
|
|
if err := sonic.Unmarshal(body, &outer); err != nil {
|
|
return result, errors.Wrap(errors.CodeInvalidParam, err, "联通解除实名外层 JSON 解析失败")
|
|
}
|
|
if strings.TrimSpace(outer.Data) == "" {
|
|
return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调 data 为空")
|
|
}
|
|
var inner struct {
|
|
ICCID string `json:"iccid"`
|
|
DateChanged string `json:"dateChanged"`
|
|
}
|
|
if err := sonic.Unmarshal([]byte(outer.Data), &inner); err != nil {
|
|
return result, errors.Wrap(errors.CodeInvalidParam, err, "联通解除实名内层 JSON 解析失败")
|
|
}
|
|
result.ICCID = strings.TrimSpace(inner.ICCID)
|
|
result.DateChanged = strings.TrimSpace(inner.DateChanged)
|
|
if validation := pkgvalidator.ValidateICCIDWithoutCarrier(result.ICCID); !validation.Valid {
|
|
return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调 ICCID 无效")
|
|
}
|
|
if result.DateChanged == "" {
|
|
return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调变更时间为空")
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// CUCCCardResolver 复用系统级 ICCID 精确查询约束。
|
|
type CUCCCardResolver = CTCCCardResolver
|
|
|
|
// NewCUCCCardResolver 创建联通回调卡定位器。
|
|
func NewCUCCCardResolver(db *gorm.DB) *CUCCCardResolver {
|
|
return NewCTCCCardResolver(db)
|
|
}
|