收口七月卡状态回调与系列授权兼容契约
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
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 联调延期
This commit is contained in:
79
internal/handler/callback/carrier_switch.go
Normal file
79
internal/handler/callback/carrier_switch.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package callback
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/infrastructure/integrationlog"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||||
apperrors "github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/middleware"
|
||||
)
|
||||
|
||||
// SystemConfigReader 提供运营商回调运行时开关读取能力。
|
||||
type SystemConfigReader interface {
|
||||
Get(ctx context.Context, key string) (string, error)
|
||||
}
|
||||
|
||||
func carrierCallbackEnabled(ctx context.Context, reader SystemConfigReader, key string) (bool, error) {
|
||||
if reader == nil {
|
||||
return false, apperrors.New(apperrors.CodeInternalError, "运营商回调启停配置未装配")
|
||||
}
|
||||
value, err := reader.Get(ctx, key)
|
||||
if err != nil {
|
||||
return false, apperrors.Wrap(apperrors.CodeInternalError, err, "读取运营商回调启停配置失败")
|
||||
}
|
||||
enabled, err := strconv.ParseBool(value)
|
||||
if err != nil {
|
||||
return false, apperrors.Wrap(apperrors.CodeInternalError, err, "运营商回调启停配置值无效")
|
||||
}
|
||||
return enabled, nil
|
||||
}
|
||||
|
||||
func recordDisabledCarrierCallback(
|
||||
ctx context.Context,
|
||||
repository *integrationlog.Repository,
|
||||
provider string,
|
||||
operation string,
|
||||
integrationPrefix string,
|
||||
body []byte,
|
||||
contentType string,
|
||||
) error {
|
||||
if repository == nil {
|
||||
return apperrors.New(apperrors.CodeInternalError, "运营商回调留痕能力未配置")
|
||||
}
|
||||
payloadHash := shortHashBytes(body)
|
||||
key := integrationPrefix + "-disabled-body:" + payloadHash
|
||||
requestID := middleware.GetRequestIDFromContext(ctx)
|
||||
log, created, err := repository.RecordInbound(ctx, integrationlog.InboundAttempt{
|
||||
IntegrationID: integrationPrefix + "-disabled:" + shortHash(key),
|
||||
IdempotencyKey: key,
|
||||
Provider: provider,
|
||||
Operation: operation,
|
||||
ResourceType: constants.CardObservationResourceTypeCard,
|
||||
RawPayload: body,
|
||||
ContentType: contentType,
|
||||
RequestID: requestID,
|
||||
CorrelationID: requestID,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !created {
|
||||
if log == nil || log.Result != constants.IntegrationResultPending {
|
||||
return nil
|
||||
}
|
||||
claimed, claimErr := repository.ClaimExpiredInboundPending(ctx, log.IntegrationID, constants.IntegrationInboundProcessingLease)
|
||||
if claimErr != nil || !claimed {
|
||||
return claimErr
|
||||
}
|
||||
}
|
||||
_, err = repository.Complete(ctx, log.IntegrationID, integrationlog.Completion{
|
||||
Result: constants.IntegrationResultIgnored,
|
||||
HTTPStatus: fiber.StatusOK,
|
||||
ResponseSummary: map[string]any{"reason": "后台配置已关闭该运营商回调"},
|
||||
})
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user