From 2489fd851f796e54dcd2de3d9f841f0d5eaee9ab Mon Sep 17 00:00:00 2001 From: Pedro Nasser Date: Tue, 26 Jul 2016 00:10:45 -0300 Subject: [PATCH] added wrapper on models; changed handlers; fixes --- api/models/app.go | 15 ++++++----- api/models/app_wrapper.go | 32 +++++++++++++++++++++++ api/models/apps_wrapper.go | 34 +++++++++++++++++++++++++ api/models/datastore.go | 4 +-- api/models/error.go | 2 +- api/models/route.go | 41 +++++++++++++++++------------- api/models/route_wrapper.go | 31 ++++++++++++++++++++++ api/models/routes_wrapper.go | 36 ++++++++++++++++++++++++++ api/server/router/apps_create.go | 14 +++++++--- api/server/router/apps_get.go | 2 +- api/server/router/apps_list.go | 2 +- api/server/router/apps_update.go | 11 +------- api/server/router/router.go | 2 +- api/server/router/routes_create.go | 24 ++++++++++------- api/server/router/routes_get.go | 2 +- api/server/router/routes_list.go | 2 +- api/server/router/routes_update.go | 8 +++--- 17 files changed, 203 insertions(+), 59 deletions(-) create mode 100644 api/models/app_wrapper.go create mode 100644 api/models/apps_wrapper.go create mode 100644 api/models/route_wrapper.go create mode 100644 api/models/routes_wrapper.go diff --git a/api/models/app.go b/api/models/app.go index b203cc94a..a349a1089 100644 --- a/api/models/app.go +++ b/api/models/app.go @@ -5,13 +5,14 @@ import "errors" type Apps []*App var ( - ErrAppsCreate = errors.New("Could not create app") - ErrAppsUpdate = errors.New("Could not update app") - ErrAppsRemoving = errors.New("Could not remove app from datastore") - ErrAppsGet = errors.New("Could not get app from datastore") - ErrAppsList = errors.New("Could not list apps from datastore") - ErrAppsNotFound = errors.New("App not found") - ErrAppNothingToUpdate = errors.New("Nothing to update") + ErrAppsCreate = errors.New("Could not create app") + ErrAppsUpdate = errors.New("Could not update app") + ErrAppsRemoving = errors.New("Could not remove app from datastore") + ErrAppsGet = errors.New("Could not get app from datastore") + ErrAppsList = errors.New("Could not list apps from datastore") + ErrAppsNotFound = errors.New("App not found") + ErrAppsNothingToUpdate = errors.New("Nothing to update") + ErrAppsMissingNew = errors.New("Missing new application") ) type App struct { diff --git a/api/models/app_wrapper.go b/api/models/app_wrapper.go new file mode 100644 index 000000000..815888261 --- /dev/null +++ b/api/models/app_wrapper.go @@ -0,0 +1,32 @@ +package models + +import "github.com/go-openapi/errors" + +type AppWrapper struct { + App *App `json:"app"` +} + +func (m *AppWrapper) Validate() error { + var res []error + + if err := m.validateApp(); err != nil { + // prop + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *AppWrapper) validateApp() error { + + if m.App != nil { + if err := m.App.Validate(); err != nil { + return err + } + } + + return nil +} diff --git a/api/models/apps_wrapper.go b/api/models/apps_wrapper.go new file mode 100644 index 000000000..98d683d22 --- /dev/null +++ b/api/models/apps_wrapper.go @@ -0,0 +1,34 @@ +package models + +import ( + strfmt "github.com/go-openapi/strfmt" + "github.com/go-openapi/validate" + + "github.com/go-openapi/errors" +) + +type AppsWrapper struct { + Apps []*App `json:"apps"` +} + +func (m *AppsWrapper) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateApps(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *AppsWrapper) validateApps(formats strfmt.Registry) error { + + if err := validate.Required("apps", "body", m.Apps); err != nil { + return err + } + + return nil +} diff --git a/api/models/datastore.go b/api/models/datastore.go index 3481ca86f..4ffa3fb8a 100644 --- a/api/models/datastore.go +++ b/api/models/datastore.go @@ -17,6 +17,6 @@ func ApplyAppFilter(app *App, filter *AppFilter) bool { } func ApplyRouteFilter(route *Route, filter *RouteFilter) bool { - return (filter.Path != "" && route.Path == filter.Path) && - (filter.AppName != "" && route.AppName == filter.AppName) + return (filter.Path == "" || route.Path == filter.Path) && + (filter.AppName == "" || route.AppName == filter.AppName) } diff --git a/api/models/error.go b/api/models/error.go index 6996f8083..ae7dc12ad 100644 --- a/api/models/error.go +++ b/api/models/error.go @@ -11,5 +11,5 @@ func (m *Error) Validate() error { } var ( - ErrInvalidJSON = errors.New("Could not create app") + ErrInvalidJSON = errors.New("Invalid JSON") ) diff --git a/api/models/route.go b/api/models/route.go index 501426671..a100d1127 100644 --- a/api/models/route.go +++ b/api/models/route.go @@ -3,27 +3,28 @@ package models import ( "errors" "net/http" + + apiErrors "github.com/go-openapi/errors" ) var ( - ErrRoutesCreate = errors.New("Could not create route") - ErrRoutesUpdate = errors.New("Could not update route") - ErrRoutesRemoving = errors.New("Could not remove route from datastore") - ErrRoutesGet = errors.New("Could not get route from datastore") - ErrRoutesList = errors.New("Could not list routes from datastore") - ErrRoutesNotFound = errors.New("Route not found") + ErrRoutesCreate = errors.New("Could not create route") + ErrRoutesUpdate = errors.New("Could not update route") + ErrRoutesRemoving = errors.New("Could not remove route from datastore") + ErrRoutesGet = errors.New("Could not get route from datastore") + ErrRoutesList = errors.New("Could not list routes from datastore") + ErrRoutesNotFound = errors.New("Route not found") + ErrRoutesMissingNew = errors.New("Missing new route") ) type Routes []*Route type Route struct { - Name string `json:"name"` - AppName string `json:"appname"` - Path string `json:"path"` - Image string `json:"image"` - Type string `json:"type,omitempty"` - ContainerPath string `json:"container_path,omitempty"` - Headers http.Header `json:"headers,omitempty"` + Name string `json:"name"` + AppName string `json:"appname"` + Path string `json:"path"` + Image string `json:"image"` + Headers http.Header `json:"headers,omitempty"` } var ( @@ -34,20 +35,26 @@ var ( ) func (r *Route) Validate() error { + var res []error + if r.Name == "" { - return ErrRoutesValidationName + res = append(res, ErrRoutesValidationAppName) } if r.Image == "" { - return ErrRoutesValidationImage + res = append(res, ErrRoutesValidationImage) } if r.AppName == "" { - return ErrRoutesValidationAppName + res = append(res, ErrRoutesValidationAppName) } if r.Path == "" { - return ErrRoutesValidationPath + res = append(res, ErrRoutesValidationPath) + } + + if len(res) > 0 { + return apiErrors.CompositeValidationError(res...) } return nil diff --git a/api/models/route_wrapper.go b/api/models/route_wrapper.go new file mode 100644 index 000000000..0d7e21bdc --- /dev/null +++ b/api/models/route_wrapper.go @@ -0,0 +1,31 @@ +package models + +import "github.com/go-openapi/errors" + +type RouteWrapper struct { + Route *Route `json:"route"` +} + +func (m *RouteWrapper) Validate() error { + var res []error + + if err := m.validateRoute(); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *RouteWrapper) validateRoute() error { + + if m.Route != nil { + if err := m.Route.Validate(); err != nil { + return err + } + } + + return nil +} diff --git a/api/models/routes_wrapper.go b/api/models/routes_wrapper.go new file mode 100644 index 000000000..b61e0aab6 --- /dev/null +++ b/api/models/routes_wrapper.go @@ -0,0 +1,36 @@ +package models + +import ( + strfmt "github.com/go-openapi/strfmt" + "github.com/go-openapi/validate" + + "github.com/go-openapi/errors" +) + +type RoutesWrapper struct { + Cursor string `json:"cursor,omitempty"` + Error *ErrorBody `json:"error,omitempty"` + Routes []*Route `json:"routes"` +} + +func (m *RoutesWrapper) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateRoutes(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *RoutesWrapper) validateRoutes(formats strfmt.Registry) error { + + if err := validate.Required("routes", "body", m.Routes); err != nil { + return err + } + + return nil +} diff --git a/api/server/router/apps_create.go b/api/server/router/apps_create.go index 86b7d702b..4bfa09760 100644 --- a/api/server/router/apps_create.go +++ b/api/server/router/apps_create.go @@ -12,22 +12,28 @@ func handleAppCreate(c *gin.Context) { store := c.MustGet("store").(models.Datastore) log := c.MustGet("log").(logrus.FieldLogger) - app := &models.App{} + wapp := &models.AppWrapper{} - err := c.BindJSON(app) + err := c.BindJSON(wapp) if err != nil { log.WithError(err).Debug(models.ErrInvalidJSON) c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) return } - if err := app.Validate(); err != nil { + if wapp.App == nil { + log.Debug(models.ErrAppsMissingNew) + c.JSON(http.StatusBadRequest, simpleError(models.ErrAppsMissingNew)) + return + } + + if err := wapp.Validate(); err != nil { log.Error(err) c.JSON(http.StatusInternalServerError, simpleError(err)) return } - app, err = store.StoreApp(app) + app, err := store.StoreApp(wapp.App) if err != nil { log.WithError(err).Debug(models.ErrAppsCreate) c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate)) diff --git a/api/server/router/apps_get.go b/api/server/router/apps_get.go index 47f5be75f..07ace61c6 100644 --- a/api/server/router/apps_get.go +++ b/api/server/router/apps_get.go @@ -40,5 +40,5 @@ func handleAppGet(c *gin.Context) { app.Routes = routes - c.JSON(http.StatusOK, app) + c.JSON(http.StatusOK, &models.AppWrapper{app}) } diff --git a/api/server/router/apps_list.go b/api/server/router/apps_list.go index d716316c3..7746dc1e2 100644 --- a/api/server/router/apps_list.go +++ b/api/server/router/apps_list.go @@ -21,5 +21,5 @@ func handleAppList(c *gin.Context) { return } - c.JSON(http.StatusOK, apps) + c.JSON(http.StatusOK, &models.AppsWrapper{apps}) } diff --git a/api/server/router/apps_update.go b/api/server/router/apps_update.go index dc7c3db7c..f00f331ce 100644 --- a/api/server/router/apps_update.go +++ b/api/server/router/apps_update.go @@ -21,14 +21,5 @@ func handleAppUpdate(c *gin.Context) { 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, simpleError(models.ErrAppNothingToUpdate)) + c.JSON(http.StatusOK, simpleError(models.ErrAppsNothingToUpdate)) } diff --git a/api/server/router/router.go b/api/server/router/router.go index acf7129d1..8178be917 100644 --- a/api/server/router/router.go +++ b/api/server/router/router.go @@ -15,7 +15,7 @@ func Start(engine *gin.Engine) { v1.POST("/apps", handleAppCreate) v1.GET("/apps/:app", handleAppGet) - v1.POST("/apps/:app", handleAppUpdate) + v1.PUT("/apps/:app", handleAppUpdate) v1.DELETE("/apps/:app", handleAppDestroy) apps := v1.Group("/apps/:app") diff --git a/api/server/router/routes_create.go b/api/server/router/routes_create.go index 11d73393b..c85c6620a 100644 --- a/api/server/router/routes_create.go +++ b/api/server/router/routes_create.go @@ -12,31 +12,37 @@ func handleRouteCreate(c *gin.Context) { store := c.MustGet("store").(models.Datastore) log := c.MustGet("log").(logrus.FieldLogger) - route := &models.Route{} + wroute := &models.RouteWrapper{} - err := c.BindJSON(route) + err := c.BindJSON(wroute) if err != nil { - log.WithError(err).Debug(models.ErrInvalidJSON) + log.WithError(err).Error(models.ErrInvalidJSON) c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) return } - route.AppName = c.Param("app") + if wroute.Route == nil { + log.WithError(err).Error(models.ErrInvalidJSON) + c.JSON(http.StatusBadRequest, simpleError(models.ErrRoutesMissingNew)) + return + } - if err := route.Validate(); err != nil { + wroute.Route.AppName = c.Param("app") + + if err := wroute.Validate(); err != nil { log.Error(err) c.JSON(http.StatusInternalServerError, simpleError(err)) return } - app, err := store.GetApp(route.AppName) + app, err := store.GetApp(wroute.Route.AppName) if err != nil { log.WithError(err).Error(models.ErrAppsGet) c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsGet)) return } if app == nil { - app, err = store.StoreApp(&models.App{Name: route.AppName}) + app, err = store.StoreApp(&models.App{Name: wroute.Route.AppName}) if err != nil { log.WithError(err).Error(models.ErrAppsCreate) c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate)) @@ -44,9 +50,9 @@ func handleRouteCreate(c *gin.Context) { } } - route, err = store.StoreRoute(route) + route, err := store.StoreRoute(wroute.Route) if err != nil { - log.WithError(err).Debug(models.ErrRoutesCreate) + log.WithError(err).Error(models.ErrRoutesCreate) c.JSON(http.StatusInternalServerError, simpleError(models.ErrRoutesCreate)) return } diff --git a/api/server/router/routes_get.go b/api/server/router/routes_get.go index cc6983b0b..d6f1dfe7d 100644 --- a/api/server/router/routes_get.go +++ b/api/server/router/routes_get.go @@ -24,5 +24,5 @@ func handleRouteGet(c *gin.Context) { log.WithFields(logrus.Fields{"route": route}).Debug("Got route") - c.JSON(http.StatusOK, route) + c.JSON(http.StatusOK, &models.RouteWrapper{route}) } diff --git a/api/server/router/routes_list.go b/api/server/router/routes_list.go index fdf05a62f..6735ba0d9 100644 --- a/api/server/router/routes_list.go +++ b/api/server/router/routes_list.go @@ -27,5 +27,5 @@ func handleRouteList(c *gin.Context) { log.WithFields(logrus.Fields{"routes": routes}).Debug("Got routes") - c.JSON(http.StatusOK, routes) + c.JSON(http.StatusOK, &models.RoutesWrapper{Routes: routes}) } diff --git a/api/server/router/routes_update.go b/api/server/router/routes_update.go index c00554a75..188c33252 100644 --- a/api/server/router/routes_update.go +++ b/api/server/router/routes_update.go @@ -12,19 +12,19 @@ func handleRouteUpdate(c *gin.Context) { store := c.MustGet("store").(models.Datastore) log := c.MustGet("log").(logrus.FieldLogger) - route := &models.Route{} + wroute := &models.RouteWrapper{} appName := c.Param("app") - err := c.BindJSON(route) + err := c.BindJSON(wroute) if err != nil { log.WithError(err).Debug(models.ErrInvalidJSON) c.JSON(http.StatusBadRequest, simpleError(models.ErrInvalidJSON)) return } - route.AppName = appName + wroute.Route.AppName = appName - route, err = store.StoreRoute(route) + route, err := store.StoreRoute(wroute.Route) if err != nil { log.WithError(err).Debug(models.ErrAppsCreate) c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate))