From d8f6a628db0aa1dfae1a19bdfe9134fa5d9069d3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 11 Oct 2018 17:53:59 +0200 Subject: [PATCH] Replaced CObject with a function returning an object --- REST-Tests/lists.http | 2 +- routes/crud/create.go | 14 ++++++-------- routes/crud/delete.go | 10 +++++++--- routes/crud/helper.go | 11 +++++++---- routes/crud/read_all.go | 7 +++++-- routes/crud/read_one.go | 10 ++++++---- routes/crud/update.go | 15 +++++++-------- routes/routes.go | 36 +++++++++++++++++++++++++++--------- 8 files changed, 66 insertions(+), 39 deletions(-) diff --git a/REST-Tests/lists.http b/REST-Tests/lists.http index 1ee376264..2c121aadc 100644 --- a/REST-Tests/lists.http +++ b/REST-Tests/lists.http @@ -5,7 +5,7 @@ Authorization: Bearer {{auth_token}} ### # Get one list -GET http://localhost:8080/api/v1/lists/13546850 +GET http://localhost:8080/api/v1/lists/2 Authorization: Bearer {{auth_token}} ### diff --git a/routes/crud/create.go b/routes/crud/create.go index 43aa3b046..a1090cdb4 100644 --- a/routes/crud/create.go +++ b/routes/crud/create.go @@ -4,17 +4,15 @@ import ( "code.vikunja.io/api/models" "github.com/labstack/echo" "net/http" - "reflect" ) // CreateWeb is the handler to create an object func (c *WebHandler) CreateWeb(ctx echo.Context) error { - // Re-initialize our model - p := reflect.ValueOf(c.CObject).Elem() - p.Set(reflect.Zero(p.Type())) + // Get our model + currentStruct := c.EmptyStruct() // Get the object & bind params to struct - if err := ParamBinder(c.CObject, ctx); err != nil { + if err := ParamBinder(currentStruct, ctx); err != nil { return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } @@ -25,16 +23,16 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { } // Check rights - if !c.CObject.CanCreate(¤tUser) { + if !currentStruct.CanCreate(¤tUser) { models.Log.Noticef("%s [ID: %d] tried to create while not having the rights for it", currentUser.Username, currentUser.ID) return echo.NewHTTPError(http.StatusForbidden) } // Create - err = c.CObject.Create(¤tUser) + err = currentStruct.Create(¤tUser) if err != nil { return HandleHTTPError(err) } - return ctx.JSON(http.StatusCreated, c.CObject) + return ctx.JSON(http.StatusCreated, currentStruct) } diff --git a/routes/crud/delete.go b/routes/crud/delete.go index ddd476ef7..bd0514447 100644 --- a/routes/crud/delete.go +++ b/routes/crud/delete.go @@ -8,8 +8,12 @@ import ( // DeleteWeb is the web handler to delete something func (c *WebHandler) DeleteWeb(ctx echo.Context) error { + + // Get our model + currentStruct := c.EmptyStruct() + // Bind params to struct - if err := ParamBinder(c.CObject, ctx); err != nil { + if err := ParamBinder(currentStruct, ctx); err != nil { return echo.NewHTTPError(http.StatusBadRequest, "Invalid URL param.") } @@ -18,12 +22,12 @@ func (c *WebHandler) DeleteWeb(ctx echo.Context) error { if err != nil { return echo.NewHTTPError(http.StatusInternalServerError) } - if !c.CObject.CanDelete(&user) { + if !currentStruct.CanDelete(&user) { models.Log.Noticef("%s [ID: %d] tried to delete while not having the rights for it", user.Username, user.ID) return echo.NewHTTPError(http.StatusForbidden) } - err = c.CObject.Delete() + err = currentStruct.Delete() if err != nil { return HandleHTTPError(err) } diff --git a/routes/crud/helper.go b/routes/crud/helper.go index e3f08f5ab..ad4d66969 100644 --- a/routes/crud/helper.go +++ b/routes/crud/helper.go @@ -9,10 +9,13 @@ import ( // WebHandler defines the webhandler object // This does web stuff, aka returns json etc. Uses CRUDable Methods to get the data type WebHandler struct { - CObject interface { - models.CRUDable - models.Rights - } + EmptyStruct func() CObject +} + +// CObject is the definition of our object, holds the structs +type CObject interface { + models.CRUDable + models.Rights } // HandleHTTPError does what it says diff --git a/routes/crud/read_all.go b/routes/crud/read_all.go index 26c0e2480..45c39fbe1 100644 --- a/routes/crud/read_all.go +++ b/routes/crud/read_all.go @@ -8,17 +8,20 @@ import ( // ReadAllWeb is the webhandler to get all objects of a type func (c *WebHandler) ReadAllWeb(ctx echo.Context) error { + // Get our model + currentStruct := c.EmptyStruct() + currentUser, err := models.GetCurrentUser(ctx) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "Could not determine the current user.") } // Get the object & bind params to struct - if err := ParamBinder(c.CObject, ctx); err != nil { + if err := ParamBinder(currentStruct, ctx); err != nil { return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } - lists, err := c.CObject.ReadAll(¤tUser) + lists, err := currentStruct.ReadAll(¤tUser) if err != nil { return HandleHTTPError(err) } diff --git a/routes/crud/read_one.go b/routes/crud/read_one.go index 881d293f5..a5461a733 100644 --- a/routes/crud/read_one.go +++ b/routes/crud/read_one.go @@ -8,14 +8,16 @@ import ( // ReadOneWeb is the webhandler to get one object func (c *WebHandler) ReadOneWeb(ctx echo.Context) error { + // Get our model + currentStruct := c.EmptyStruct() // Get the object & bind params to struct - if err := ParamBinder(c.CObject, ctx); err != nil { + if err := ParamBinder(currentStruct, ctx); err != nil { return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } // Get our object - err := c.CObject.ReadOne() + err := currentStruct.ReadOne() if err != nil { return HandleHTTPError(err) } @@ -26,10 +28,10 @@ func (c *WebHandler) ReadOneWeb(ctx echo.Context) error { if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "Could not determine the current user.") } - if !c.CObject.CanRead(¤tUser) { + if !currentStruct.CanRead(¤tUser) { models.Log.Noticef("%s [ID: %d] tried to read while not having the rights for it", currentUser.Username, currentUser.ID) return echo.NewHTTPError(http.StatusForbidden, "You don't have the right to see this") } - return ctx.JSON(http.StatusOK, c.CObject) + return ctx.JSON(http.StatusOK, currentStruct) } diff --git a/routes/crud/update.go b/routes/crud/update.go index 608e64dfa..b5e5002d0 100644 --- a/routes/crud/update.go +++ b/routes/crud/update.go @@ -4,17 +4,16 @@ import ( "code.vikunja.io/api/models" "github.com/labstack/echo" "net/http" - "reflect" ) // UpdateWeb is the webhandler to update an object func (c *WebHandler) UpdateWeb(ctx echo.Context) error { - // Re-initialize our model - p := reflect.ValueOf(c.CObject).Elem() - p.Set(reflect.Zero(p.Type())) + + // Get our model + currentStruct := c.EmptyStruct() // Get the object & bind params to struct - if err := ParamBinder(c.CObject, ctx); err != nil { + if err := ParamBinder(currentStruct, ctx); err != nil { return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } @@ -23,16 +22,16 @@ func (c *WebHandler) UpdateWeb(ctx echo.Context) error { if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "Could not determine the current user.") } - if !c.CObject.CanUpdate(¤tUser) { + if !currentStruct.CanUpdate(¤tUser) { models.Log.Noticef("%s [ID: %d] tried to update while not having the rights for it", currentUser.Username, currentUser.ID) return echo.NewHTTPError(http.StatusForbidden) } // Do the update - err = c.CObject.Update() + err = currentStruct.Update() if err != nil { return HandleHTTPError(err) } - return ctx.JSON(http.StatusOK, c.CObject) + return ctx.JSON(http.StatusOK, currentStruct) } diff --git a/routes/routes.go b/routes/routes.go index eba228bfc..4d35c2f8b 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -77,7 +77,9 @@ func RegisterRoutes(e *echo.Echo) { a.GET("/users", apiv1.UserList) listHandler := &crud.WebHandler{ - CObject: &models.List{}, + EmptyStruct: func() crud.CObject { + return &models.List{} + }, } a.GET("/lists", listHandler.ReadAllWeb) a.GET("/lists/:list", listHandler.ReadOneWeb) @@ -86,14 +88,18 @@ func RegisterRoutes(e *echo.Echo) { a.PUT("/namespaces/:namespace/lists", listHandler.CreateWeb) taskHandler := &crud.WebHandler{ - CObject: &models.ListTask{}, + EmptyStruct: func() crud.CObject { + return &models.ListTask{} + }, } a.PUT("/lists/:list", taskHandler.CreateWeb) a.DELETE("/tasks/:listtask", taskHandler.DeleteWeb) a.POST("/tasks/:listtask", taskHandler.UpdateWeb) listTeamHandler := &crud.WebHandler{ - CObject: &models.TeamList{}, + EmptyStruct: func() crud.CObject { + return &models.TeamList{} + }, } a.GET("/lists/:list/teams", listTeamHandler.ReadAllWeb) a.PUT("/lists/:list/teams", listTeamHandler.CreateWeb) @@ -101,7 +107,9 @@ func RegisterRoutes(e *echo.Echo) { a.POST("/lists/:list/teams/:team", listTeamHandler.UpdateWeb) listUserHandler := &crud.WebHandler{ - CObject: &models.ListUser{}, + EmptyStruct: func() crud.CObject { + return &models.ListUser{} + }, } a.GET("/lists/:list/users", listUserHandler.ReadAllWeb) a.PUT("/lists/:list/users", listUserHandler.CreateWeb) @@ -109,7 +117,9 @@ func RegisterRoutes(e *echo.Echo) { a.POST("/lists/:list/users/:user", listUserHandler.UpdateWeb) namespaceHandler := &crud.WebHandler{ - CObject: &models.Namespace{}, + EmptyStruct: func() crud.CObject { + return &models.Namespace{} + }, } a.GET("/namespaces", namespaceHandler.ReadAllWeb) a.PUT("/namespaces", namespaceHandler.CreateWeb) @@ -119,7 +129,9 @@ func RegisterRoutes(e *echo.Echo) { a.GET("/namespaces/:namespace/lists", apiv1.GetListsByNamespaceID) namespaceTeamHandler := &crud.WebHandler{ - CObject: &models.TeamNamespace{}, + EmptyStruct: func() crud.CObject { + return &models.TeamNamespace{} + }, } a.GET("/namespaces/:namespace/teams", namespaceTeamHandler.ReadAllWeb) a.PUT("/namespaces/:namespace/teams", namespaceTeamHandler.CreateWeb) @@ -127,7 +139,9 @@ func RegisterRoutes(e *echo.Echo) { a.POST("/namespaces/:namespace/teams/:team", namespaceTeamHandler.UpdateWeb) namespaceUserHandler := &crud.WebHandler{ - CObject: &models.NamespaceUser{}, + EmptyStruct: func() crud.CObject { + return &models.NamespaceUser{} + }, } a.GET("/namespaces/:namespace/users", namespaceUserHandler.ReadAllWeb) a.PUT("/namespaces/:namespace/users", namespaceUserHandler.CreateWeb) @@ -135,7 +149,9 @@ func RegisterRoutes(e *echo.Echo) { a.POST("/namespaces/:namespace/users/:user", namespaceUserHandler.UpdateWeb) teamHandler := &crud.WebHandler{ - CObject: &models.Team{}, + EmptyStruct: func() crud.CObject { + return &models.Team{} + }, } a.GET("/teams", teamHandler.ReadAllWeb) a.GET("/teams/:team", teamHandler.ReadOneWeb) @@ -144,7 +160,9 @@ func RegisterRoutes(e *echo.Echo) { a.DELETE("/teams/:team", teamHandler.DeleteWeb) teamMemberHandler := &crud.WebHandler{ - CObject: &models.TeamMember{}, + EmptyStruct: func() crud.CObject { + return &models.TeamMember{} + }, } a.PUT("/teams/:team/members", teamMemberHandler.CreateWeb) a.DELETE("/teams/:team/members/:user", teamMemberHandler.DeleteWeb)