Files
nl-pms-api/internal/service/settings.go
2026-08-15 17:04:47 +08:00

95 lines
2.9 KiB
Go
Raw Permalink 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 service
import (
"strings"
"gorm.io/gorm"
"nl-pms-api/internal/commonservice"
"nl-pms-api/internal/model"
)
// SettingsService 用户设置与全局资源fest_img:* / file_storage
type SettingsService struct {
DB *gorm.DB
}
func isGlobalSetting(name string) bool {
return name == "file_storage" || strings.HasPrefix(name, "fest_img:")
}
func settingOwner(userID int64, name string) int64 {
if isGlobalSetting(name) {
return commonservice.AdminUserID
}
return userID
}
// GetSetting 读取单条设置;全局键从管理员账号读。
func (s *SettingsService) GetSetting(userID int64, name string) (*model.SyncSetting, error) {
name = strings.TrimSpace(name)
if name == "" {
return nil, commonservice.BadRequest("SETTING_NAME_REQUIRED")
}
owner := settingOwner(userID, name)
var row model.SyncSetting
if err := s.DB.Where("user_id = ? AND name = ?", owner, name).First(&row).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, commonservice.NotFound("NOT_FOUND")
}
return nil, commonservice.Internal("QUERY_FAILED")
}
return &row, nil
}
// ListByPrefix 按前缀批量拉取(如 fest_img:),全局前缀从管理员账号读。
func (s *SettingsService) ListByPrefix(userID int64, prefix string) ([]model.SyncSetting, error) {
prefix = strings.TrimSpace(prefix)
if prefix == "" {
return nil, commonservice.BadRequest("SETTING_PREFIX_REQUIRED")
}
owner := userID
if strings.HasPrefix(prefix, "fest_img:") || prefix == "fest_img:" {
owner = commonservice.AdminUserID
}
var rows []model.SyncSetting
if err := s.DB.Where("user_id = ? AND name LIKE ?", owner, prefix+"%").
Order("name").Find(&rows).Error; err != nil {
return nil, commonservice.Internal("QUERY_FAILED")
}
if rows == nil {
rows = []model.SyncSetting{}
}
return rows, nil
}
// GetGlobal 读取挂在管理员名下的全局设置。
func (s *SettingsService) GetGlobal(name string) (*model.SyncSetting, error) {
return s.GetSetting(commonservice.AdminUserID, name)
}
// PutSetting LWW 写入;全局键仅管理员可写,且落在 user_id=1。
func (s *SettingsService) PutSetting(userID int64, name, value, updatedAt string) error {
name = strings.TrimSpace(name)
if name == "" {
return commonservice.BadRequest("SETTING_NAME_REQUIRED")
}
if updatedAt == "" {
updatedAt = commonservice.NowRFC()
}
owner := userID
if isGlobalSetting(name) {
if userID != commonservice.AdminUserID {
return commonservice.Forbidden("FORBIDDEN")
}
owner = commonservice.AdminUserID
}
q := `INSERT INTO sync_settings(user_id,name,value,updated_at) VALUES(?,?,?,?)
ON DUPLICATE KEY UPDATE value=IF(VALUES(updated_at)>updated_at,VALUES(value),value),
updated_at=IF(VALUES(updated_at)>updated_at,VALUES(updated_at),updated_at)`
if err := s.DB.Exec(q, owner, name, value, updatedAt).Error; err != nil {
return commonservice.Internal("SAVE_FAILED")
}
return nil
}