From 7feb82702d7fbae7410443daaeaf0106036927de Mon Sep 17 00:00:00 2001 From: konrad Date: Tue, 17 Jul 2018 08:44:21 +0200 Subject: [PATCH] implemented create team <-> namespace relation --- Featurecreep.md | 2 +- models/error.go | 15 +++++++++++++++ models/team_namespace.go | 20 ++++++++++++++++++++ models/team_namespace_create.go | 27 +++++++++++++++++++++++++++ models/team_namespace_rights.go | 7 +++++++ models/teams.go | 16 ---------------- routes/crud/create.go | 3 +++ routes/routes.go | 7 +++++++ 8 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 models/team_namespace.go create mode 100644 models/team_namespace_create.go create mode 100644 models/team_namespace_rights.go diff --git a/Featurecreep.md b/Featurecreep.md index be6c9e549a..a99b24fc1e 100644 --- a/Featurecreep.md +++ b/Featurecreep.md @@ -133,7 +133,7 @@ Teams sind global, d.h. Ein Team kann mehrere Namespaces verwalten. *Routen* * [ ] `namespaces/:id/teams` - * [ ] Create + * [x] Create * [ ] ReadAll * [ ] Delete * [ ] `lists/:id/teams` diff --git a/models/error.go b/models/error.go index 55de12eca4..9908c04543 100644 --- a/models/error.go +++ b/models/error.go @@ -387,3 +387,18 @@ func IsErrTeamDoesNotExist(err error) bool { func (err ErrTeamDoesNotExist) Error() string { return fmt.Sprintf("Team does not exist [Team ID: %d]", err.TeamID) } + +// ErrInvalidTeamRight represents an error where a team right is invalid +type ErrInvalidTeamRight struct { + Right NamespaceRight +} + +// IsErrInvalidTeamRight checks if an error is ErrInvalidTeamRight. +func IsErrInvalidTeamRight(err error) bool { + _, ok := err.(ErrInvalidTeamRight) + return ok +} + +func (err ErrInvalidTeamRight) Error() string { + return fmt.Sprintf("The right is invalid [Right: %d]", err.Right) +} diff --git a/models/team_namespace.go b/models/team_namespace.go new file mode 100644 index 0000000000..589ade774d --- /dev/null +++ b/models/team_namespace.go @@ -0,0 +1,20 @@ +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"` + Right NamespaceRight `xorm:"int(11)" json:"right"` + + Created int64 `xorm:"created" json:"created"` + Updated int64 `xorm:"updated" json:"updated"` + + CRUDable `xorm:"-" json:"-"` + Rights `xorm:"-" json:"-"` +} + +// TableName makes beautiful table names +func (TeamNamespace) TableName() string { + return "team_namespaces" +} diff --git a/models/team_namespace_create.go b/models/team_namespace_create.go new file mode 100644 index 0000000000..e51e69d7bb --- /dev/null +++ b/models/team_namespace_create.go @@ -0,0 +1,27 @@ +package models + +// Create creates a new team <-> namespace relation +func (tn *TeamNamespace) Create(doer *User, nID int64) (err error) { + + // Check if the rights are valid + if tn.Right != NamespaceRightAdmin && tn.Right != NamespaceRightRead && tn.Right != NamespaceRightWrite { + return ErrInvalidTeamRight{tn.Right} + } + + // Check if the team exists + _, err = GetTeamByID(tn.TeamID) + if err != nil { + return + } + + // Check if the namespace exists + _, err = GetNamespaceByID(nID) + if err != nil { + return + } + tn.NamespaceID = nID + + // Insert the new team + _, err = x.Insert(tn) + return +} diff --git a/models/team_namespace_rights.go b/models/team_namespace_rights.go new file mode 100644 index 0000000000..b29dd6294b --- /dev/null +++ b/models/team_namespace_rights.go @@ -0,0 +1,7 @@ +package models + +// CanCreate checks if one can create a new team <-> namespace relation +func (tn *TeamNamespace) CanCreate(user *User, _ int64) bool { + n, _ := GetNamespaceByID(tn.NamespaceID) + return n.IsAdmin(user) +} diff --git a/models/teams.go b/models/teams.go index 92a32514c7..4fa8b8c698 100644 --- a/models/teams.go +++ b/models/teams.go @@ -60,22 +60,6 @@ type TeamUser struct { IsAdmin bool `json:"is_admin"` } -// 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"` - Rights NamespaceRight `xorm:"int(11)" json:"rights"` - - Created int64 `xorm:"created" json:"created"` - Updated int64 `xorm:"updated" json:"updated"` -} - -// TableName makes beautiful table names -func (TeamNamespace) TableName() string { - return "team_namespaces" -} - // TeamList defines the relation between a team and a list type TeamList struct { ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id"` diff --git a/routes/crud/create.go b/routes/crud/create.go index a75e28a3eb..19b8e614b6 100644 --- a/routes/crud/create.go +++ b/routes/crud/create.go @@ -1,6 +1,7 @@ package crud import ( + "fmt" "git.kolaente.de/konrad/list/models" "github.com/labstack/echo" "net/http" @@ -62,6 +63,8 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "The team name cannot be empty.") } + fmt.Println(err) + return echo.NewHTTPError(http.StatusInternalServerError) } diff --git a/routes/routes.go b/routes/routes.go index 5804c2f167..7e52ff60dc 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -113,6 +113,13 @@ func RegisterRoutes(e *echo.Echo) { a.DELETE("/namespaces/:id", namespaceHandler.DeleteWeb) a.GET("/namespaces/:id/lists", apiv1.GetListsByNamespaceID) + namespaceTeamHandler := &crud.WebHandler{ + CObject: &models.TeamNamespace{}, + } + a.GET("/namespaces/:id/teams", namespaceTeamHandler.ReadAllWeb) + a.PUT("/namespaces/:id/teams", namespaceTeamHandler.CreateWeb) + a.DELETE("/namespaces/:nid/teams/:id", namespaceTeamHandler.DeleteWeb) + teamHandler := &crud.WebHandler{ CObject: &models.Team{}, }