diff --git a/models/crudable.go b/models/crudable.go index 4defc7f59a..dc3f12fa56 100644 --- a/models/crudable.go +++ b/models/crudable.go @@ -6,5 +6,5 @@ type CRUDable interface { ReadOne(int64) error ReadAll(*User) (interface{}, error) Update(int64) error - Delete(int64) error + Delete() error } diff --git a/models/list.go b/models/list.go index a80fa3001d..9c16b9d70d 100644 --- a/models/list.go +++ b/models/list.go @@ -2,7 +2,7 @@ package models // List represents a list of items type List struct { - ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"listid"` Title string `xorm:"varchar(250)" json:"title"` Description string `xorm:"varchar(1000)" json:"description"` OwnerID int64 `xorm:"int(11)" json:"-"` diff --git a/models/list_delete.go b/models/list_delete.go index e2f41f224f..7e6c255a2b 100644 --- a/models/list_delete.go +++ b/models/list_delete.go @@ -1,20 +1,20 @@ package models // Delete implements the delete method of CRUDable -func (l *List) Delete(id int64) (err error) { +func (l *List) Delete() (err error) { // Check if the list exists - _, err = GetListByID(id) + _, err = GetListByID(l.ID) if err != nil { return } // Delete the list - _, err = x.ID(id).Delete(&List{}) + _, err = x.ID(l.ID).Delete(&List{}) if err != nil { return } // Delete all todoitems on that list - _, err = x.Where("list_id = ?", id).Delete(&ListItem{}) + _, err = x.Where("list_id = ?", l.ID).Delete(&ListItem{}) return } diff --git a/models/list_items.go b/models/list_items.go index e98f9e8b9a..639d59ceb6 100644 --- a/models/list_items.go +++ b/models/list_items.go @@ -2,7 +2,7 @@ package models // ListItem represents an item in a todolist type ListItem struct { - ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"listitemid"` Text string `xorm:"varchar(250)" json:"text"` Description string `xorm:"varchar(250)" json:"description"` Done bool `json:"done"` diff --git a/models/list_items_delete.go b/models/list_items_delete.go index 7658a8980f..214dd189e2 100644 --- a/models/list_items_delete.go +++ b/models/list_items_delete.go @@ -1,14 +1,14 @@ package models // Delete implements the delete method for listItem -func (i *ListItem) Delete(id int64) (err error) { +func (i *ListItem) Delete() (err error) { // Check if it exists - _, err = GetListItemByID(id) + _, err = GetListItemByID(i.ID) if err != nil { return } - _, err = x.ID(id).Delete(ListItem{}) + _, err = x.ID(i.ID).Delete(ListItem{}) return } diff --git a/models/list_items_rights.go b/models/list_items_rights.go index 9a2bd77e8f..33e4795e67 100644 --- a/models/list_items_rights.go +++ b/models/list_items_rights.go @@ -1,9 +1,9 @@ package models // CanDelete checks if the user can delete an item -func (i *ListItem) CanDelete(doer *User, id int64) bool { +func (i *ListItem) CanDelete(doer *User) bool { // Get the item - lI, _ := GetListItemByID(id) + lI, _ := GetListItemByID(i.ID) // A user can delete an item if he has write acces to its list list, _ := GetListByID(lI.ListID) diff --git a/models/list_rights.go b/models/list_rights.go index 6e9a3abe79..3a79c30f70 100644 --- a/models/list_rights.go +++ b/models/list_rights.go @@ -81,8 +81,8 @@ func (l *List) CanRead(user *User) bool { } // CanDelete checks if the user can delete a list -func (l *List) CanDelete(doer *User, id int64) bool { - list, _ := GetListByID(id) +func (l *List) CanDelete(doer *User) bool { + list, _ := GetListByID(l.ID) return list.IsAdmin(doer) } diff --git a/models/namespace_delete.go b/models/namespace_delete.go index f71d545257..d9c24f4aeb 100644 --- a/models/namespace_delete.go +++ b/models/namespace_delete.go @@ -1,22 +1,22 @@ package models // Delete deletes a namespace -func (n *Namespace) Delete(id int64) (err error) { +func (n *Namespace) Delete() (err error) { // Check if the namespace exists - _, err = GetNamespaceByID(id) + _, err = GetNamespaceByID(n.ID) if err != nil { return } // Delete the namespace - _, err = x.ID(id).Delete(&Namespace{}) + _, err = x.ID(n.ID).Delete(&Namespace{}) if err != nil { return } // Delete all lists with their items - lists, err := GetListsByNamespaceID(id) + lists, err := GetListsByNamespaceID(n.ID) var listIDs []int64 // We need to do that for here because we need the list ids to delete two times: // 1) to delete the lists itself diff --git a/models/namespace_rights.go b/models/namespace_rights.go index 46fb4b4999..c79fda9dd2 100644 --- a/models/namespace_rights.go +++ b/models/namespace_rights.go @@ -77,8 +77,8 @@ func (n *Namespace) CanUpdate(user *User, id int64) bool { } // CanDelete checks if the user can delete a namespace -func (n *Namespace) CanDelete(user *User, id int64) bool { - nn, _ := GetNamespaceByID(id) +func (n *Namespace) CanDelete(user *User) bool { + nn, _ := GetNamespaceByID(n.ID) return nn.IsAdmin(user) } diff --git a/models/namespaces.go b/models/namespaces.go index 60b3edfa26..90ed9593aa 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"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"nid"` Name string `xorm:"varchar(250)" json:"name"` Description string `xorm:"varchar(1000)" json:"description"` OwnerID int64 `xorm:"int(11) not null" json:"-"` diff --git a/models/rights.go b/models/rights.go index 03a57f4a94..e8d1d6ee59 100644 --- a/models/rights.go +++ b/models/rights.go @@ -5,7 +5,7 @@ type Rights interface { IsAdmin(*User) bool CanWrite(*User) bool CanRead(*User) bool - CanDelete(*User, int64) bool + CanDelete(*User) bool CanUpdate(*User, int64) bool CanCreate(*User, int64) bool } diff --git a/models/team_namespace.go b/models/team_namespace.go index 589ade774d..d669ea0f9f 100644 --- a/models/team_namespace.go +++ b/models/team_namespace.go @@ -3,8 +3,8 @@ package models // TeamNamespace defines the relationship between a Team and a Namespace type TeamNamespace struct { ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id"` - TeamID int64 `xorm:"int(11) not null" json:"team_id"` - NamespaceID int64 `xorm:"int(11) not null" json:"namespace_id"` + TeamID int64 `xorm:"int(11) not null" json:"team_id" param:"teamid"` + NamespaceID int64 `xorm:"int(11) not null" json:"namespace_id" param:"nid"` Right NamespaceRight `xorm:"int(11)" json:"right"` Created int64 `xorm:"created" json:"created"` diff --git a/models/teams.go b/models/teams.go index 4fa8b8c698..0c589c2f80 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"` + ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"teamid"` Name string `xorm:"varchar(250) not null" json:"name"` Description string `xorm:"varchar(250)" json:"description"` CreatedByID int64 `xorm:"int(11) not null" json:"-"` diff --git a/models/teams_delete.go b/models/teams_delete.go index 3ef410bb68..87a56be910 100644 --- a/models/teams_delete.go +++ b/models/teams_delete.go @@ -1,33 +1,33 @@ package models // Delete deletes a team -func (t *Team) Delete(id int64) (err error) { +func (t *Team) Delete() (err error) { // Check if the team exists - _, err = GetTeamByID(id) + _, err = GetTeamByID(t.ID) if err != nil { return } // Delete the team - _, err = x.ID(id).Delete(&Team{}) + _, err = x.ID(t.ID).Delete(&Team{}) if err != nil { return } // Delete team members - _, err = x.Where("team_id = ?", id).Delete(&TeamMember{}) + _, err = x.Where("team_id = ?", t.ID).Delete(&TeamMember{}) if err != nil { return } // Delete team <-> namespace relations - _, err = x.Where("team_id = ?", id).Delete(&TeamNamespace{}) + _, err = x.Where("team_id = ?", t.ID).Delete(&TeamNamespace{}) if err != nil { return } // Delete team <-> lists relations - _, err = x.Where("team_id = ?", id).Delete(&TeamList{}) + _, err = x.Where("team_id = ?", t.ID).Delete(&TeamList{}) return } diff --git a/models/teams_rights.go b/models/teams_rights.go index b8e821ae07..acbdf76dde 100644 --- a/models/teams_rights.go +++ b/models/teams_rights.go @@ -19,8 +19,8 @@ func (t *Team) CanUpdate(user *User, id int64) bool { } // CanDelete checks if a user can delete a team -func (t *Team) CanDelete(user *User, id int64) bool { - t.ID = id +func (t *Team) CanDelete(user *User) bool { + //t.ID = id return t.IsAdmin(user) } diff --git a/routes/crud/delete.go b/routes/crud/delete.go index bda12ed923..b142f4cdfe 100644 --- a/routes/crud/delete.go +++ b/routes/crud/delete.go @@ -4,14 +4,19 @@ import ( "git.kolaente.de/konrad/list/models" "github.com/labstack/echo" "net/http" + "fmt" ) // DeleteWeb is the web handler to delete something func (c *WebHandler) DeleteWeb(ctx echo.Context) error { // Get the ID - id, err := models.GetIntURLParam("id", ctx) + /*id, err := models.GetIntURLParam("id", ctx) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, "Invalid ID.") + }*/ + // Bind params to struct + if err := ParamBinder(c.CObject, ctx); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Invalid URL param.") } // Check if the user has the right to delete @@ -19,12 +24,15 @@ func (c *WebHandler) DeleteWeb(ctx echo.Context) error { if err != nil { return echo.NewHTTPError(http.StatusInternalServerError) } - if !c.CObject.CanDelete(&user, id) { + if !c.CObject.CanDelete(&user) { return echo.NewHTTPError(http.StatusForbidden) } - err = c.CObject.Delete(id) + err = c.CObject.Delete() if err != nil { + + fmt.Println(err) + if models.IsErrNeedToBeListAdmin(err) { return echo.NewHTTPError(http.StatusForbidden, "You need to be the list admin to delete a list.") } diff --git a/routes/routes.go b/routes/routes.go index 7e52ff60dc..ca72f1ab57 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -93,14 +93,14 @@ func RegisterRoutes(e *echo.Echo) { a.GET("/lists", listHandler.ReadAllWeb) a.GET("/lists/:id", listHandler.ReadOneWeb) a.POST("/lists/:id", listHandler.UpdateWeb) - a.DELETE("/lists/:id", listHandler.DeleteWeb) + a.DELETE("/lists/:listid", listHandler.DeleteWeb) a.PUT("/namespaces/:id/lists", listHandler.CreateWeb) itemHandler := &crud.WebHandler{ CObject: &models.ListItem{}, } a.PUT("/lists/:id", itemHandler.CreateWeb) - a.DELETE("/items/:id", itemHandler.DeleteWeb) + a.DELETE("/items/:listitemid", itemHandler.DeleteWeb) a.POST("/items/:id", itemHandler.UpdateWeb) namespaceHandler := &crud.WebHandler{ @@ -110,7 +110,7 @@ func RegisterRoutes(e *echo.Echo) { a.PUT("/namespaces", namespaceHandler.CreateWeb) a.GET("/namespaces/:id", namespaceHandler.ReadOneWeb) a.POST("/namespaces/:id", namespaceHandler.UpdateWeb) - a.DELETE("/namespaces/:id", namespaceHandler.DeleteWeb) + a.DELETE("/namespaces/:nid", namespaceHandler.DeleteWeb) a.GET("/namespaces/:id/lists", apiv1.GetListsByNamespaceID) namespaceTeamHandler := &crud.WebHandler{ @@ -127,5 +127,5 @@ func RegisterRoutes(e *echo.Echo) { a.GET("/teams/:id", teamHandler.ReadOneWeb) a.PUT("/teams", teamHandler.CreateWeb) a.POST("/teams/:id", teamHandler.UpdateWeb) - a.DELETE("/teams/:id", teamHandler.DeleteWeb) + a.DELETE("/teams/:teamid", teamHandler.DeleteWeb) }