From 9e75e9b73b5a25d626dc01166e9e4f73a4ba2ede Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 21 Jul 2018 15:08:46 +0200 Subject: [PATCH] implemented readone with parambinder --- models/crudable.go | 2 +- models/list.go | 8 ++++---- models/list_items.go | 2 +- models/namespaces.go | 8 ++++---- models/teams.go | 6 +++--- routes/crud/create.go | 9 --------- routes/crud/paramBinder.go | 7 ++++++- routes/crud/read_one.go | 16 +++++++++++----- routes/routes.go | 28 ++++++++++++++-------------- 9 files changed, 44 insertions(+), 42 deletions(-) diff --git a/models/crudable.go b/models/crudable.go index 774a2d162f6..6a7b8fea799 100644 --- a/models/crudable.go +++ b/models/crudable.go @@ -3,7 +3,7 @@ package models // CRUDable defines the crud methods type CRUDable interface { Create(*User) error - ReadOne(int64) error + ReadOne() error ReadAll(*User) (interface{}, error) Update(int64) error Delete() error diff --git a/models/list.go b/models/list.go index de59cf58ea4..022925eef3a 100644 --- a/models/list.go +++ b/models/list.go @@ -2,11 +2,11 @@ package models // List represents a list of items type List struct { - ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"listid"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"list"` Title string `xorm:"varchar(250)" json:"title"` Description string `xorm:"varchar(1000)" json:"description"` OwnerID int64 `xorm:"int(11)" json:"-"` - NamespaceID int64 `xorm:"int(11)" json:"-" param:"nid"` + NamespaceID int64 `xorm:"int(11)" json:"-" param:"namespace"` Owner User `xorm:"-" json:"owner"` Items []*ListItem `xorm:"-" json:"items"` @@ -75,7 +75,7 @@ func (l *List) ReadAll(user *User) (interface{}, error) { } // ReadOne gets one list by its ID -func (l *List) ReadOne(id int64) (err error) { - *l, err = GetListByID(id) +func (l *List) ReadOne() (err error) { + *l, err = GetListByID(l.ID) return } diff --git a/models/list_items.go b/models/list_items.go index 9771802c34a..83f6fe6988e 100644 --- a/models/list_items.go +++ b/models/list_items.go @@ -9,7 +9,7 @@ type ListItem struct { DueDateUnix int64 `xorm:"int(11)" json:"dueDate"` ReminderUnix int64 `xorm:"int(11)" json:"reminderDate"` CreatedByID int64 `xorm:"int(11)" json:"-"` // ID of the user who put that item on the list - ListID int64 `xorm:"int(11)" json:"listID" param:"listid"` + ListID int64 `xorm:"int(11)" json:"listID" param:"list"` Created int64 `xorm:"created" json:"created"` Updated int64 `xorm:"updated" json:"updated"` diff --git a/models/namespaces.go b/models/namespaces.go index 90ed9593aa9..6d905162cea 100644 --- a/models/namespaces.go +++ b/models/namespaces.go @@ -2,7 +2,7 @@ package models // Namespace holds informations about a namespace type Namespace struct { - ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"nid"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"namespace"` Name string `xorm:"varchar(250)" json:"name"` Description string `xorm:"varchar(1000)" json:"description"` OwnerID int64 `xorm:"int(11) not null" json:"-"` @@ -48,15 +48,15 @@ func GetNamespaceByID(id int64) (namespace Namespace, err error) { } // ReadOne gets one namespace -func (n *Namespace) ReadOne(id int64) (err error) { +func (n *Namespace) ReadOne() (err error) { getN := Namespace{} - exists, err := x.ID(id).Get(&getN) + exists, err := x.ID(n.ID).Get(&getN) if err != nil { return } if !exists { - return ErrNamespaceDoesNotExist{ID: id} + return ErrNamespaceDoesNotExist{ID: n.ID} } *n = getN diff --git a/models/teams.go b/models/teams.go index 0c589c2f808..fe9ec42177d 100644 --- a/models/teams.go +++ b/models/teams.go @@ -2,7 +2,7 @@ package models // Team holds a team object type Team struct { - ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"teamid"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"team"` Name string `xorm:"varchar(250) not null" json:"name"` Description string `xorm:"varchar(250)" json:"description"` CreatedByID int64 `xorm:"int(11) not null" json:"-"` @@ -100,8 +100,8 @@ func GetTeamByID(id int64) (team Team, err error) { } // ReadOne implements the CRUD method to get one team -func (t *Team) ReadOne(id int64) (err error) { - *t, err = GetTeamByID(id) +func (t *Team) ReadOne() (err error) { + *t, err = GetTeamByID(t.ID) return } diff --git a/routes/crud/create.go b/routes/crud/create.go index 7289f727eb1..5fea52a28f1 100644 --- a/routes/crud/create.go +++ b/routes/crud/create.go @@ -24,15 +24,6 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, "Could not determine the current user.") } - // Get an ID if we have one - /*var id int64 - if ctx.Param("id") != "" { - id, err = models.GetIntURLParam("id", ctx) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Bad id.") - } - }*/ - // Check rights if !c.CObject.CanCreate(¤tUser) { return echo.NewHTTPError(http.StatusForbidden) diff --git a/routes/crud/paramBinder.go b/routes/crud/paramBinder.go index 7ad61588f74..6809f520658 100644 --- a/routes/crud/paramBinder.go +++ b/routes/crud/paramBinder.go @@ -5,6 +5,7 @@ import ( "github.com/labstack/echo" "reflect" "strconv" + "strings" ) const paramTagName = "param" @@ -21,7 +22,11 @@ func ParamBinder(i interface{}, c echo.Context) (err error) { paramValues := c.ParamValues() paramVars := make(map[string][]string) for in, name := range paramNames { - paramVars[name] = append(paramVars[name], paramValues[in]) + // Hotfix for an echo bug where a param name would show up which dont exist + names := strings.Split(name, ",") + for _, n := range names { + paramVars[n] = append(paramVars[name], paramValues[in]) + } } b := Binder{} diff --git a/routes/crud/read_one.go b/routes/crud/read_one.go index 8b8250c0c31..2ffb69b064a 100644 --- a/routes/crud/read_one.go +++ b/routes/crud/read_one.go @@ -4,19 +4,19 @@ import ( "git.kolaente.de/konrad/list/models" "github.com/labstack/echo" "net/http" + "fmt" ) // ReadOneWeb is the webhandler to get one object func (c *WebHandler) ReadOneWeb(ctx echo.Context) error { - // Get the ID - id, err := models.GetIntURLParam("id", ctx) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Invalid ID.") + // Get the object & bind params to struct + if err := ParamBinder(c.CObject, ctx); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } // Get our object - err = c.CObject.ReadOne(id) + err := c.CObject.ReadOne() if err != nil { if models.IsErrListDoesNotExist(err) { return echo.NewHTTPError(http.StatusNotFound) @@ -26,6 +26,12 @@ func (c *WebHandler) ReadOneWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusNotFound) } + if models.IsErrTeamDoesNotExist(err) { + return echo.NewHTTPError(http.StatusNotFound) + } + + fmt.Println(err) + return echo.NewHTTPError(http.StatusInternalServerError, "An error occured.") } diff --git a/routes/routes.go b/routes/routes.go index 3d2138182db..ff0945674fc 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -113,27 +113,27 @@ func RegisterRoutes(e *echo.Echo) { CObject: &models.List{}, } a.GET("/lists", listHandler.ReadAllWeb) - a.GET("/lists/:id", listHandler.ReadOneWeb) - a.POST("/lists/:id", listHandler.UpdateWeb) - a.DELETE("/lists/:listid", listHandler.DeleteWeb) - a.PUT("/namespaces/:nid/lists", listHandler.CreateWeb) + a.GET("/lists/:list", listHandler.ReadOneWeb) + a.POST("/lists/:list", listHandler.UpdateWeb) + a.DELETE("/lists/:list", listHandler.DeleteWeb) + a.PUT("/namespaces/:namespace/lists", listHandler.CreateWeb) itemHandler := &crud.WebHandler{ CObject: &models.ListItem{}, } - a.PUT("/lists/:listid", itemHandler.CreateWeb) - a.DELETE("/items/:listitemid", itemHandler.DeleteWeb) - a.POST("/items/:id", itemHandler.UpdateWeb) + a.PUT("/lists/:list", itemHandler.CreateWeb) + a.DELETE("/items/:listitem", itemHandler.DeleteWeb) + a.POST("/items/:listitem", itemHandler.UpdateWeb) namespaceHandler := &crud.WebHandler{ CObject: &models.Namespace{}, } a.GET("/namespaces", namespaceHandler.ReadAllWeb) a.PUT("/namespaces", namespaceHandler.CreateWeb) - a.GET("/namespaces/:id", namespaceHandler.ReadOneWeb) - a.POST("/namespaces/:id", namespaceHandler.UpdateWeb) - a.DELETE("/namespaces/:nid", namespaceHandler.DeleteWeb) - a.GET("/namespaces/:id/lists", apiv1.GetListsByNamespaceID) + a.GET("/namespaces/:namespace", namespaceHandler.ReadOneWeb) + a.POST("/namespaces/:namespace", namespaceHandler.UpdateWeb) + a.DELETE("/namespaces/:namespace", namespaceHandler.DeleteWeb) + a.GET("/namespaces/:namespace/lists", apiv1.GetListsByNamespaceID) namespaceTeamHandler := &crud.WebHandler{ CObject: &models.TeamNamespace{}, @@ -146,8 +146,8 @@ func RegisterRoutes(e *echo.Echo) { CObject: &models.Team{}, } a.GET("/teams", teamHandler.ReadAllWeb) - a.GET("/teams/:id", teamHandler.ReadOneWeb) + a.GET("/teams/:team", teamHandler.ReadOneWeb) a.PUT("/teams", teamHandler.CreateWeb) - a.POST("/teams/:id", teamHandler.UpdateWeb) - a.DELETE("/teams/:teamid", teamHandler.DeleteWeb) + a.POST("/teams/:team", teamHandler.UpdateWeb) + a.DELETE("/teams/:team", teamHandler.DeleteWeb) }