package handlers import ( "encoding/json" "net/http" "strings" "github.com/user/nanometrics/server/db" "github.com/user/nanometrics/server/models" ) func AgentConfigHandler(database *db.DB, pushConfig func(agentID string, cfg *models.AgentConfig)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { parts := strings.Split(strings.Trim(r.URL.Path, "/"), "/") if len(parts) < 4 { http.Error(w, "invalid path", 400) return } agentID := parts[2] switch r.Method { case http.MethodGet: cfg, err := database.GetAgentConfig(agentID) if err != nil { http.Error(w, err.Error(), 500) return } if cfg == nil { cfg = models.DefaultAgentConfig() } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(cfg) case http.MethodPut: var cfg models.AgentConfig if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil { http.Error(w, err.Error(), 400) return } if err := database.UpsertAgentConfig(agentID, &cfg); err != nil { http.Error(w, err.Error(), 500) return } if pushConfig != nil { go pushConfig(agentID, &cfg) } w.WriteHeader(http.StatusNoContent) default: http.Error(w, "method not allowed", 405) } } } func ServerConfigHandler(database *db.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: cfg, err := database.GetServerConfig() if err != nil { http.Error(w, err.Error(), 500) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(cfg) case http.MethodPut: var cfg models.ServerConfig if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil { http.Error(w, err.Error(), 400) return } if err := database.SetServerConfig(cfg); err != nil { http.Error(w, err.Error(), 500) return } w.WriteHeader(http.StatusNoContent) default: http.Error(w, "method not allowed", 405) } } }