From cb704c1b1f54121f911b4c64c78160ccda7dc7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Monta=C3=B1es=20Ojados?= Date: Wed, 28 Jan 2026 15:17:27 +0100 Subject: [PATCH] feat: implement server persistence with services.json --- cmd/server/main.go | 54 +++++++++++++++++++++++++++++++++++++++------- services.json | 27 +++++++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 services.json diff --git a/cmd/server/main.go b/cmd/server/main.go index 1e0757c..0ae3a07 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "net/http" + "os" "sync" "time" @@ -12,17 +13,25 @@ import ( ) var ( - services = []models.Service{ - {Name: "auth-service"}, - {Name: "payments-api"}, - {Name: "user-db"}, - {Name: "notifications"}, - {Name: "front-web"}, - } - mu sync.Mutex + 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{ + {Name: "auth-service"}, + {Name: "payments-api"}, + {Name: "user-db"}, + {Name: "notifications"}, + {Name: "front-web"}, + } + } else { + fmt.Printf("✅ %d servicios cargados desde disco\n", len(services)) + } + http.HandleFunc("/services", handleServices) http.HandleFunc("/lock", handleLock) 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) { mu.Lock() defer mu.Unlock() @@ -66,6 +96,10 @@ func handleLock(w http.ResponseWriter, r *http.Request) { services[i].LockedBy = req.User services[i].LockedAt = time.Now() + if err := saveServices(); err != nil { + log.Printf("Error guardando estado: %v", err) + } + w.WriteHeader(http.StatusOK) return } @@ -103,6 +137,10 @@ func handleUnlock(w http.ResponseWriter, r *http.Request) { services[i].LockedBy = "" services[i].LockedAt = time.Time{} + if err := saveServices(); err != nil { + log.Printf("Error guardando estado: %v", err) + } + w.WriteHeader(http.StatusOK) return } diff --git a/services.json b/services.json new file mode 100644 index 0000000..decb08d --- /dev/null +++ b/services.json @@ -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" + } +]