117 lines
4.0 KiB
Go
117 lines
4.0 KiB
Go
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
|
||
}
|