Implement CheckCle Microservice Operation

A Go-based microservice for service operations including ICMP ping, DNS resolution, and TCP connectivity
This commit is contained in:
Tola Leng
2025-06-19 17:49:30 +07:00
parent 89572c44b7
commit d3ea5dc77c
36 changed files with 2895 additions and 0 deletions
@@ -0,0 +1,104 @@
package handlers
import (
"encoding/json"
"net/http"
"time"
"service-operation/operations"
"service-operation/types"
)
func (h *OperationHandler) HandleOperation(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var req types.OperationRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "Invalid JSON payload", http.StatusBadRequest)
return
}
if req.Host == "" && req.URL == "" {
http.Error(w, "Host or URL is required", http.StatusBadRequest)
return
}
// Set defaults
if req.Count <= 0 {
req.Count = h.config.DefaultCount
}
if req.Count > h.config.MaxCount {
req.Count = h.config.MaxCount
}
if req.Timeout <= 0 {
req.Timeout = int(h.config.DefaultTimeout.Seconds())
}
if time.Duration(req.Timeout)*time.Second > h.config.MaxTimeout {
req.Timeout = int(h.config.MaxTimeout.Seconds())
}
timeout := time.Duration(req.Timeout) * time.Second
var result *types.OperationResult
var err error
switch req.Type {
case types.OperationPing:
pingOp := operations.NewPingOperation(timeout)
result, err = pingOp.Execute(req.Host, req.Count)
case types.OperationDNS:
dnsOp := operations.NewDNSOperation(timeout)
query := req.Query
if query == "" {
query = "A"
}
result, err = dnsOp.Execute(req.Host, query)
case types.OperationTCP:
if req.Port <= 0 {
http.Error(w, "Port is required for TCP operations", http.StatusBadRequest)
return
}
tcpOp := operations.NewTCPOperation(timeout)
result, err = tcpOp.Execute(req.Host, req.Port)
case types.OperationHTTP:
httpOp := operations.NewHTTPOperation(timeout)
url := req.URL
if url == "" {
url = req.Host
}
method := req.Method
if method == "" {
method = "GET"
}
result, err = httpOp.Execute(url, method)
default:
http.Error(w, "Invalid operation type", http.StatusBadRequest)
return
}
if err != nil {
result = &types.OperationResult{
Type: req.Type,
Host: req.Host,
Port: req.Port,
Success: false,
Error: err.Error(),
}
}
// Save metrics to PocketBase if available
if h.pbClient != nil && h.pbClient.IsAuthenticated() {
go h.saveMetricsToPocketBase(result, req.ServiceID)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(result)
}