implemented create team <-> namespace relation

This commit is contained in:
konrad 2018-07-17 08:44:21 +02:00 committed by kolaente
parent 2e3c10be13
commit 7feb82702d
No known key found for this signature in database
GPG key ID: F40E70337AB24C9B
8 changed files with 80 additions and 17 deletions

View file

@ -133,7 +133,7 @@ Teams sind global, d.h. Ein Team kann mehrere Namespaces verwalten.
*Routen* *Routen*
* [ ] `namespaces/:id/teams` * [ ] `namespaces/:id/teams`
* [ ] Create * [x] Create
* [ ] ReadAll * [ ] ReadAll
* [ ] Delete * [ ] Delete
* [ ] `lists/:id/teams` * [ ] `lists/:id/teams`

View file

@ -387,3 +387,18 @@ func IsErrTeamDoesNotExist(err error) bool {
func (err ErrTeamDoesNotExist) Error() string { func (err ErrTeamDoesNotExist) Error() string {
return fmt.Sprintf("Team does not exist [Team ID: %d]", err.TeamID) 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)
}

20
models/team_namespace.go Normal file
View file

@ -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"
}

View file

@ -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
}

View file

@ -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)
}

View file

@ -60,22 +60,6 @@ type TeamUser struct {
IsAdmin bool `json:"is_admin"` 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 // TeamList defines the relation between a team and a list
type TeamList struct { type TeamList 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"`

View file

@ -1,6 +1,7 @@
package crud package crud
import ( import (
"fmt"
"git.kolaente.de/konrad/list/models" "git.kolaente.de/konrad/list/models"
"github.com/labstack/echo" "github.com/labstack/echo"
"net/http" "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.") return echo.NewHTTPError(http.StatusBadRequest, "The team name cannot be empty.")
} }
fmt.Println(err)
return echo.NewHTTPError(http.StatusInternalServerError) return echo.NewHTTPError(http.StatusInternalServerError)
} }

View file

@ -113,6 +113,13 @@ func RegisterRoutes(e *echo.Echo) {
a.DELETE("/namespaces/:id", namespaceHandler.DeleteWeb) a.DELETE("/namespaces/:id", namespaceHandler.DeleteWeb)
a.GET("/namespaces/:id/lists", apiv1.GetListsByNamespaceID) 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{ teamHandler := &crud.WebHandler{
CObject: &models.Team{}, CObject: &models.Team{},
} }