Files
lijiaoqiao/supply-api/internal/compensation/compensation.go
2026-04-13 20:56:02 +08:00

117 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package compensation
import (
"context"
"encoding/json"
"fmt"
"lijiaoqiao/supply-api/internal/audit/sanitizer"
"lijiaoqiao/supply-api/internal/pkg/logging"
)
type operationHandler func(ctx context.Context, payload json.RawMessage) error
// DefaultCompensationExecutor 默认补偿执行器
type DefaultCompensationExecutor struct {
sanitizer *sanitizer.Sanitizer // 用于脱敏日志输出
handlers map[string]operationHandler
}
// NewDefaultCompensationExecutor 创建默认补偿执行器
func NewDefaultCompensationExecutor() *DefaultCompensationExecutor {
executor := &DefaultCompensationExecutor{
sanitizer: sanitizer.NewSanitizer(),
}
executor.handlers = map[string]operationHandler{
"account.create": executor.CompensateAccountCreate,
"package.publish": executor.CompensatePackagePublish,
"settlement.withdraw": executor.CompensateSettlementWithdraw,
"quota.deduct": executor.CompensateQuotaDeduct,
}
return executor
}
// Execute 执行补偿操作
func (e *DefaultCompensationExecutor) Execute(ctx context.Context, operationType string, payload json.RawMessage) error {
handler, ok := e.handlers[operationType]
if !ok {
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)
}
return handler(ctx, payload)
}
// 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
}