88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type (
 | 
						|
	SettingsService struct {
 | 
						|
		db *DB
 | 
						|
	}
 | 
						|
)
 | 
						|
 | 
						|
type settings struct {
 | 
						|
	FoodDaysLookback           int `default:"30" json:"foodDaysLookback"`
 | 
						|
	FoodAggregatedDaysLookback int `default:"30" json:"foodAggregatedDaysLookback"`
 | 
						|
	FoodDailyLookback          int `default:"30" json:"foodDailyLookback"`
 | 
						|
	FoodWeeklyLookback         int `default:"4" json:"foodWeeklyLookback"`
 | 
						|
	FoodMonthlyLookback        int `default:"4" json:"foodMonthlyLookback"`
 | 
						|
	FoodYearlyLookback         int `default:"2" json:"foodYearlyLookback"`
 | 
						|
 | 
						|
	WeightDaysLookback           int `default:"30" json:"weightDaysLookback"`
 | 
						|
	WeightAggregatedDaysLookback int `default:"30" json:"weightAggregatedDaysLookback"`
 | 
						|
	WeightDailyLookback          int `default:"30" json:"weightDailyLookback"`
 | 
						|
	WeightWeeklyLookback         int `default:"4" json:"weightWeeklyLookback"`
 | 
						|
	WeightMonthlyLookback        int `default:"4" json:"weightMonthlyLookback"`
 | 
						|
	WeightYearlyLookback         int `default:"2" json:"weightYearlyLookback"`
 | 
						|
 | 
						|
	Target int `default:"2000" json:"target"`
 | 
						|
	Limit  int `default:"2500" json:"limit"`
 | 
						|
}
 | 
						|
 | 
						|
var Settings settings
 | 
						|
 | 
						|
func (s *SettingsService) LoadSettings() error {
 | 
						|
	if s.db == nil || !s.db.Ready {
 | 
						|
		return fmt.Errorf("cannot load Settings, db is nil or is not ready")
 | 
						|
	}
 | 
						|
 | 
						|
	settingsValue := reflect.ValueOf(&Settings).Elem()
 | 
						|
	settingsType := settingsValue.Type()
 | 
						|
 | 
						|
	for i := 0; i < settingsValue.NumField(); i++ {
 | 
						|
		field := settingsType.Field(i)
 | 
						|
		key := field.Name
 | 
						|
 | 
						|
		var value int
 | 
						|
		err := s.db.readConn.QueryRow("SELECT value FROM settings WHERE key = ?", key).Scan(&value)
 | 
						|
		if err != nil {
 | 
						|
			log.Printf("error getting setting for key %s: %v; setting default", key, err)
 | 
						|
			_, err := s.db.writeConn.Exec("INSERT INTO settings (key, value) VALUES (?, ?)", key, field.Tag.Get("default"))
 | 
						|
			if err != nil {
 | 
						|
				Error.Printf("error inserting setting for key %s: %v", key, err)
 | 
						|
				continue
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		settingsValue.Field(i).SetInt(int64(value))
 | 
						|
		log.Println(key, value)
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
func (s *SettingsService) Set(key string, value int64) (settings, error) {
 | 
						|
	if s == nil || s.db == nil || !s.db.Ready {
 | 
						|
		return Settings, fmt.Errorf("cannot set setting, db is nil or is not ready")
 | 
						|
	}
 | 
						|
 | 
						|
	key = strings.ToLower(key)
 | 
						|
	fields := reflect.ValueOf(&Settings).Elem()
 | 
						|
	for i := 0; i < fields.NumField(); i++ {
 | 
						|
		field := fields.Type().Field(i)
 | 
						|
		fieldName := strings.ToLower(field.Name)
 | 
						|
		if fieldName == key {
 | 
						|
			fields.Field(i).SetInt(value)
 | 
						|
			_, err := s.db.writeConn.Exec("UPDATE settings SET value = ? WHERE lower(key) = ?", value, key)
 | 
						|
			if err != nil {
 | 
						|
				Error.Printf("error updating setting for key %s: %v", key, err)
 | 
						|
				return Settings, err
 | 
						|
			}
 | 
						|
 | 
						|
			return Settings, nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return Settings, fmt.Errorf("key %s not found", key)
 | 
						|
}
 |