settings.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package system
  2. import (
  3. "github.com/0xJacky/Nginx-UI/api"
  4. "github.com/0xJacky/Nginx-UI/settings"
  5. "github.com/gin-gonic/gin"
  6. "net/http"
  7. "reflect"
  8. )
  9. func GetSettings(c *gin.Context) {
  10. c.JSON(http.StatusOK, gin.H{
  11. "server": settings.ServerSettings,
  12. "nginx": settings.NginxSettings,
  13. "openai": settings.OpenAISettings,
  14. })
  15. }
  16. func SaveSettings(c *gin.Context) {
  17. var json struct {
  18. Server settings.Server `json:"server"`
  19. Nginx settings.Nginx `json:"nginx"`
  20. Openai settings.OpenAI `json:"openai"`
  21. }
  22. if !api.BindAndValid(c, &json) {
  23. return
  24. }
  25. // todo: omit protected fields when binding
  26. fillSettings(&settings.ServerSettings, &json.Server)
  27. fillSettings(&settings.NginxSettings, &json.Nginx)
  28. fillSettings(&settings.OpenAISettings, &json.Openai)
  29. settings.ReflectFrom()
  30. err := settings.Save()
  31. if err != nil {
  32. api.ErrHandler(c, err)
  33. return
  34. }
  35. GetSettings(c)
  36. }
  37. func fillSettings(targetSettings interface{}, newSettings interface{}) {
  38. s := reflect.TypeOf(targetSettings).Elem()
  39. vt := reflect.ValueOf(targetSettings).Elem()
  40. vn := reflect.ValueOf(newSettings).Elem()
  41. // copy the values from new to target settings if it is not protected
  42. for i := 0; i < s.NumField(); i++ {
  43. if s.Field(i).Tag.Get("protected") != "true" {
  44. vt.Field(i).Set(vn.Field(i))
  45. }
  46. }
  47. }