node-api/main.go

127 lines
3.3 KiB
Go

package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/rosti-cz/apps-api/apps"
"github.com/rosti-cz/apps-api/common"
"github.com/rosti-cz/apps-api/nodes"
)
// JSONIndent Indendation of JSON output format
const JSONIndent = " "
func main() {
// Close database at the end
db := common.GetDBConnection()
defer db.Close()
// API
e := echo.New()
// Returns list of apps
e.GET("/v1/apps", func(c echo.Context) error {
apps, err := apps.List()
if err != nil {
return c.JSONPretty(http.StatusInternalServerError, Message{Message: err.Error()}, JSONIndent)
}
return c.JSON(http.StatusOK, apps)
})
// Returns one app
e.GET("/v1/apps/:name", func(c echo.Context) error {
name := c.Param("name")
app, err := apps.Get(name)
if err != nil {
return c.JSONPretty(http.StatusInternalServerError, Message{Message: err.Error()}, JSONIndent)
}
return c.JSON(http.StatusOK, app)
})
// Create a new app
e.POST("/v1/apps", func(c echo.Context) error {
app := apps.App{}
err := c.Bind(&app)
if err != nil {
return c.JSONPretty(http.StatusBadRequest, Message{Message: err.Error()}, JSONIndent)
}
err = apps.New(app.Name, app.SSHPort, app.HTTPPort, app.Image, app.CPU, app.Memory)
if err != nil {
if validationError, ok := err.(apps.ValidationError); ok {
return c.JSONPretty(http.StatusBadRequest, Message{Errors: validationError.Errors}, JSONIndent)
}
return c.JSONPretty(http.StatusInternalServerError, Message{Message: err.Error()}, JSONIndent)
}
return c.JSON(http.StatusOK, map[string]string{})
})
// Update existing app
e.PUT("/v1/apps/:name", func(c echo.Context) error {
name := c.Param("name")
app := apps.App{}
err := c.Bind(&app)
if err != nil {
return c.JSONPretty(http.StatusBadRequest, Message{Message: err.Error()}, JSONIndent)
}
err = apps.Update(name, app.SSHPort, app.HTTPPort, app.Image, app.CPU, app.Memory)
if err != nil {
if validationError, ok := err.(apps.ValidationError); ok {
return c.JSONPretty(http.StatusBadRequest, Message{Errors: validationError.Errors}, JSONIndent)
}
return c.JSONPretty(http.StatusInternalServerError, Message{Message: err.Error()}, JSONIndent)
}
return c.JSON(http.StatusOK, map[string]string{})
})
// Stop existing app
e.PUT("/v1/apps/:name/stop", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{})
})
// Start existing app
e.PUT("/v1/apps/:name/start", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{})
})
// Stop existing app
e.PUT("/v1/apps/:name/restart", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{})
})
// Rebuilds existing app, it keeps the data but created the container again
e.PUT("/v1/apps/:name/rebuild", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{})
})
// Delete one app
e.DELETE("/v1/apps/:name", func(c echo.Context) error {
name := c.Param("name")
err := apps.Delete(name)
if err != nil {
return c.JSONPretty(http.StatusInternalServerError, Message{Message: err.Error()}, JSONIndent)
}
return c.JSON(http.StatusOK, Message{Message: "deleted"})
})
// Return info about the node including performance index
e.GET("/v1/node", func(c echo.Context) error {
node := nodes.GetNodeInfo()
return c.JSON(http.StatusOK, node)
})
e.Logger.Fatal(e.Start(":1323"))
}