feat: initial implementation of EnvGuard with improved TUI layout

This commit is contained in:
Jose Luis Montañes Ojados
2026-01-28 15:13:51 +01:00
parent 11831f905b
commit 60e2b94107
6 changed files with 535 additions and 0 deletions

67
internal/api/client.go Normal file
View File

@@ -0,0 +1,67 @@
package api
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
"envguard/internal/models"
)
const baseURL = "http://localhost:8080"
var client = &http.Client{Timeout: 5 * time.Second}
func GetServices() ([]models.Service, error) {
resp, err := client.Get(baseURL + "/services")
if err != nil {
return nil, err
}
defer resp.Body.Close()
var services []models.Service
if err := json.NewDecoder(resp.Body).Decode(&services); err != nil {
return nil, err
}
return services, nil
}
func LockService(serviceName, user string) error {
reqBody := models.LockRequest{
ServiceName: serviceName,
User: user,
}
data, _ := json.Marshal(reqBody)
resp, err := client.Post(baseURL+"/lock", "application/json", bytes.NewBuffer(data))
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to lock: status %d", resp.StatusCode)
}
return nil
}
func UnlockService(serviceName, user string) error {
reqBody := models.UnlockRequest{
ServiceName: serviceName,
User: user,
}
data, _ := json.Marshal(reqBody)
resp, err := client.Post(baseURL+"/unlock", "application/json", bytes.NewBuffer(data))
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to unlock: status %d", resp.StatusCode)
}
return nil
}

23
internal/models/models.go Normal file
View File

@@ -0,0 +1,23 @@
package models
import "time"
// Service represents a microservice that can be locked.
type Service struct {
Name string `json:"name"`
IsLocked bool `json:"is_locked"`
LockedBy string `json:"locked_by,omitempty"`
LockedAt time.Time `json:"locked_at,omitempty"`
}
// LockRequest is the payload to lock a service.
type LockRequest struct {
ServiceName string `json:"service_name"`
User string `json:"user"`
}
// UnlockRequest is the payload to unlock a service.
type UnlockRequest struct {
ServiceName string `json:"service_name"`
User string `json:"user"`
}