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")) }