diff --git a/internal/db/setting.go b/internal/db/setting.go index 7447940..abd99b0 100644 --- a/internal/db/setting.go +++ b/internal/db/setting.go @@ -41,6 +41,7 @@ func FirstOrCreateSettingItemValue(s *model.Setting) error { return db.Where("name = ?", s.Name).Attrs(model.Setting{ Value: s.Value, Type: s.Type, + Group: s.Group, }).FirstOrCreate(s).Error } diff --git a/internal/model/setting.go b/internal/model/setting.go index 82096d0..72eac47 100644 --- a/internal/model/setting.go +++ b/internal/model/setting.go @@ -9,8 +9,16 @@ const ( SettingTypeString SettingType = "string" ) +type SettingGroup string + +const ( + SettingGroupRoom SettingGroup = "room" + SettingGroupUser SettingGroup = "user" +) + type Setting struct { Name string `gorm:"primaryKey"` Value string - Type SettingType `gorm:"not null;default:string"` + Type SettingType `gorm:"not null;default:string"` + Group SettingGroup `gorm:"not null"` } diff --git a/internal/op/op.go b/internal/op/op.go index 95aa65d..64dabbf 100644 --- a/internal/op/op.go +++ b/internal/op/op.go @@ -24,13 +24,14 @@ func initSettings(i ...Setting) error { s := &model.Setting{ Name: b.Name(), Value: b.Raw(), - Type: model.SettingTypeBool, + Type: b.Type(), + Group: b.Group(), } err := db.FirstOrCreateSettingItemValue(s) if err != nil { return err } - b.SetRaw(s.Value) + b.InitRaw(s.Value) } return nil } diff --git a/internal/op/settings.go b/internal/op/settings.go index d979775..7fa6b57 100644 --- a/internal/op/settings.go +++ b/internal/op/settings.go @@ -5,19 +5,43 @@ import ( "github.com/synctv-org/synctv/internal/model" ) -var BoolSettings map[string]BoolSetting +var ( + BoolSettings map[string]BoolSetting +) type Setting interface { Name() string - SetRaw(string) + InitRaw(string) Raw() string Type() model.SettingType + Group() model.SettingGroup + Interface() (any, error) +} + +func GetSettingByGroup(group model.SettingGroup) []Setting { + return settingByGroup(group, ToSettings(BoolSettings)...) +} + +func settingByGroup(group model.SettingGroup, settings ...Setting) []Setting { + s := make([]Setting, 0, len(settings)) + for _, bs := range settings { + if bs.Group() == group { + s = append(s, bs) + } + } + return s } -func ToSettings[s Setting](settings map[string]s) []Setting { - var ss []Setting +func ToSettings[s Setting](settings ...map[string]s) []Setting { + l := 0 for _, v := range settings { - ss = append(ss, v) + l += len(v) + } + var ss []Setting = make([]Setting, 0, l) + for _, v := range settings { + for _, s := range v { + ss = append(ss, s) + } } return ss } @@ -44,7 +68,7 @@ func (b *Bool) Name() string { return b.name } -func (b *Bool) SetRaw(s string) { +func (b *Bool) InitRaw(s string) { if b.value == s { return } @@ -78,6 +102,14 @@ func (b *Bool) Type() model.SettingType { return model.SettingTypeBool } +func (b *Bool) Group() model.SettingGroup { + return model.SettingGroupRoom +} + +func (b *Bool) Interface() (any, error) { + return b.Get() +} + type Int64Setting interface { Set(int64) error Get() (int64, error) diff --git a/server/handlers/admin.go b/server/handlers/admin.go index a04160f..3bbcd96 100644 --- a/server/handlers/admin.go +++ b/server/handlers/admin.go @@ -10,7 +10,7 @@ import ( "github.com/synctv-org/synctv/server/model" ) -func AdminSettings(ctx *gin.Context) { +func EditAdminSettings(ctx *gin.Context) { // user := ctx.MustGet("user").(*op.User) req := model.AdminSettingsReq{} @@ -38,3 +38,25 @@ func AdminSettings(ctx *gin.Context) { ctx.Status(http.StatusNoContent) } + +func AdminSettings(ctx *gin.Context) { + // user := ctx.MustGet("user").(*op.User) + group := ctx.Query("group") + if group == "" { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("group is required")) + return + } + + s := op.GetSettingByGroup(dbModel.SettingGroup(group)) + resp := make(gin.H, len(s)) + for _, v := range s { + i, err := v.Interface() + if err != nil { + ctx.AbortWithError(http.StatusInternalServerError, err) + return + } + resp[v.Name()] = i + } + + ctx.JSON(http.StatusOK, model.NewApiDataResp(resp)) +} diff --git a/server/handlers/init.go b/server/handlers/init.go index 27b1b46..591eb47 100644 --- a/server/handlers/init.go +++ b/server/handlers/init.go @@ -41,7 +41,9 @@ func Init(e *gin.Engine) { admin := api.Group("/admin") admin.Use(middlewares.AuthAdminMiddleware) - admin.POST("/settings", AdminSettings) + admin.GET("/settings", AdminSettings) + + admin.POST("/settings", EditAdminSettings) } {