diff --git a/.gitignore b/.gitignore index eafc00425..5e1899827 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ iron.json dj.config.json dj.cluster.*.json script.tar.gz -router app.zip /app vendor/ diff --git a/api/server/router/apps_create.go b/api/server/router/apps_create.go new file mode 100644 index 000000000..6d3f0196b --- /dev/null +++ b/api/server/router/apps_create.go @@ -0,0 +1,32 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleAppCreate(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + app := &models.App{} + + err := c.BindJSON(app) + if err != nil { + log.WithError(err).Debug(models.ErrInvalidJSON) + c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) + return + } + + app, err = store.StoreApp(app) + if err != nil { + log.WithError(err).Debug(models.ErrAppsCreate) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate)) + return + } + + c.JSON(http.StatusOK, app) +} diff --git a/api/server/router/apps_destroy.go b/api/server/router/apps_destroy.go new file mode 100644 index 000000000..454cb5b64 --- /dev/null +++ b/api/server/router/apps_destroy.go @@ -0,0 +1,25 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleAppDestroy(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + appName := c.Param("app") + err := store.RemoveApp(appName) + + if err != nil { + log.WithError(err).Debug(models.ErrAppsRemoving) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsRemoving)) + return + } + + c.JSON(http.StatusOK, nil) +} diff --git a/api/server/router/apps_get.go b/api/server/router/apps_get.go new file mode 100644 index 000000000..c077d9b57 --- /dev/null +++ b/api/server/router/apps_get.go @@ -0,0 +1,31 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleAppGet(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + appName := c.Param("app") + app, err := store.GetApp(appName) + + if err != nil { + log.WithError(err).Error(models.ErrAppsGet) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsGet)) + return + } + + if app == nil { + log.WithError(err).Error(models.ErrAppsNotFound) + c.JSON(http.StatusNotFound, simpleError(models.ErrAppsNotFound)) + return + } + + c.JSON(http.StatusOK, app) +} diff --git a/api/server/router/apps_list.go b/api/server/router/apps_list.go new file mode 100644 index 000000000..d716316c3 --- /dev/null +++ b/api/server/router/apps_list.go @@ -0,0 +1,25 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleAppList(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + filter := &models.AppFilter{} + + apps, err := store.GetApps(filter) + if err != nil { + log.WithError(err).Debug(models.ErrAppsList) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsList)) + return + } + + c.JSON(http.StatusOK, apps) +} diff --git a/api/server/router/apps_update.go b/api/server/router/apps_update.go new file mode 100644 index 000000000..7eb1dc4c0 --- /dev/null +++ b/api/server/router/apps_update.go @@ -0,0 +1,34 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleAppUpdate(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + app := &models.App{} + + err := c.BindJSON(app) + if err != nil { + log.WithError(err).Debug(models.ErrInvalidJSON) + c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) + return + } + + app.Name = c.Param("app") + + app, err = store.StoreApp(app) + if err != nil { + log.WithError(err).Debug(models.ErrAppsUpdate) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsUpdate)) + return + } + + c.JSON(http.StatusOK, app) +} diff --git a/api/server/router/ping.go b/api/server/router/ping.go new file mode 100644 index 000000000..bd9db4bee --- /dev/null +++ b/api/server/router/ping.go @@ -0,0 +1,11 @@ +package router + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func handlePing(c *gin.Context) { + c.JSON(http.StatusNotImplemented, "Not Implemented") +} diff --git a/api/server/router/router.go b/api/server/router/router.go new file mode 100644 index 000000000..4eac85f0c --- /dev/null +++ b/api/server/router/router.go @@ -0,0 +1,37 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func Start(engine *gin.Engine) { + engine.GET("/", handlePing) + engine.GET("/version", handleVersion) + + v1 := engine.Group("/v1") + { + v1.GET("/apps", handleAppList) + v1.POST("/apps", handleAppCreate) + + v1.GET("/apps/:app", handleAppGet) + v1.POST("/apps/:app", handleAppUpdate) + v1.DELETE("/apps/:app", handleAppDestroy) + + apps := v1.Group("/apps/:app") + { + apps.GET("/routes", handleRouteList) + apps.POST("/routes", handleRouteCreate) + apps.GET("/routes/:route", handleRouteGet) + apps.POST("/routes/:route", handleRouteUpdate) + apps.DELETE("/routes/:route", handleRouteDestroy) + } + + } + + engine.GET("/r/:app/*route", handleRunner) +} + +func simpleError(err error) *models.Error { + return &models.Error{&models.ErrorBody{Message: err.Error()}} +} diff --git a/api/server/router/routes_create.go b/api/server/router/routes_create.go new file mode 100644 index 000000000..5dcb57680 --- /dev/null +++ b/api/server/router/routes_create.go @@ -0,0 +1,34 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleRouteCreate(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + route := &models.Route{} + + err := c.BindJSON(route) + if err != nil { + log.WithError(err).Debug(models.ErrInvalidJSON) + c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) + return + } + + route.AppName = c.Param("app") + + route, err = store.StoreRoute(route) + if err != nil { + log.WithError(err).Debug(models.ErrRoutesCreate) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrRoutesCreate)) + return + } + + c.JSON(http.StatusOK, route) +} diff --git a/api/server/router/routes_destroy.go b/api/server/router/routes_destroy.go new file mode 100644 index 000000000..d61fde6f4 --- /dev/null +++ b/api/server/router/routes_destroy.go @@ -0,0 +1,26 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleRouteDestroy(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + appName := c.Param("app") + routeName := c.Param("route") + err := store.RemoveRoute(appName, routeName) + + if err != nil { + log.WithError(err).Debug(models.ErrRoutesRemoving) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrRoutesRemoving)) + return + } + + c.JSON(http.StatusOK, nil) +} diff --git a/api/server/router/routes_get.go b/api/server/router/routes_get.go new file mode 100644 index 000000000..cc6983b0b --- /dev/null +++ b/api/server/router/routes_get.go @@ -0,0 +1,28 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleRouteGet(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + appName := c.Param("app") + routeName := c.Param("route") + + route, err := store.GetRoute(appName, routeName) + if err != nil { + log.WithError(err).Error(models.ErrRoutesGet) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrRoutesGet)) + return + } + + log.WithFields(logrus.Fields{"route": route}).Debug("Got route") + + c.JSON(http.StatusOK, route) +} diff --git a/api/server/router/routes_list.go b/api/server/router/routes_list.go new file mode 100644 index 000000000..fdf05a62f --- /dev/null +++ b/api/server/router/routes_list.go @@ -0,0 +1,31 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleRouteList(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + appName := c.Param("app") + + filter := &models.RouteFilter{ + AppName: appName, + } + + routes, err := store.GetRoutes(filter) + if err != nil { + log.WithError(err).Error(models.ErrRoutesGet) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrRoutesGet)) + return + } + + log.WithFields(logrus.Fields{"routes": routes}).Debug("Got routes") + + c.JSON(http.StatusOK, routes) +} diff --git a/api/server/router/routes_update.go b/api/server/router/routes_update.go new file mode 100644 index 000000000..c00554a75 --- /dev/null +++ b/api/server/router/routes_update.go @@ -0,0 +1,35 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/models" +) + +func handleRouteUpdate(c *gin.Context) { + store := c.MustGet("store").(models.Datastore) + log := c.MustGet("log").(logrus.FieldLogger) + + route := &models.Route{} + appName := c.Param("app") + + err := c.BindJSON(route) + if err != nil { + log.WithError(err).Debug(models.ErrInvalidJSON) + c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) + return + } + + route.AppName = appName + + route, err = store.StoreRoute(route) + if err != nil { + log.WithError(err).Debug(models.ErrAppsCreate) + c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate)) + return + } + + c.JSON(http.StatusOK, route) +} diff --git a/api/server/router/runner.go b/api/server/router/runner.go new file mode 100644 index 000000000..438dbe91e --- /dev/null +++ b/api/server/router/runner.go @@ -0,0 +1,19 @@ +package router + +import ( + "net/http" + + "github.com/Sirupsen/logrus" + "github.com/gin-gonic/gin" + "github.com/iron-io/functions/api/runner" +) + +func handleRunner(c *gin.Context) { + log := c.MustGet("log").(logrus.FieldLogger) + + err := runner.Run(c) + if err != nil { + log.Debug(err) + c.JSON(http.StatusInternalServerError, simpleError(err)) + } +} diff --git a/api/server/router/version.go b/api/server/router/version.go new file mode 100644 index 000000000..762315a5a --- /dev/null +++ b/api/server/router/version.go @@ -0,0 +1,11 @@ +package router + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func handleVersion(c *gin.Context) { + c.JSON(http.StatusNotImplemented, "Not Implemented") +}