Add read-only multi-server API (step 2) + dedupe serverID validation

GET /servers lists registered servers; GET /servers/:id/clients returns
that server's client list (filtered in-handler, store.GetClients isn't
server-scoped yet - that's a later step). Old routes untouched.

Also factors the repeated serverID validation guard in jsondb.go's new
server-scoped methods into one validateServerID() helper, per a code
simplification review.
This commit is contained in:
sysops
2026-07-11 22:41:10 +02:00
parent 7eca2d01b8
commit a946c059c3
3 changed files with 73 additions and 14 deletions
+23 -14
View File
@@ -556,11 +556,20 @@ func (o *JsonDB) GetServers() ([]model.Server, error) {
return servers, nil
}
// validateServerID checks a server ID before it is ever used as a jsondb
// record key, shared by every server-scoped store method below.
func validateServerID(serverID string) error {
if !util.ValidateRecordID(serverID) {
return fmt.Errorf("invalid server id: %s", serverID)
}
return nil
}
// GetServerByID func to query a single server by id from the database
func (o *JsonDB) GetServerByID(serverID string) (model.Server, error) {
server := model.Server{}
if !util.ValidateRecordID(serverID) {
return server, fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return server, err
}
err := o.conn.Read("servers", serverID, &server)
return server, err
@@ -571,8 +580,8 @@ func (o *JsonDB) CreateServer(server model.Server) error {
if server.ID == "" {
return fmt.Errorf("cannot create server: missing id")
}
if !util.ValidateRecordID(server.ID) {
return fmt.Errorf("invalid server id: %s", server.ID)
if err := validateServerID(server.ID); err != nil {
return err
}
if server.Interface != nil && server.Interface.Name != "" && !util.ValidateInterfaceName(server.Interface.Name) {
return fmt.Errorf("invalid interface name: %s", server.Interface.Name)
@@ -586,8 +595,8 @@ func (o *JsonDB) CreateServer(server model.Server) error {
// DeleteServer func to remove a server from the database, refusing if
// any client still references it
func (o *JsonDB) DeleteServer(serverID string) error {
if !util.ValidateRecordID(serverID) {
return fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return err
}
records, err := o.conn.ReadAll("clients")
if err != nil && err != scribble.ErrMissingCollection {
@@ -612,16 +621,16 @@ func (o *JsonDB) DeleteServer(serverID string) error {
// GetServerSettings func to query per-server settings from the database
func (o *JsonDB) GetServerSettings(serverID string) (model.ServerSetting, error) {
settings := model.ServerSetting{}
if !util.ValidateRecordID(serverID) {
return settings, fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return settings, err
}
return settings, o.conn.Read("server_settings", serverID, &settings)
}
// SaveServerSettings func to save per-server settings in the database
func (o *JsonDB) SaveServerSettings(serverID string, settings model.ServerSetting) error {
if !util.ValidateRecordID(serverID) {
return fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return err
}
settingsPath := path.Join(o.dbPath, "server_settings", serverID+".json")
output := o.conn.Write("server_settings", serverID, settings)
@@ -635,16 +644,16 @@ func (o *JsonDB) SaveServerSettings(serverID string, settings model.ServerSettin
// GetServerHashes func to query per-server client/server hashes from the database
func (o *JsonDB) GetServerHashes(serverID string) (model.ClientServerHashes, error) {
hashes := model.ClientServerHashes{}
if !util.ValidateRecordID(serverID) {
return hashes, fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return hashes, err
}
return hashes, o.conn.Read("server_hashes", serverID, &hashes)
}
// SaveServerHashes func to save per-server client/server hashes in the database
func (o *JsonDB) SaveServerHashes(serverID string, hashes model.ClientServerHashes) error {
if !util.ValidateRecordID(serverID) {
return fmt.Errorf("invalid server id: %s", serverID)
if err := validateServerID(serverID); err != nil {
return err
}
hashesPath := path.Join(o.dbPath, "server_hashes", serverID+".json")
output := o.conn.Write("server_hashes", serverID, hashes)