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