package service import ( "errors" "regexp" "strings" "github.com/freefire/jiang13-bbs/model" "gorm.io/gorm" ) // 站点设置键 const ( // SettingKeyAccent 站点主题色(浅色基准,#rrggbb);为空表示使用内置默认色 SettingKeyAccent = "theme_accent" // SettingKeyTrustReviewedPublish 已过审用户后续发帖/评论免审;缺行视为开启(默认开) SettingKeyTrustReviewedPublish = "trust_reviewed_publish" ) // ErrInvalidAccent 主题色格式非法 var ErrInvalidAccent = errors.New("主题色格式不正确,应为 #RRGGBB") var accentHexRe = regexp.MustCompile(`^#[0-9a-fA-F]{6}$`) // SettingService 站点级键值设置(主题色等外观配置) type SettingService struct { db *gorm.DB } func NewSettingService(db *gorm.DB) *SettingService { return &SettingService{db: db} } // AccentColor 返回配置的主题色(小写 #rrggbb);未配置时返回空串,表示走前端默认色 func (s *SettingService) AccentColor() (string, error) { var st model.SiteSetting err := s.db.Where("key = ?", SettingKeyAccent).First(&st).Error if errors.Is(err, gorm.ErrRecordNotFound) { return "", nil } if err != nil { return "", err } return strings.ToLower(st.Value), nil } // SetAccent 校验并保存主题色;hex 传空串表示恢复默认(删除该键) func (s *SettingService) SetAccent(hex string) error { hex = strings.TrimSpace(strings.ToLower(hex)) if hex == "" { return s.db.Where("key = ?", SettingKeyAccent).Delete(&model.SiteSetting{}).Error } if !accentHexRe.MatchString(hex) { return ErrInvalidAccent } // UPSERT:键冲突时更新值与时间戳 st := model.SiteSetting{Key: SettingKeyAccent, Value: hex} return s.db.Save(&st).Error } // TrustReviewedPublish 是否对「已有过审内容」的用户免审。 // KV 缺行 / 空值视为开启(默认开);仅显式写入 false/0/off/no 为关闭。 // 不用 GORM bool default:true,避免零值省略陷阱。 func (s *SettingService) TrustReviewedPublish() (bool, error) { var st model.SiteSetting err := s.db.Where("key = ?", SettingKeyTrustReviewedPublish).First(&st).Error if errors.Is(err, gorm.ErrRecordNotFound) { return true, nil } if err != nil { return true, err } v := strings.TrimSpace(strings.ToLower(st.Value)) switch v { case "false", "0", "off", "no": return false, nil default: return true, nil } } // SetTrustReviewedPublish 持久化免审开关;开启时删除键以保持「缺行=默认开」语义 func (s *SettingService) SetTrustReviewedPublish(on bool) error { if on { return s.db.Where("key = ?", SettingKeyTrustReviewedPublish).Delete(&model.SiteSetting{}).Error } st := model.SiteSetting{Key: SettingKeyTrustReviewedPublish, Value: "false"} return s.db.Save(&st).Error }