Initial commit.
This commit is contained in:
110
internal/api/v1/handlers_backup.go
Normal file
110
internal/api/v1/handlers_backup.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/wild-cloud/wild-central/daemon/internal/backup"
|
||||
"github.com/wild-cloud/wild-central/daemon/internal/operations"
|
||||
)
|
||||
|
||||
// BackupAppStart starts a backup operation for an app
|
||||
func (api *API) BackupAppStart(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
instanceName := vars["name"]
|
||||
appName := vars["app"]
|
||||
|
||||
mgr := backup.NewManager(api.dataDir)
|
||||
|
||||
// Create operation for tracking
|
||||
opMgr := operations.NewManager(api.dataDir)
|
||||
opID, err := opMgr.Start(instanceName, "backup", appName)
|
||||
if err != nil {
|
||||
respondError(w, http.StatusInternalServerError, "Failed to start backup operation")
|
||||
return
|
||||
}
|
||||
|
||||
// Run backup in background
|
||||
go func() {
|
||||
opMgr.UpdateProgress(instanceName, opID, 10, "Starting backup")
|
||||
|
||||
info, err := mgr.BackupApp(instanceName, appName)
|
||||
if err != nil {
|
||||
opMgr.Update(instanceName, opID, "failed", err.Error(), 100)
|
||||
return
|
||||
}
|
||||
|
||||
opMgr.Update(instanceName, opID, "completed", "Backup completed", 100)
|
||||
_ = info // Metadata saved in backup.json
|
||||
}()
|
||||
|
||||
respondJSON(w, http.StatusAccepted, map[string]interface{}{
|
||||
"success": true,
|
||||
"operation_id": opID,
|
||||
"message": "Backup started",
|
||||
})
|
||||
}
|
||||
|
||||
// BackupAppList lists all backups for an app
|
||||
func (api *API) BackupAppList(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
instanceName := vars["name"]
|
||||
appName := vars["app"]
|
||||
|
||||
mgr := backup.NewManager(api.dataDir)
|
||||
backups, err := mgr.ListBackups(instanceName, appName)
|
||||
if err != nil {
|
||||
respondError(w, http.StatusInternalServerError, "Failed to list backups")
|
||||
return
|
||||
}
|
||||
|
||||
respondJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"success": true,
|
||||
"data": map[string]interface{}{
|
||||
"backups": backups,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// BackupAppRestore restores an app from backup
|
||||
func (api *API) BackupAppRestore(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
instanceName := vars["name"]
|
||||
appName := vars["app"]
|
||||
|
||||
// Parse request body for restore options
|
||||
var opts backup.RestoreOptions
|
||||
if err := json.NewDecoder(r.Body).Decode(&opts); err != nil {
|
||||
// Use defaults if no body provided
|
||||
opts = backup.RestoreOptions{}
|
||||
}
|
||||
|
||||
mgr := backup.NewManager(api.dataDir)
|
||||
|
||||
// Create operation for tracking
|
||||
opMgr := operations.NewManager(api.dataDir)
|
||||
opID, err := opMgr.Start(instanceName, "restore", appName)
|
||||
if err != nil {
|
||||
respondError(w, http.StatusInternalServerError, "Failed to start restore operation")
|
||||
return
|
||||
}
|
||||
|
||||
// Run restore in background
|
||||
go func() {
|
||||
opMgr.UpdateProgress(instanceName, opID, 10, "Starting restore")
|
||||
|
||||
if err := mgr.RestoreApp(instanceName, appName, opts); err != nil {
|
||||
opMgr.Update(instanceName, opID, "failed", err.Error(), 100)
|
||||
return
|
||||
}
|
||||
|
||||
opMgr.Update(instanceName, opID, "completed", "Restore completed", 100)
|
||||
}()
|
||||
|
||||
respondJSON(w, http.StatusAccepted, map[string]interface{}{
|
||||
"success": true,
|
||||
"operation_id": opID,
|
||||
"message": "Restore started",
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user