111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
package settings
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
"sync"
|
|
|
|
"gorm.io/gorm"
|
|
"lst.net/internal/models"
|
|
)
|
|
|
|
var (
|
|
// Global state
|
|
appSettings []models.Settings
|
|
appSettingsLock sync.RWMutex
|
|
dbInstance *gorm.DB
|
|
)
|
|
|
|
// Initialize loads settings into memory at startup
|
|
func Initialize(db *gorm.DB) error {
|
|
dbInstance = db
|
|
return Refresh()
|
|
}
|
|
|
|
// Refresh reloads settings from DB (call after updates)
|
|
func Refresh() error {
|
|
appSettingsLock.Lock()
|
|
defer appSettingsLock.Unlock()
|
|
|
|
var settings []models.Settings
|
|
if err := dbInstance.Find(&settings).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
appSettings = settings
|
|
return nil
|
|
}
|
|
|
|
// GetAll returns a thread-safe copy of settings
|
|
func GetAll() []models.Settings {
|
|
appSettingsLock.RLock()
|
|
defer appSettingsLock.RUnlock()
|
|
|
|
// Return copy to prevent external modification
|
|
copied := make([]models.Settings, len(appSettings))
|
|
copy(copied, appSettings)
|
|
return copied
|
|
}
|
|
|
|
// GetMap returns settings as []map[string]interface{}
|
|
func GetMap() []map[string]interface{} {
|
|
return convertToMap(GetAll())
|
|
}
|
|
|
|
// convertToMap helper (move your existing conversion logic here)
|
|
func convertToMap(settings []models.Settings) []map[string]interface{} {
|
|
toLowercase := func(s models.Settings) map[string]interface{} {
|
|
t := reflect.TypeOf(s)
|
|
v := reflect.ValueOf(s)
|
|
|
|
data := make(map[string]interface{})
|
|
|
|
for i := 0; i < t.NumField(); i++ {
|
|
field := strings.ToLower(t.Field(i).Name)
|
|
data[field] = v.Field(i).Interface()
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
// Convert each struct in settings slice to a map with lowercase keys
|
|
var lowercaseSettings []map[string]interface{}
|
|
for _, setting := range settings {
|
|
lowercaseSettings = append(lowercaseSettings, toLowercase(setting))
|
|
}
|
|
|
|
return lowercaseSettings
|
|
}
|
|
|
|
func GetString(name string) (string, error) {
|
|
appSettingsLock.RLock()
|
|
defer appSettingsLock.RUnlock()
|
|
|
|
for _, s := range appSettings {
|
|
if s.Name == name { // assuming your model has a "Name" field
|
|
fmt.Println(s.Value)
|
|
return s.Value, nil // assuming your model has a "Value" field
|
|
}
|
|
}
|
|
return "", errors.New("setting not found")
|
|
}
|
|
|
|
func SetTemp(name, value string) {
|
|
appSettingsLock.Lock()
|
|
defer appSettingsLock.Unlock()
|
|
|
|
for i, s := range appSettings {
|
|
if s.Name == name {
|
|
appSettings[i].Value = value
|
|
return
|
|
}
|
|
}
|
|
// If not found, add new setting
|
|
appSettings = append(appSettings, models.Settings{
|
|
Name: name,
|
|
Value: value,
|
|
})
|
|
}
|