将所有 log.Printf/Println 调用替换为 logging.Logger 结构化日志输出: - internal/middleware/auth.go: AUTH_WARNING 和 AUTH_ERROR 日志 - internal/middleware/middleware.go: Recovery 中间件 panic 日志 - internal/domain/account.go: emitAudit 审计错误日志 - internal/domain/settlement.go: emitAudit 审计错误日志 - internal/domain/package.go: emitAudit 审计错误日志 - internal/domain/compensation.go: 补偿处理器所有日志 - internal/compensation/compensation.go: 补偿执行器所有日志 - internal/outbox/outbox.go: OutboxProcessor 所有日志 - internal/iam/middleware/scope_auth.go: WILDCARD_SCOPE_ACCESS 审计日志 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
120 lines
4.1 KiB
Go
120 lines
4.1 KiB
Go
package compensation
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
|
||
"lijiaoqiao/supply-api/internal/audit/sanitizer"
|
||
"lijiaoqiao/supply-api/internal/pkg/logging"
|
||
)
|
||
|
||
// DefaultCompensationExecutor 默认补偿执行器
|
||
type DefaultCompensationExecutor struct {
|
||
sanitizer *sanitizer.Sanitizer // 用于脱敏日志输出
|
||
}
|
||
|
||
// NewDefaultCompensationExecutor 创建默认补偿执行器
|
||
func NewDefaultCompensationExecutor() *DefaultCompensationExecutor {
|
||
return &DefaultCompensationExecutor{
|
||
sanitizer: sanitizer.NewSanitizer(),
|
||
}
|
||
}
|
||
|
||
// Execute 执行补偿操作
|
||
func (e *DefaultCompensationExecutor) Execute(ctx context.Context, operationType string, payload json.RawMessage) error {
|
||
// 根据operationType执行相应的补偿操作
|
||
// operationType 示例:
|
||
// - "account.create" - 账号创建失败补偿
|
||
// - "package.publish" - 套餐发布失败补偿
|
||
// - "settlement.withdraw" - 提现失败补偿
|
||
// - "quota.deduct" - 配额扣减失败补偿
|
||
|
||
switch operationType {
|
||
case "account.create":
|
||
return e.CompensateAccountCreate(ctx, payload)
|
||
case "package.publish":
|
||
return e.CompensatePackagePublish(ctx, payload)
|
||
case "settlement.withdraw":
|
||
return e.CompensateSettlementWithdraw(ctx, payload)
|
||
case "quota.deduct":
|
||
return e.CompensateQuotaDeduct(ctx, payload)
|
||
default:
|
||
logger := logging.NewLogger("supply-api", logging.LogLevelWarn)
|
||
logger.Warn("compensation executor: unknown operation type", map[string]interface{}{
|
||
"operation_type": operationType,
|
||
"masked_payload": e.maskPayload(payload),
|
||
})
|
||
return fmt.Errorf("unknown operation type: %s", operationType)
|
||
}
|
||
}
|
||
|
||
// maskPayload 对payload进行脱敏处理
|
||
func (e *DefaultCompensationExecutor) maskPayload(payload json.RawMessage) string {
|
||
if len(payload) == 0 {
|
||
return "<empty>"
|
||
}
|
||
// 尝试解析为JSON map进行字段级脱敏
|
||
var data map[string]interface{}
|
||
if err := json.Unmarshal(payload, &data); err != nil {
|
||
// 如果不是JSON,直接脱敏整个字符串
|
||
return e.sanitizer.Mask(string(payload))
|
||
}
|
||
// 对map进行脱敏
|
||
masked := e.sanitizer.MaskMap(data)
|
||
// 转换回JSON字符串
|
||
maskedJSON, err := json.Marshal(masked)
|
||
if err != nil {
|
||
return e.sanitizer.Mask(string(payload))
|
||
}
|
||
return string(maskedJSON)
|
||
}
|
||
|
||
// CompensateAccountCreate 补偿账号创建
|
||
func (e *DefaultCompensationExecutor) CompensateAccountCreate(ctx context.Context, payload json.RawMessage) error {
|
||
logger := logging.NewLogger("supply-api", logging.LogLevelInfo)
|
||
logger.Info("compensation executor: executing account create compensation", map[string]interface{}{
|
||
"masked_payload": e.maskPayload(payload),
|
||
})
|
||
// 实际实现:删除已创建的账号资源
|
||
// 1. 调用账号服务的删除接口
|
||
// 2. 释放相关资源
|
||
return nil
|
||
}
|
||
|
||
// CompensatePackagePublish 补偿套餐发布
|
||
func (e *DefaultCompensationExecutor) CompensatePackagePublish(ctx context.Context, payload json.RawMessage) error {
|
||
logger := logging.NewLogger("supply-api", logging.LogLevelInfo)
|
||
logger.Info("compensation executor: executing package publish compensation", map[string]interface{}{
|
||
"masked_payload": e.maskPayload(payload),
|
||
})
|
||
// 实际实现:回滚已发布的套餐
|
||
// 1. 将套餐状态改为draft
|
||
// 2. 或直接删除套餐
|
||
return nil
|
||
}
|
||
|
||
// CompensateSettlementWithdraw 补偿提现
|
||
func (e *DefaultCompensationExecutor) CompensateSettlementWithdraw(ctx context.Context, payload json.RawMessage) error {
|
||
logger := logging.NewLogger("supply-api", logging.LogLevelInfo)
|
||
logger.Info("compensation executor: executing settlement withdraw compensation", map[string]interface{}{
|
||
"masked_payload": e.maskPayload(payload),
|
||
})
|
||
// 实际实现:回滚提现状态
|
||
// 1. 将结算单状态改为failed
|
||
// 2. 恢复用户余额
|
||
return nil
|
||
}
|
||
|
||
// CompensateQuotaDeduct 补偿配额扣减
|
||
func (e *DefaultCompensationExecutor) CompensateQuotaDeduct(ctx context.Context, payload json.RawMessage) error {
|
||
logger := logging.NewLogger("supply-api", logging.LogLevelInfo)
|
||
logger.Info("compensation executor: executing quota deduct compensation", map[string]interface{}{
|
||
"masked_payload": e.maskPayload(payload),
|
||
})
|
||
// 实际实现:回滚配额扣减
|
||
// 1. 恢复套餐可用配额
|
||
// 2. 减少已售配额
|
||
return nil
|
||
}
|