Files
AetherForge/server/internal/api/config_handler.go

75 lines
1.9 KiB
Go

package api
import (
"encoding/json"
"net/http"
"strings"
"crypto-miner-server/internal/db"
)
// ConfigHandler handles GET/PUT for server configuration settings
type ConfigHandler struct {
db *db.Database
config ConfigProvider
}
// ConfigProvider is an interface for the server config so we don't import main package
type ConfigProvider interface {
GetConfigJSON() json.RawMessage
UpdateConfigFromJSON(data json.RawMessage) error
}
func NewConfigHandler(database *db.Database, cp ConfigProvider) *ConfigHandler {
return &ConfigHandler{
db: database,
config: cp,
}
}
func (h *ConfigHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
h.getConfig(w, r)
case http.MethodPut:
h.updateConfig(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
func writeConfigJSONError(w http.ResponseWriter, status int, msg string) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
_ = json.NewEncoder(w).Encode(map[string]string{"error": msg})
}
// GET /api/v1/config
func (h *ConfigHandler) getConfig(w http.ResponseWriter, r *http.Request) {
configJSON := h.config.GetConfigJSON()
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, _ = w.Write(configJSON)
}
// PUT /api/v1/config
func (h *ConfigHandler) updateConfig(w http.ResponseWriter, r *http.Request) {
var body json.RawMessage
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
writeConfigJSONError(w, http.StatusBadRequest, "Invalid JSON")
return
}
if err := h.config.UpdateConfigFromJSON(body); err != nil {
status := http.StatusInternalServerError
if strings.HasPrefix(err.Error(), "invalid config:") {
status = http.StatusBadRequest
}
writeConfigJSONError(w, status, err.Error())
return
}
// Return updated config
h.getConfig(w, r)
}