Files
coop-cloud-wizard/api/list.go
2026-04-07 12:53:01 -04:00

153 lines
4.2 KiB
Go

package api
import (
"fmt"
"log"
"encoding/json"
appPkg "coopcloud.tech/abra/pkg/app"
"coop-cloud-backend/internal"
"net/http"
)
func (h *abraHandler) handleListApps(w http.ResponseWriter, r *http.Request) {
appNames, err := GetAppNames()
if err != nil {
log.Printf("Error getting app names: %s\n", err)
InternalServerErrorHandler(w, r)
return
}
// counts the number of apps in a server to initialize slices later
serverAppCount := make(map[string]int)
remoteApps := make([]appPkg.App, 0, len(appNames))
for _, appName := range appNames {
remoteApp, err := GetApp(appName)
serverAppCount[remoteApp.Server] += 1
if err != nil {
log.Printf("Error getting app %s: %s\n", appName, err)
InternalServerErrorHandler(w, r)
return
}
remoteApps = append(remoteApps, remoteApp)
}
appStatuses, err := GetAppStatuses(remoteApps)
if err != nil {
log.Printf("Error: %s\n", err)
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
return
}
abraAppResponse := ServerAppsResponse{}
for _, app := range remoteApps {
serverApps, ok := abraAppResponse[app.Server]
if !ok { // create the slice
// ever other field initializes to 0
serverApps = ServerApps{
Apps: make([]AbraApp, 0, serverAppCount[app.Server]),
}
}
appInfo, ok := appStatuses[app.StackName()]
if ok {
log.Printf("app %s is deployed\n", app.Name)
serverApps.Apps = append(serverApps.Apps, appTranspose(app, appInfo))
serverApps.AppCount += 1
// assume these are true rn idk
serverApps.VersionCount += 1
serverApps.LatestCount += 1
} else {
log.Printf("app %s is undeployed\n", app.Name)
appT, err := appTransposeUndeployed(app)
if err != nil {
log.Printf("app transpose failed: %s\n", err)
http.Error(w, fmt.Sprintf("app transpose failed: %s\n", err), http.StatusInternalServerError)
return
}
serverApps.Apps = append(serverApps.Apps, appT)
serverApps.AppCount += 1
// assume these are true rn idk
serverApps.VersionCount += 1
serverApps.LatestCount += 1
}
abraAppResponse[app.Server] = serverApps
}
jsonBytes, err := json.Marshal(abraAppResponse)
if err != nil {
log.Printf("JSON conversion failed: %s\n", err)
http.Error(w, fmt.Sprintf("JSON conversion failed: %s\n", err), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Write(jsonBytes)
}
func appTransposeUndeployed(app appPkg.App) (AbraApp, error) {
config, err := app.Recipe.GetComposeConfig(app.Env)
if err != nil {
return AbraApp{}, err
}
version := GetLabel(config, app.StackName(), "version")
if version == "" {
version = "unknown"
}
return AbraApp{
AppName: app.Name,
Server: app.Server,
Recipe: app.Recipe.Name,
Domain: app.Domain,
Chaos: "false",
Status: "undeployed",
ChaosVersion: "unknown",
Version: version,
Upgrade: "latest",
}, nil
}
func appTranspose(app appPkg.App, psInfo map[string]string) AbraApp {
return AbraApp{
AppName: app.Name,
Server: app.Server,
Recipe: app.Recipe.Name,
Domain: app.Domain,
Chaos: psInfo["chaos"],
Status: psInfo["status"],
ChaosVersion: getOrDefault(psInfo, "chaosVersion", "unknown"),
Version: psInfo["version"],
Upgrade: "latest",
}
}
func getOrDefault(m map[string]string, key, def string) string {
if v, ok := m[key]; ok {
return v
}
return def
}
func (h *abraHandler) handleListServers (w http.ResponseWriter, r *http.Request) {
servers, err := GetServers()
if err != nil {
log.Printf("Error: %s\n", err)
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
return
}
serverNames, err := ReadServerNames()
if err != nil {
log.Printf("Error: %s\n", err)
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
return
}
abraServers := make([]AbraServer, 0, len(servers))
for i := range len(servers) {
abraServers = append(abraServers,
AbraServer{
Name: serverNames[i],
Host: servers[i],
},
)
}
jsonBytes, err := json.Marshal(abraServers)
if err != nil {
log.Printf("Error: %s\n", err)
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Write(jsonBytes)
}