Files
junhong_cmp_fiber/internal/infrastructure/carriercallback/cucc_realname_removal.go
break 5c4d17e9fc
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 联调延期
2026-07-24 19:59:24 +08:00

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)
}