feat: implement server persistence with services.json
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -12,6 +13,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
services = []models.Service{}
|
||||||
|
mu sync.Mutex
|
||||||
|
dataFile = "services.json"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if err := loadServices(); err != nil {
|
||||||
|
log.Printf("⚠️ No se pudo cargar services.json, usando defaults: %v", err)
|
||||||
services = []models.Service{
|
services = []models.Service{
|
||||||
{Name: "auth-service"},
|
{Name: "auth-service"},
|
||||||
{Name: "payments-api"},
|
{Name: "payments-api"},
|
||||||
@@ -19,10 +28,10 @@ var (
|
|||||||
{Name: "notifications"},
|
{Name: "notifications"},
|
||||||
{Name: "front-web"},
|
{Name: "front-web"},
|
||||||
}
|
}
|
||||||
mu sync.Mutex
|
} else {
|
||||||
)
|
fmt.Printf("✅ %d servicios cargados desde disco\n", len(services))
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
|
||||||
http.HandleFunc("/services", handleServices)
|
http.HandleFunc("/services", handleServices)
|
||||||
http.HandleFunc("/lock", handleLock)
|
http.HandleFunc("/lock", handleLock)
|
||||||
http.HandleFunc("/unlock", handleUnlock)
|
http.HandleFunc("/unlock", handleUnlock)
|
||||||
@@ -33,6 +42,27 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func loadServices() error {
|
||||||
|
file, err := os.Open(dataFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
return json.NewDecoder(file).Decode(&services)
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveServices() error {
|
||||||
|
file, err := os.Create(dataFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
encoder := json.NewEncoder(file)
|
||||||
|
encoder.SetIndent("", " ")
|
||||||
|
return encoder.Encode(services)
|
||||||
|
}
|
||||||
|
|
||||||
func handleServices(w http.ResponseWriter, r *http.Request) {
|
func handleServices(w http.ResponseWriter, r *http.Request) {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
@@ -66,6 +96,10 @@ func handleLock(w http.ResponseWriter, r *http.Request) {
|
|||||||
services[i].LockedBy = req.User
|
services[i].LockedBy = req.User
|
||||||
services[i].LockedAt = time.Now()
|
services[i].LockedAt = time.Now()
|
||||||
|
|
||||||
|
if err := saveServices(); err != nil {
|
||||||
|
log.Printf("Error guardando estado: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -103,6 +137,10 @@ func handleUnlock(w http.ResponseWriter, r *http.Request) {
|
|||||||
services[i].LockedBy = ""
|
services[i].LockedBy = ""
|
||||||
services[i].LockedAt = time.Time{}
|
services[i].LockedAt = time.Time{}
|
||||||
|
|
||||||
|
if err := saveServices(); err != nil {
|
||||||
|
log.Printf("Error guardando estado: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
27
services.json
Normal file
27
services.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "auth-service",
|
||||||
|
"is_locked": false,
|
||||||
|
"locked_at": "0001-01-01T00:00:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "payments-api",
|
||||||
|
"is_locked": false,
|
||||||
|
"locked_at": "0001-01-01T00:00:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "user-db",
|
||||||
|
"is_locked": false,
|
||||||
|
"locked_at": "0001-01-01T00:00:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "notifications",
|
||||||
|
"is_locked": false,
|
||||||
|
"locked_at": "0001-01-01T00:00:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "front-web",
|
||||||
|
"is_locked": false,
|
||||||
|
"locked_at": "0001-01-01T00:00:00Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user