Files
hfb_sys/backend/internal/modules/systemconfig/service_update.go
T
yml2213 98174c0e33 feat(quality-owner): 增加优质号主、极品专区与无忧租号保险
- 支持保证金余额支付、在线支付开通及后台手动设置审计
- 新增极品专区发布权限、赔付方案与保险结算费率快照
- 优化首页、商品卡和个人中心的优质号主身份展示
2026-11-04 15:04:35 +08:00

94 lines
2.9 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 systemconfig
import (
"context"
"strconv"
"strings"
"hfb_sys/backend/internal/modules/qualityowner"
"hfb_sys/backend/internal/modules/rentergrowth"
smsnode "hfb_sys/backend/internal/modules/sms"
)
func (s *Service) Update(ctx context.Context, actorID uint64, key string, req UpdateRequest, meta AuditMeta) (*ConfigDTO, error) {
if s.repo == nil {
return nil, ErrDependencyUnavailable
}
// 备份定时只能通过独立接口修改,避免拥有普通系统配置权限的管理员改变备份策略。
if strings.HasPrefix(key, "backup.") {
return nil, ErrInvalidConfig
}
if key == "" || (req.Value == "" && key != "integration.paddle_ocr_token") {
return nil, ErrInvalidConfig
}
if key == "listing.publish_cooldown_minutes" {
minutes, err := strconv.Atoi(strings.TrimSpace(req.Value))
if err != nil || minutes < 0 {
return nil, ErrInvalidConfig
}
}
if key == publishOptionsConfigKey {
value, err := normalizePublishOptionsValue(req.Value)
if err != nil {
return nil, ErrInvalidConfig
}
req.Value = value
}
if key == rentergrowth.ConfigKey {
cfg, err := rentergrowth.ParseConfigValue(req.Value)
if err != nil {
return nil, ErrInvalidConfig
}
value, err := rentergrowth.MarshalConfig(cfg)
if err != nil {
return nil, ErrInvalidConfig
}
req.Value = value
}
if key == smsnode.ConfigKey {
cfg, err := smsnode.ParseConfigValue(req.Value)
if err != nil {
return nil, ErrInvalidConfig
}
value, err := smsnode.MarshalConfig(cfg)
if err != nil {
return nil, ErrInvalidConfig
}
req.Value = value
}
if key == qualityowner.ConfigKey {
cfg, err := qualityowner.ParseConfigValue(req.Value)
if err != nil {
return nil, ErrInvalidConfig
}
value, err := qualityowner.MarshalConfig(cfg)
if err != nil {
return nil, ErrInvalidConfig
}
req.Value = value
}
return s.repo.Update(ctx, actorID, key, req, meta)
}
func (s *Service) UpdateBackupSchedule(ctx context.Context, actorID uint64, req BackupScheduleDTO, meta AuditMeta) (*BackupScheduleDTO, error) {
if s.repo == nil || req.FullHour < 0 || req.FullHour > 23 || req.FullMinute < 0 || req.FullMinute > 59 || req.BinlogIntervalMinutes < 1 || req.BinlogIntervalMinutes > 5 {
return nil, ErrInvalidConfig
}
updates := []struct {
key string
value string
description string
}{
{"backup.schedule_enabled", strconv.FormatBool(req.Enabled), "在线备份定时任务是否启用"},
{"backup.full_hour", strconv.Itoa(req.FullHour), "每日全量备份小时(Asia/Shanghai)"},
{"backup.full_minute", strconv.Itoa(req.FullMinute), "每日全量备份分钟(Asia/Shanghai)"},
{"backup.binlog_interval_minutes", strconv.Itoa(req.BinlogIntervalMinutes), "binlog 归档间隔分钟(1-5)"},
}
for _, item := range updates {
if _, err := s.repo.Update(ctx, actorID, item.key, UpdateRequest{Value: item.value, Description: item.description}, meta); err != nil {
return nil, err
}
}
return &req, nil
}