Feat: get admin setting

pull/21/head
zijiren233 2 years ago
parent f8ab5d4da6
commit 3085eb800b

@ -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
}

@ -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"`
Group SettingGroup `gorm:"not null"`
}

@ -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
}

@ -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)

@ -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))
}

@ -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)
}
{

Loading…
Cancel
Save