Files
honeydany/app/dashboard/webservices_api.go
T
2025-09-28 21:28:39 +01:00

106 lines
3.5 KiB
Go

package dashboard
import (
"encoding/json"
"net/http"
)
// WebServiceConfig represents a web service configuration
type WebServiceConfig struct {
Enabled bool `json:"enabled"`
Port int `json:"port"`
Name string `json:"name"`
Path string `json:"path"`
TemplateName string `json:"template_name"`
UseHTTPS bool `json:"use_https"`
}
// WebServicesAPI handles web services configuration API endpoints
type WebServicesAPI struct {
configManager interface {
GetWebServices() []WebServiceConfig
SaveWebServices([]WebServiceConfig) error
}
}
// NewWebServicesAPI creates a new web services API instance
func NewWebServicesAPI(configManager interface {
GetWebServices() []WebServiceConfig
SaveWebServices([]WebServiceConfig) error
}) *WebServicesAPI {
return &WebServicesAPI{configManager: configManager}
}
// RegisterRoutes registers the web services API routes
func (wsa *WebServicesAPI) RegisterRoutes(mux *http.ServeMux, sm *SecurityManager) {
// Require admin auth for both GET and POST.
mux.HandleFunc("/api/webservices", sm.APIAuthMiddleware(sm.RoleMiddleware("admin")(wsa.handleWebServices)))
}
// handleWebServices handles GET (list) and POST (save) operations for web services
func (wsa *WebServicesAPI) handleWebServices(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
wsa.handleGetWebServices(w, r)
case http.MethodPost:
wsa.handleSaveWebServices(w, r)
default:
wsa.sendJSONError(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
// handleGetWebServices returns the current web services configuration
func (wsa *WebServicesAPI) handleGetWebServices(w http.ResponseWriter, r *http.Request) {
services := wsa.configManager.GetWebServices()
resp := map[string]interface{}{
"services": services,
"count": len(services),
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(resp)
}
// handleSaveWebServices saves the web services configuration
func (wsa *WebServicesAPI) handleSaveWebServices(w http.ResponseWriter, r *http.Request) {
var req struct {
Services []WebServiceConfig `json:"services"`
}
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
wsa.sendJSONError(w, "Invalid JSON", http.StatusBadRequest)
return
}
// Validate services
for i, s := range req.Services {
if s.Name == "" {
wsa.sendJSONError(w, "Service name is required", http.StatusBadRequest)
return
}
if s.Port <= 0 || s.Port > 65535 {
wsa.sendJSONError(w, "Invalid port number", http.StatusBadRequest)
return
}
if s.Path == "" {
req.Services[i].Path = "/"
}
if s.Path[0] != '/' {
req.Services[i].Path = "/" + s.Path
}
}
if err := wsa.configManager.SaveWebServices(req.Services); err != nil {
wsa.sendJSONError(w, "Failed to save web services", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]string{"success": "Web services saved successfully"})
}
// sendJSONError sends a JSON error response
func (wsa *WebServicesAPI) sendJSONError(w http.ResponseWriter, message string, statusCode int) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(statusCode)
_ = json.NewEncoder(w).Encode(map[string]string{"error": message})
}