Files
Message-Push-Nest/service/settings_service/settings.go
T
2025-12-09 21:44:14 +08:00

205 lines
6.4 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 settings_service
import (
"errors"
"fmt"
"strconv"
"github.com/robfig/cron/v3"
"message-nest/models"
"message-nest/pkg/app"
"message-nest/pkg/constant"
"message-nest/pkg/util"
"message-nest/service/cron_service"
)
type UserSettings struct {
UserName string
OldPassword string
NewPassword string
}
// EditUserPasswd 用户设置密码
func (us *UserSettings) EditUserPasswd() error {
ok, _ := models.CheckAuth(us.UserName, us.OldPassword)
if !ok {
return errors.New("旧密码校验失败!")
}
var user = map[string]interface{}{
"password": us.NewPassword,
}
return models.EditUser(us.UserName, user)
}
// GetUserSetting 获取用户设置
func (us *UserSettings) GetUserSetting(section string) (map[string]string, error) {
// 如果是site_config,优先从缓存获取
if section == constant.SiteSettingSectionName {
if IsSiteConfigCacheValid() {
return GetSiteConfigCache(), nil
}
}
result := make(map[string]string)
settings, err := models.GetSettingBySection(section)
if err != nil {
return result, err
}
for _, setting := range settings {
result[setting.Key] = setting.Value
}
// 如果是site_config,更新缓存
if section == constant.SiteSettingSectionName {
SetSiteConfigCache(result)
}
// 版本信息单独获取
if section == constant.AboutSectionName {
result = constant.LatestVersion
// 添加内存使用信息
memoryInfo := util.GetMemoryUsage()
for key, value := range memoryInfo {
result[key] = value
}
}
return result, nil
}
// EditSettings 便捷自定义设置
func (us *UserSettings) EditSettings(section string, key string, value string, currentUser string) error {
setting, _ := models.GetSettingByKey(section, key)
if setting.ID <= 0 {
err := models.AddOneSetting(models.Settings{
IDModel: models.IDModel{
CreatedBy: currentUser,
ModifiedBy: currentUser,
},
Section: section,
Key: key,
Value: value,
})
// 如果是site_config,清除缓存
if section == constant.SiteSettingSectionName {
ClearSiteConfigCache()
}
return err
} else {
if value == "" {
return nil
}
data := make(map[string]interface{})
data["section"] = section
data["key"] = key
data["value"] = value
data["modified_by"] = currentUser
err := models.EditSetting(setting.ID, data)
// 更新日志清理配置
if section == constant.LogsCleanSectionName {
if key == constant.LogsCleanCronKeyName || key == constant.LogsCleanEnabledKeyName {
cronService := cron_service.CronService{}
// 获取最新的cron和enabled值
cronSetting, _ := models.GetSettingByKey(constant.LogsCleanSectionName, constant.LogsCleanCronKeyName)
enabledSetting, _ := models.GetSettingByKey(constant.LogsCleanSectionName, constant.LogsCleanEnabledKeyName)
cronService.UpdateLogsCronRun(cronSetting.Value, enabledSetting.Value == "true")
}
}
// 更新托管消息清理配置
if section == constant.HostedMsgCleanSectionName {
if key == constant.HostedMsgCleanCronKeyName || key == constant.HostedMsgCleanEnabledKeyName {
cronService := cron_service.CronService{}
// 获取最新的cron和enabled值
cronSetting, _ := models.GetSettingByKey(constant.HostedMsgCleanSectionName, constant.HostedMsgCleanCronKeyName)
enabledSetting, _ := models.GetSettingByKey(constant.HostedMsgCleanSectionName, constant.HostedMsgCleanEnabledKeyName)
cronService.UpdateHostedMsgCronRun(cronSetting.Value, enabledSetting.Value == "true")
}
}
// 如果是site_config,清除缓存
if section == constant.SiteSettingSectionName {
ClearSiteConfigCache()
}
return err
}
}
// 站点自定义的结构
type SiteConfig struct {
Title string `json:"title" validate:"omitempty,min=1,max=50" label:"网站标题"`
Slogan string `json:"slogan" validate:"omitempty,min=1,max=50" label:"网站slogan"`
Logo string `json:"logo" validate:"omitempty,min=1" label:"logo"`
CookieExpDays string `json:"cookie_exp_days" validate:"omitempty,numeric,min=1,max=365" label:"cookie过期天数"`
}
type LogConfig struct {
Cron string `json:"cron" validate:"required,cron" label:"日志定时表达式"`
KeepNum string `json:"keep_num" validate:"required,min=1,max=50" label:"日志保留数"`
Enabled string `json:"enabled" validate:"required,oneof=true false" label:"是否启用"`
}
type HostedMsgConfig struct {
Cron string `json:"cron" validate:"required,cron" label:"托管消息定时表达式"`
KeepNum string `json:"keep_num" validate:"required,min=1,max=50" label:"托管消息保留数"`
Enabled string `json:"enabled" validate:"required,oneof=true false" label:"是否启用"`
}
// GetCookieExpDays 获取 cookie 过期天数,若无配置则返回默认值 1
func GetCookieExpDays() int {
// 优先从缓存获取
if IsSiteConfigCacheValid() {
cache := GetSiteConfigCache()
if expDays, ok := cache["cookie_exp_days"]; ok && expDays != "" {
if days, err := strconv.Atoi(expDays); err == nil && days > 0 {
return days
}
}
}
// 从数据库获取
setting, _ := models.GetSettingByKey(constant.SiteSettingSectionName, "cookie_exp_days")
if setting.ID > 0 && setting.Value != "" {
if days, err := strconv.Atoi(setting.Value); err == nil && days > 0 {
return days
}
}
// 返回默认值
return 1
}
// ValidateDiffSetting 校验不同的设置
func (us *UserSettings) ValidateDiffSetting(section string, data map[string]string) string {
if section == constant.SiteSettingSectionName {
var config SiteConfig
config.Title = data["title"]
config.Slogan = data["slogan"]
config.Logo = data["logo"]
config.CookieExpDays = data["cookie_exp_days"]
_, errStr := app.CommonPlaygroundValid(config)
return errStr
}
if section == constant.LogsCleanSectionName {
var config LogConfig
config.Cron = data["cron"]
config.KeepNum = data["keep_num"]
config.Enabled = data["enabled"]
_, err := cron.ParseStandard(config.Cron)
if err != nil {
return fmt.Sprintf("%s 不是合法的corn表达式", config.Cron)
}
_, errStr := app.CommonPlaygroundValid(config)
return errStr
}
if section == constant.HostedMsgCleanSectionName {
var config HostedMsgConfig
config.Cron = data["cron"]
config.KeepNum = data["keep_num"]
config.Enabled = data["enabled"]
_, err := cron.ParseStandard(config.Cron)
if err != nil {
return fmt.Sprintf("%s 不是合法的corn表达式", config.Cron)
}
_, errStr := app.CommonPlaygroundValid(config)
return errStr
}
return fmt.Sprintf("未知的section%s", section)
}