diff --git a/models/error.go b/models/error.go index b6fe3128d35..42cbc6bb16a 100644 --- a/models/error.go +++ b/models/error.go @@ -434,3 +434,19 @@ func IsErrInvalidTeamRight(err error) bool { func (err ErrInvalidTeamRight) Error() string { return fmt.Sprintf("The right is invalid [Right: %d]", err.Right) } + +// ErrTeamAlreadyHasAccess represents an error where a team already has access to a list/namespace +type ErrTeamAlreadyHasAccess struct { + TeamID int64 + ID int64 +} + +// IsErrTeamAlreadyHasAccess checks if an error is ErrTeamAlreadyHasAccess. +func IsErrTeamAlreadyHasAccess(err error) bool { + _, ok := err.(ErrTeamAlreadyHasAccess) + return ok +} + +func (err ErrTeamAlreadyHasAccess) Error() string { + return fmt.Sprintf("This team already has access. [Team ID: %d, ID: %d]", err.TeamID, err.ID) +} \ No newline at end of file diff --git a/models/team_list_create.go b/models/team_list_create.go index 3ed547f0322..830f0c63aac 100644 --- a/models/team_list_create.go +++ b/models/team_list_create.go @@ -20,6 +20,17 @@ func (tl *TeamList) Create(doer *User) (err error) { return } + // Check if the team is already on the list + exists, err := x.Where("team_id = ?", tl.TeamID). + And("list_id = ?", tl.ListID). + Get(&TeamList{}) + if err != nil { + return + } + if exists { + return ErrTeamAlreadyHasAccess{tl.TeamID, tl.ListID} + } + // Insert the new team _, err = x.Insert(tl) return diff --git a/models/team_members_create.go b/models/team_members_create.go index 25fc01d323d..dfb555849c2 100644 --- a/models/team_members_create.go +++ b/models/team_members_create.go @@ -2,7 +2,7 @@ package models // Create implements the create method to assign a user to a team func (tm *TeamMember) Create(doer *User) (err error) { - //tm.TeamID = id + // TODO: Check if it exists etc _, err = x.Insert(tm) return } diff --git a/models/team_namespace_create.go b/models/team_namespace_create.go index 3a365990de1..f8f307126b5 100644 --- a/models/team_namespace_create.go +++ b/models/team_namespace_create.go @@ -19,6 +19,17 @@ func (tn *TeamNamespace) Create(doer *User) (err error) { if err != nil { return } + + // Check if the team already has access to the namespace + exists, err := x.Where("team_id = ?", tn.TeamID). + And("namespace_id = ?", tn.NamespaceID). + Get(&TeamNamespace{}) + if err != nil { + return + } + if exists { + return ErrTeamAlreadyHasAccess{tn.TeamID, tn.NamespaceID} + } // Insert the new team _, err = x.Insert(tn) diff --git a/routes/crud/create.go b/routes/crud/create.go index 5fea52a28f1..fb95dbcbbb7 100644 --- a/routes/crud/create.go +++ b/routes/crud/create.go @@ -53,6 +53,10 @@ func (c *WebHandler) CreateWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "The team name cannot be empty.") } + if models.IsErrTeamAlreadyHasAccess(err) { + return echo.NewHTTPError(http.StatusBadRequest, "This team already has access.") + } + return echo.NewHTTPError(http.StatusInternalServerError) }