106 lines
3.5 KiB
Go
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})
|
|
}
|