diff --git a/pkg/models/team_members.go b/pkg/models/team_members.go index 62dd9ad162..f236f5f97c 100644 --- a/pkg/models/team_members.go +++ b/pkg/models/team_members.go @@ -79,7 +79,7 @@ func (tm *TeamMember) Create(s *xorm.Session, a web.Auth) (err error) { // Delete deletes a user from a team // @Summary Remove a user from a team -// @Description Remove a user from a team. This will also revoke any access this user might have via that team. +// @Description Remove a user from a team. This will also revoke any access this user might have via that team. A user can remove themselves from the team if they are not the last user in the team. // @tags team // @Produce json // @Security JWTKeyAuth diff --git a/pkg/models/team_members_rights.go b/pkg/models/team_members_rights.go index 910d0a16cb..b1a3db2b41 100644 --- a/pkg/models/team_members_rights.go +++ b/pkg/models/team_members_rights.go @@ -17,6 +17,7 @@ package models import ( + "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" "xorm.io/xorm" ) @@ -28,6 +29,13 @@ func (tm *TeamMember) CanCreate(s *xorm.Session, a web.Auth) (bool, error) { // CanDelete checks if the user can delete a new team member func (tm *TeamMember) CanDelete(s *xorm.Session, a web.Auth) (bool, error) { + u, err := user.GetUserByUsername(s, tm.Username) + if err != nil { + return false, err + } + if u.ID == a.GetID() { + return true, nil + } return tm.IsAdmin(s, a) } diff --git a/pkg/models/teams.go b/pkg/models/teams.go index 3ed3cd88a7..0b21a5bd96 100644 --- a/pkg/models/teams.go +++ b/pkg/models/teams.go @@ -79,7 +79,7 @@ type TeamMember struct { } // TableName makes beautiful table names -func (TeamMember) TableName() string { +func (*TeamMember) TableName() string { return "team_members" } diff --git a/pkg/swagger/docs.go b/pkg/swagger/docs.go index 793bd1f76c..fec1f2452f 100644 --- a/pkg/swagger/docs.go +++ b/pkg/swagger/docs.go @@ -6167,7 +6167,7 @@ const docTemplate = `{ "JWTKeyAuth": [] } ], - "description": "Remove a user from a team. This will also revoke any access this user might have via that team.", + "description": "Remove a user from a team. This will also revoke any access this user might have via that team. A user can remove themselves from the team if they are not the last user in the team.", "produces": [ "application/json" ], diff --git a/pkg/swagger/swagger.json b/pkg/swagger/swagger.json index e0fe3b3a25..30eb40d18c 100644 --- a/pkg/swagger/swagger.json +++ b/pkg/swagger/swagger.json @@ -6158,7 +6158,7 @@ "JWTKeyAuth": [] } ], - "description": "Remove a user from a team. This will also revoke any access this user might have via that team.", + "description": "Remove a user from a team. This will also revoke any access this user might have via that team. A user can remove themselves from the team if they are not the last user in the team.", "produces": [ "application/json" ], diff --git a/pkg/swagger/swagger.yaml b/pkg/swagger/swagger.yaml index 9edbb387fa..34e6fc3bf9 100644 --- a/pkg/swagger/swagger.yaml +++ b/pkg/swagger/swagger.yaml @@ -5554,7 +5554,8 @@ paths: /teams/{id}/members/{userID}: delete: description: Remove a user from a team. This will also revoke any access this - user might have via that team. + user might have via that team. A user can remove themselves from the team + if they are not the last user in the team. parameters: - description: Team ID in: path