Constraint: 切换 main 前必须保存当前七月分支全部项目进展,套餐生效提案仅属于 Iteration/7-11。 Rejected: 将七月套餐修复直接移植到 main | 两个分支的可靠投递架构不同。 Confidence: medium Scope-risk: broad Directive: 不得将本提交整体 cherry-pick 到 main;main 套餐热修必须基于其纯 Asynq 代码独立实施。 Tested: git diff --check;openspec validate fix-package-activation-starvation --strict。 Not-tested: 按用户要求未运行自动化测试;go build ./... 因当前审计改造中的 Enterprise 模型字面量和 role.recordFailure 参数类型错误未通过。
90 lines
3.1 KiB
Go
90 lines
3.1 KiB
Go
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
|
|
}
|
|
|
|
// completeResolvedCarrierCallback 在回调已精确解析卡后补充真实本地资源ID。
|
|
func completeResolvedCarrierCallback(ctx context.Context, repository *integrationlog.Repository, integrationID, result string, stateChanged bool, reason string, cardID uint) error {
|
|
resourceID := strconv.FormatUint(uint64(cardID), 10)
|
|
_, err := repository.Complete(ctx, integrationID, integrationlog.Completion{
|
|
Result: result, HTTPStatus: fiber.StatusOK, StateChanged: stateChanged, ResourceID: &resourceID,
|
|
ResponseSummary: map[string]any{"reason": reason},
|
|
})
|
|
return err
|
|
}
|