- Implemented initialization for the Setting Registry during the Load process. - Added reload functionality to refresh the Setting Registry as needed. - Enhanced error handling to capture and report issues during initialization and reloading.
130 lines
3 KiB
Go
130 lines
3 KiB
Go
package setting
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/yaoapp/gou/process"
|
|
"github.com/yaoapp/kun/exception"
|
|
)
|
|
|
|
func init() {
|
|
process.RegisterGroup("setting", map[string]process.Handler{
|
|
"get": ProcessGet,
|
|
"getmerged": ProcessGetMerged,
|
|
"set": ProcessSet,
|
|
"delete": ProcessDelete,
|
|
"listnamespaces": ProcessListNamespaces,
|
|
})
|
|
}
|
|
|
|
func requireGlobal() {
|
|
if Global == nil {
|
|
exception.New("Setting Registry not initialized", 500).Throw()
|
|
}
|
|
}
|
|
|
|
func parseScopeID(arg interface{}) ScopeID {
|
|
raw, err := json.Marshal(arg)
|
|
if err != nil {
|
|
exception.New("invalid scope: "+err.Error(), 400).Throw()
|
|
}
|
|
var scope ScopeID
|
|
if err := json.Unmarshal(raw, &scope); err != nil {
|
|
exception.New("invalid scope: "+err.Error(), 400).Throw()
|
|
}
|
|
return scope
|
|
}
|
|
|
|
// ProcessGet reads a namespace entry for a given scope.
|
|
// Args[0] map: ScopeID {scope, team_id?, user_id?}
|
|
// Args[1] string: namespace
|
|
func ProcessGet(p *process.Process) interface{} {
|
|
requireGlobal()
|
|
p.ValidateArgNums(2)
|
|
|
|
scope := parseScopeID(p.Args[0])
|
|
ns := p.ArgsString(1)
|
|
|
|
data, err := Global.Get(scope, ns)
|
|
if err != nil {
|
|
exception.New(err.Error(), 404).Throw()
|
|
}
|
|
return data
|
|
}
|
|
|
|
// ProcessGetMerged reads a namespace with three-level cascade merge.
|
|
// Args[0] string: userID
|
|
// Args[1] string: teamID
|
|
// Args[2] string: namespace
|
|
func ProcessGetMerged(p *process.Process) interface{} {
|
|
requireGlobal()
|
|
p.ValidateArgNums(3)
|
|
|
|
userID := p.ArgsString(0)
|
|
teamID := p.ArgsString(1)
|
|
ns := p.ArgsString(2)
|
|
|
|
data, err := Global.GetMerged(userID, teamID, ns)
|
|
if err != nil {
|
|
exception.New(err.Error(), 404).Throw()
|
|
}
|
|
return data
|
|
}
|
|
|
|
// ProcessSet writes a namespace entry for a given scope.
|
|
// Args[0] map: ScopeID
|
|
// Args[1] string: namespace
|
|
// Args[2] map: data
|
|
func ProcessSet(p *process.Process) interface{} {
|
|
requireGlobal()
|
|
p.ValidateArgNums(3)
|
|
|
|
scope := parseScopeID(p.Args[0])
|
|
ns := p.ArgsString(1)
|
|
|
|
raw, err := json.Marshal(p.Args[2])
|
|
if err != nil {
|
|
exception.New("invalid data: "+err.Error(), 400).Throw()
|
|
}
|
|
var data map[string]interface{}
|
|
if err := json.Unmarshal(raw, &data); err != nil {
|
|
exception.New("invalid data: "+err.Error(), 400).Throw()
|
|
}
|
|
|
|
entry, err := Global.Set(scope, ns, data)
|
|
if err != nil {
|
|
exception.New(err.Error(), 400).Throw()
|
|
}
|
|
return entry
|
|
}
|
|
|
|
// ProcessDelete removes a namespace entry from a given scope.
|
|
// Args[0] map: ScopeID
|
|
// Args[1] string: namespace
|
|
func ProcessDelete(p *process.Process) interface{} {
|
|
requireGlobal()
|
|
p.ValidateArgNums(2)
|
|
|
|
scope := parseScopeID(p.Args[0])
|
|
ns := p.ArgsString(1)
|
|
|
|
if err := Global.Delete(scope, ns); err != nil {
|
|
exception.New(err.Error(), 404).Throw()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ProcessListNamespaces returns all namespace names under a scope.
|
|
// Args[0] map: ScopeID
|
|
func ProcessListNamespaces(p *process.Process) interface{} {
|
|
requireGlobal()
|
|
p.ValidateArgNums(1)
|
|
|
|
scope := parseScopeID(p.Args[0])
|
|
|
|
ns, err := Global.ListNamespaces(scope)
|
|
if err != nil {
|
|
exception.New(err.Error(), 500).Throw()
|
|
}
|
|
return ns
|
|
}
|