Files
checkcle/server/service-operation/pocketbase/services.go
T
Tola Leng d3ea5dc77c Implement CheckCle Microservice Operation
A Go-based microservice for service operations including ICMP ping, DNS resolution, and TCP connectivity
2025-06-19 17:49:30 +07:00

138 lines
3.4 KiB
Go

package pocketbase
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
func (c *PocketBaseClient) GetServices() ([]Service, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%s/api/collections/services/records", c.baseURL), nil)
if err != nil {
return nil, err
}
// No authentication header needed for public access
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to fetch services, status: %d", resp.StatusCode)
}
var servicesResponse ServicesResponse
if err := json.NewDecoder(resp.Body).Decode(&servicesResponse); err != nil {
return nil, err
}
return servicesResponse.Items, nil
}
func (c *PocketBaseClient) GetService(serviceID string) (*Service, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%s/api/collections/services/records/%s", c.baseURL, serviceID), nil)
if err != nil {
return nil, err
}
// No authentication header needed for public access
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to fetch service %s, status: %d", serviceID, resp.StatusCode)
}
var service Service
if err := json.NewDecoder(resp.Body).Decode(&service); err != nil {
return nil, err
}
return &service, nil
}
func (c *PocketBaseClient) GetActiveServices() ([]Service, error) {
// Only fetch services that are not paused
req, err := http.NewRequest("GET",
fmt.Sprintf("%s/api/collections/services/records?filter=(status!='paused')", c.baseURL), nil)
if err != nil {
return nil, err
}
// No authentication header needed for public access
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to fetch active services, status: %d", resp.StatusCode)
}
var servicesResponse ServicesResponse
if err := json.NewDecoder(resp.Body).Decode(&servicesResponse); err != nil {
return nil, err
}
return servicesResponse.Items, nil
}
func (c *PocketBaseClient) UpdateServiceStatus(serviceID string, status string, responseTime int64, errorMessage string) error {
// First check if the service is paused before updating
service, err := c.GetService(serviceID)
if err != nil {
return fmt.Errorf("failed to check service status before update: %v", err)
}
if service.Status == "paused" {
return fmt.Errorf("service %s is paused, skipping status update", serviceID)
}
updateData := map[string]interface{}{
"status": status,
"response_time": responseTime,
"last_checked": time.Now().Format(time.RFC3339),
}
if errorMessage != "" {
updateData["error_message"] = errorMessage
}
jsonData, err := json.Marshal(updateData)
if err != nil {
return err
}
req, err := http.NewRequest("PATCH",
fmt.Sprintf("%s/api/collections/services/records/%s", c.baseURL, serviceID),
bytes.NewBuffer(jsonData))
if err != nil {
return err
}
// No authentication header needed
req.Header.Set("Content-Type", "application/json")
resp, err := c.httpClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent {
return fmt.Errorf("failed to update service status, status: %d", resp.StatusCode)
}
return nil
}