Files
go_process_manager/internal/app/logic/config.go
2025-02-10 17:23:02 +08:00

145 lines
3.4 KiB
Go

package logic
import (
"reflect"
"strconv"
"github.com/lzh-1625/go_process_manager/config"
"github.com/lzh-1625/go_process_manager/internal/app/model"
"github.com/lzh-1625/go_process_manager/internal/app/repository"
)
type configLogic struct{}
var (
ConfigLogic = new(configLogic)
)
func (c *configLogic) GetSystemConfiguration() []model.SystemConfigurationVo {
result := []model.SystemConfigurationVo{}
typeElem := reflect.TypeOf(config.CF).Elem()
valueElem := reflect.ValueOf(config.CF).Elem()
for i := 0; i < typeElem.NumField(); i++ {
typeField := typeElem.Field(i)
valueField := valueElem.Field(i)
defaultValue := typeField.Tag.Get("default")
if defaultValue == "-" {
continue
}
var value any
switch typeField.Type.Kind() {
case reflect.Int64, reflect.Int:
value = valueField.Int()
case reflect.String:
value = valueField.String()
case reflect.Bool:
value = valueField.Bool()
case reflect.Float64:
value = valueField.Float()
default:
continue
}
result = append(result, model.SystemConfigurationVo{
Key: typeField.Name,
Value: value,
Default: defaultValue,
Describe: typeField.Tag.Get("describe"),
})
}
return result
}
func (c *configLogic) SetSystemConfiguration(kv map[string]string) error {
typeElem := reflect.TypeOf(config.CF).Elem()
valueElem := reflect.ValueOf(config.CF).Elem()
for i := 0; i < typeElem.NumField(); i++ {
typeField := typeElem.Field(i)
valueField := valueElem.Field(i)
for k, v := range kv {
if typeField.Name == k {
var err error
switch typeField.Type.Kind() {
case reflect.String:
valueField.SetString(v)
case reflect.Bool:
value, errV := strconv.ParseBool(v)
err = errV
if err == nil {
valueField.SetBool(value)
}
case reflect.Float64:
value, errV := strconv.ParseFloat(v, 64)
err = errV
if err == nil {
valueField.SetFloat(value)
}
case reflect.Int64, reflect.Int:
value, errV := strconv.ParseInt(v, 10, 64)
err = errV
if err == nil {
valueField.SetInt(value)
}
default:
continue
}
if err != nil {
return err
}
err = repository.ConfigRepository.SetConfigValue(k, v)
if err != nil {
return err
}
}
}
}
return nil
}
// reset system config to default
func (c *configLogic) ResetSystemConfiguration() error {
typeElem := reflect.TypeOf(config.CF).Elem()
valueElem := reflect.ValueOf(config.CF).Elem()
for i := 0; i < typeElem.NumField(); i++ {
typeField := typeElem.Field(i)
valueField := valueElem.Field(i)
var err error
defaultValue := typeField.Tag.Get("default")
if defaultValue == "-" {
continue
}
switch typeField.Type.Kind() {
case reflect.String:
valueField.SetString(defaultValue)
case reflect.Bool:
value, errV := strconv.ParseBool(defaultValue)
err = errV
if err == nil {
valueField.SetBool(value)
}
case reflect.Float64:
value, errV := strconv.ParseFloat(defaultValue, 64)
err = errV
if err == nil {
valueField.SetFloat(value)
}
case reflect.Int64, reflect.Int:
value, errV := strconv.ParseInt(defaultValue, 10, 64)
err = errV
if err == nil {
valueField.SetInt(value)
}
default:
continue
}
if err != nil {
return err
}
err = repository.ConfigRepository.SetConfigValue(typeField.Name, defaultValue)
if err != nil {
return err
}
}
return nil
}