From de95ff40bf1a8780c3f035d5a4c40b33ec15531f Mon Sep 17 00:00:00 2001 From: konrad Date: Wed, 18 Jul 2018 08:56:19 +0200 Subject: [PATCH] implemented creation of thing via parambinder --- models/crudable.go | 2 +- models/list.go | 2 +- models/list_create_update.go | 2 +- models/list_items.go | 2 +- models/list_items_create_update.go | 4 ++-- models/list_items_rights.go | 4 ++-- models/list_rights.go | 4 ++-- models/namespace_create.go | 2 +- models/namespace_rights.go | 2 +- models/rights.go | 2 +- models/team_members_create.go | 4 ++-- models/team_namespace.go | 2 +- models/team_namespace_create.go | 9 ++++++--- models/team_namespace_delete.go | 2 +- models/team_namespace_rights.go | 2 +- models/teams_create.go | 4 ++-- models/teams_rights.go | 2 +- models/user_add_update.go | 2 +- routes/crud/create.go | 13 +++++++------ routes/crud/delete.go | 5 ----- routes/routes.go | 8 ++++---- 21 files changed, 39 insertions(+), 40 deletions(-) diff --git a/models/crudable.go b/models/crudable.go index dc3f12fa..774a2d16 100644 --- a/models/crudable.go +++ b/models/crudable.go @@ -2,7 +2,7 @@ package models // CRUDable defines the crud methods type CRUDable interface { - Create(*User, int64) error + Create(*User) error ReadOne(int64) error ReadAll(*User) (interface{}, error) Update(int64) error diff --git a/models/list.go b/models/list.go index 9c16b9d7..de59cf58 100644 --- a/models/list.go +++ b/models/list.go @@ -6,7 +6,7 @@ type List struct { 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:"-"` + NamespaceID int64 `xorm:"int(11)" json:"-" param:"nid"` Owner User `xorm:"-" json:"owner"` Items []*ListItem `xorm:"-" json:"items"` diff --git a/models/list_create_update.go b/models/list_create_update.go index 21ab9e86..c2389683 100644 --- a/models/list_create_update.go +++ b/models/list_create_update.go @@ -33,7 +33,7 @@ func (l *List) Update(id int64) (err error) { } // Create implements the create method of CRUDable -func (l *List) Create(doer *User, id int64) (err error) { +func (l *List) Create(doer *User) (err error) { // Check rights user, _, err := GetUserByID(doer.ID) if err != nil { diff --git a/models/list_items.go b/models/list_items.go index 639d59ce..9771802c 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"` + ListID int64 `xorm:"int(11)" json:"listID" param:"listid"` Created int64 `xorm:"created" json:"created"` Updated int64 `xorm:"updated" json:"updated"` diff --git a/models/list_items_create_update.go b/models/list_items_create_update.go index 1b6d32f8..3bb4def1 100644 --- a/models/list_items_create_update.go +++ b/models/list_items_create_update.go @@ -1,8 +1,8 @@ package models // Create is the implementation to create a list item -func (i *ListItem) Create(doer *User, lID int64) (err error) { - i.ListID = lID +func (i *ListItem) Create(doer *User) (err error) { + //i.ListID = lID i.ID = 0 return createOrUpdateListItem(i, doer) diff --git a/models/list_items_rights.go b/models/list_items_rights.go index 33e4795e..98fdf060 100644 --- a/models/list_items_rights.go +++ b/models/list_items_rights.go @@ -21,8 +21,8 @@ func (i *ListItem) CanUpdate(doer *User, id int64) bool { } // CanCreate determines if a user has the right to create a list item -func (i *ListItem) CanCreate(doer *User, lID int64) bool { +func (i *ListItem) CanCreate(doer *User) bool { // A user can create an item if he has write acces to its list - list, _ := GetListByID(lID) + list, _ := GetListByID(i.ListID) return list.CanWrite(doer) } diff --git a/models/list_rights.go b/models/list_rights.go index 3a79c30f..86510a73 100644 --- a/models/list_rights.go +++ b/models/list_rights.go @@ -93,8 +93,8 @@ func (l *List) CanUpdate(doer *User, id int64) bool { } // CanCreate checks if the user can update a list -func (l *List) CanCreate(doer *User, nID int64) bool { +func (l *List) CanCreate(doer *User) bool { // A user can create a list if he has write access to the namespace - n, _ := GetNamespaceByID(nID) + n, _ := GetNamespaceByID(l.NamespaceID) return n.CanWrite(doer) } diff --git a/models/namespace_create.go b/models/namespace_create.go index 323579f4..8aa919cb 100644 --- a/models/namespace_create.go +++ b/models/namespace_create.go @@ -1,7 +1,7 @@ package models // Create implements the creation method via the interface -func (n *Namespace) Create(doer *User, _ int64) (err error) { +func (n *Namespace) Create(doer *User) (err error) { // Check if we have at least a name if n.Name == "" { return ErrNamespaceNameCannotBeEmpty{NamespaceID: 0, UserID: doer.ID} diff --git a/models/namespace_rights.go b/models/namespace_rights.go index c79fda9d..3eb06799 100644 --- a/models/namespace_rights.go +++ b/models/namespace_rights.go @@ -83,7 +83,7 @@ func (n *Namespace) CanDelete(user *User) bool { } // CanCreate checks if the user can create a new namespace -func (n *Namespace) CanCreate(user *User, id int64) bool { +func (n *Namespace) CanCreate(user *User) bool { // This is currently a dummy function, later on we could imagine global limits etc. return true } diff --git a/models/rights.go b/models/rights.go index e8d1d6ee..8f47948b 100644 --- a/models/rights.go +++ b/models/rights.go @@ -7,5 +7,5 @@ type Rights interface { CanRead(*User) bool CanDelete(*User) bool CanUpdate(*User, int64) bool - CanCreate(*User, int64) bool + CanCreate(*User) bool } diff --git a/models/team_members_create.go b/models/team_members_create.go index 3b9aaa59..25fc01d3 100644 --- a/models/team_members_create.go +++ b/models/team_members_create.go @@ -1,8 +1,8 @@ package models // Create implements the create method to assign a user to a team -func (tm *TeamMember) Create(doer *User, id int64) (err error) { - tm.TeamID = id +func (tm *TeamMember) Create(doer *User) (err error) { + //tm.TeamID = id _, err = x.Insert(tm) return } diff --git a/models/team_namespace.go b/models/team_namespace.go index d669ea0f..0e8681ae 100644 --- a/models/team_namespace.go +++ b/models/team_namespace.go @@ -4,7 +4,7 @@ package models 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" param:"teamid"` - NamespaceID int64 `xorm:"int(11) not null" json:"namespace_id" param:"nid"` + NamespaceID int64 `xorm:"int(11) not null" json:"namespace_id" param:"namespaceid"` Right NamespaceRight `xorm:"int(11)" json:"right"` Created int64 `xorm:"created" json:"created"` diff --git a/models/team_namespace_create.go b/models/team_namespace_create.go index e51e69d7..4c78d12d 100644 --- a/models/team_namespace_create.go +++ b/models/team_namespace_create.go @@ -1,13 +1,17 @@ package models +import "fmt" + // Create creates a new team <-> namespace relation -func (tn *TeamNamespace) Create(doer *User, nID int64) (err error) { +func (tn *TeamNamespace) Create(doer *User) (err error) { // Check if the rights are valid if tn.Right != NamespaceRightAdmin && tn.Right != NamespaceRightRead && tn.Right != NamespaceRightWrite { return ErrInvalidTeamRight{tn.Right} } + fmt.Println(tn.NamespaceID) + // Check if the team exists _, err = GetTeamByID(tn.TeamID) if err != nil { @@ -15,11 +19,10 @@ func (tn *TeamNamespace) Create(doer *User, nID int64) (err error) { } // Check if the namespace exists - _, err = GetNamespaceByID(nID) + _, err = GetNamespaceByID(tn.NamespaceID) if err != nil { return } - tn.NamespaceID = nID // Insert the new team _, err = x.Insert(tn) diff --git a/models/team_namespace_delete.go b/models/team_namespace_delete.go index 9ee93f6f..62f7cab7 100644 --- a/models/team_namespace_delete.go +++ b/models/team_namespace_delete.go @@ -18,7 +18,7 @@ func (tn *TeamNamespace) Delete() (err error) { // Delete the relation _, err = x.Where("team_id = ?", tn.TeamID). And("namespace_id = ?", tn.NamespaceID). - Delete(tn) + Delete(TeamNamespace{}) return } diff --git a/models/team_namespace_rights.go b/models/team_namespace_rights.go index 4eea988d..d58fa359 100644 --- a/models/team_namespace_rights.go +++ b/models/team_namespace_rights.go @@ -1,7 +1,7 @@ package models // CanCreate checks if one can create a new team <-> namespace relation -func (tn *TeamNamespace) CanCreate(user *User, _ int64) bool { +func (tn *TeamNamespace) CanCreate(user *User) bool { n, _ := GetNamespaceByID(tn.NamespaceID) return n.IsAdmin(user) } diff --git a/models/teams_create.go b/models/teams_create.go index d8cefc59..82744fee 100644 --- a/models/teams_create.go +++ b/models/teams_create.go @@ -1,7 +1,7 @@ package models // Create is the handler to create a team -func (t *Team) Create(doer *User, _ int64) (err error) { +func (t *Team) Create(doer *User) (err error) { // Check if we have a name if t.Name == "" { return ErrTeamNameCannotBeEmpty{} @@ -17,6 +17,6 @@ func (t *Team) Create(doer *User, _ int64) (err error) { // Insert the current user as member and admin tm := TeamMember{TeamID: t.ID, UserID: doer.ID, IsAdmin: true} - err = tm.Create(doer, t.ID) + err = tm.Create(doer) return } diff --git a/models/teams_rights.go b/models/teams_rights.go index acbdf76d..4ca19780 100644 --- a/models/teams_rights.go +++ b/models/teams_rights.go @@ -1,7 +1,7 @@ package models // CanCreate checks if the user can create a new team -func (t *Team) CanCreate(user *User, id int64) bool { +func (t *Team) CanCreate(user *User) bool { // This is currently a dummy function, later on we could imagine global limits etc. return true } diff --git a/models/user_add_update.go b/models/user_add_update.go index f3f23a0b..ece61461 100644 --- a/models/user_add_update.go +++ b/models/user_add_update.go @@ -52,7 +52,7 @@ func CreateUser(user User) (newUser User, err error) { // Create the user's namespace newN := &Namespace{Name: newUserOut.Username, Description: newUserOut.Username + "'s namespace.", Owner: newUserOut} - err = newN.Create(&newUserOut, 0) + err = newN.Create(&newUserOut) if err != nil { return User{}, err } diff --git a/routes/crud/create.go b/routes/crud/create.go index 19b8e614..f8b186be 100644 --- a/routes/crud/create.go +++ b/routes/crud/create.go @@ -14,8 +14,9 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { p := reflect.ValueOf(c.CObject).Elem() p.Set(reflect.Zero(p.Type())) - // Get the object - if err := ctx.Bind(&c.CObject); err != nil { + // Get the object & bind params to struct + if err := ParamBinder(c.CObject, ctx); err != nil { + fmt.Println(err) return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") } @@ -26,21 +27,21 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { } // Get an ID if we have one - var id int64 + /*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, id) { + if !c.CObject.CanCreate(¤tUser) { return echo.NewHTTPError(http.StatusForbidden) } // Create - err = c.CObject.Create(¤tUser, id) + err = c.CObject.Create(¤tUser) if err != nil { if models.IsErrListDoesNotExist(err) { return echo.NewHTTPError(http.StatusBadRequest, "The list does not exist.") diff --git a/routes/crud/delete.go b/routes/crud/delete.go index b142f4cd..8990d1ef 100644 --- a/routes/crud/delete.go +++ b/routes/crud/delete.go @@ -9,11 +9,6 @@ import ( // 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) - 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.") diff --git a/routes/routes.go b/routes/routes.go index 41124f3e..a96c2d5b 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -94,12 +94,12 @@ func RegisterRoutes(e *echo.Echo) { a.GET("/lists/:id", listHandler.ReadOneWeb) a.POST("/lists/:id", listHandler.UpdateWeb) a.DELETE("/lists/:listid", listHandler.DeleteWeb) - a.PUT("/namespaces/:id/lists", listHandler.CreateWeb) + a.PUT("/namespaces/:nid/lists", listHandler.CreateWeb) itemHandler := &crud.WebHandler{ CObject: &models.ListItem{}, } - a.PUT("/lists/:id", itemHandler.CreateWeb) + a.PUT("/lists/:listid", itemHandler.CreateWeb) a.DELETE("/items/:listitemid", itemHandler.DeleteWeb) a.POST("/items/:id", itemHandler.UpdateWeb) @@ -117,8 +117,8 @@ func RegisterRoutes(e *echo.Echo) { CObject: &models.TeamNamespace{}, } a.GET("/namespaces/:id/teams", namespaceTeamHandler.ReadAllWeb) - a.PUT("/namespaces/:id/teams", namespaceTeamHandler.CreateWeb) - a.DELETE("/namespaces/:nid/teams/:teamid", namespaceTeamHandler.DeleteWeb) + a.PUT("/namespaces/:namespaceid/teams", namespaceTeamHandler.CreateWeb) + a.DELETE("/namespaces/:namespaceid/teams/:teamid", namespaceTeamHandler.DeleteWeb) teamHandler := &crud.WebHandler{ CObject: &models.Team{},