2014-06-25 00:44:48 -04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2019-02-18 17:00:27 +01:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2014-06-25 00:44:48 -04:00
package models
2014-06-27 03:37:01 -04:00
import (
2021-11-18 18:42:27 +01:00
"context"
2015-02-23 02:15:53 -05:00
"fmt"
2015-09-07 13:58:23 -04:00
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2022-03-29 14:29:02 +08:00
"code.gitea.io/gitea/models/organization"
2022-05-11 18:09:36 +08:00
access_model "code.gitea.io/gitea/models/perm/access"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2014-06-27 03:37:01 -04:00
)
2021-11-19 19:41:40 +08:00
func removeOrgUser ( ctx context . Context , orgID , userID int64 ) error {
2022-03-29 14:29:02 +08:00
ou := new ( organization . OrgUser )
2014-08-15 18:29:41 +08:00
2021-11-19 19:41:40 +08:00
sess := db . GetEngine ( ctx )
2018-07-27 01:41:36 +02:00
has , err := sess .
2016-11-10 16:16:32 +01:00
Where ( "uid=?" , userID ) .
And ( "org_id=?" , orgID ) .
Get ( ou )
2014-08-15 18:29:41 +08:00
if err != nil {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "get org-user: %w" , err )
2014-08-15 18:29:41 +08:00
} else if ! has {
return nil
}
2022-05-20 22:08:52 +08:00
org , err := organization . GetOrgByID ( ctx , orgID )
2014-08-24 21:09:05 +08:00
if err != nil {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "GetUserByID [%d]: %w" , orgID , err )
2014-08-24 21:09:05 +08:00
}
2016-07-24 14:32:46 +08:00
2014-08-16 16:21:17 +08:00
// Check if the user to delete is the last member in owner team.
2022-03-29 14:29:02 +08:00
if isOwner , err := organization . IsOrganizationOwner ( ctx , orgID , userID ) ; err != nil {
2017-12-20 23:43:26 -08:00
return err
} else if isOwner {
2022-03-29 14:29:02 +08:00
t , err := organization . GetOwnerTeam ( ctx , org . ID )
2014-08-16 16:21:17 +08:00
if err != nil {
return err
}
if t . NumMembers == 1 {
2022-12-03 10:48:26 +08:00
if err := t . LoadMembers ( ctx ) ; err != nil {
2017-12-13 06:26:31 +08:00
return err
}
if t . Members [ 0 ] . ID == userID {
2022-03-29 14:29:02 +08:00
return organization . ErrLastOrgOwner { UID : userID }
2017-12-13 06:26:31 +08:00
}
2014-08-16 16:21:17 +08:00
}
}
2017-10-04 21:43:04 -07:00
if _ , err := sess . ID ( ou . ID ) . Delete ( ou ) ; err != nil {
2014-08-15 18:29:41 +08:00
return err
2022-05-20 22:08:52 +08:00
} else if _ , err = db . Exec ( ctx , "UPDATE `user` SET num_members=num_members-1 WHERE id=?" , orgID ) ; err != nil {
2014-08-15 18:29:41 +08:00
return err
}
2016-07-24 14:32:46 +08:00
// Delete all repository accesses and unwatch them.
2022-03-29 14:29:02 +08:00
env , err := organization . AccessibleReposEnv ( ctx , org , userID )
2017-01-25 10:41:38 -05:00
if err != nil {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "AccessibleReposEnv: %w" , err )
2017-01-25 10:41:38 -05:00
}
repoIDs , err := env . RepoIDs ( 1 , org . NumRepos )
if err != nil {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "GetUserRepositories [%d]: %w" , userID , err )
2017-01-25 10:41:38 -05:00
}
for _ , repoID := range repoIDs {
2022-05-20 22:08:52 +08:00
if err = repo_model . WatchRepo ( ctx , userID , repoID , false ) ; err != nil {
2014-08-27 16:39:36 +08:00
return err
2014-08-24 21:09:05 +08:00
}
}
2016-08-10 20:06:51 +02:00
if len ( repoIDs ) > 0 {
2016-11-10 16:16:32 +01:00
if _ , err = sess .
2017-01-24 11:16:36 -05:00
Where ( "user_id = ?" , userID ) .
2016-11-10 16:16:32 +01:00
In ( "repo_id" , repoIDs ) .
2022-05-11 18:09:36 +08:00
Delete ( new ( access_model . Access ) ) ; err != nil {
2016-08-10 20:06:51 +02:00
return err
}
2016-07-24 14:32:46 +08:00
}
2014-08-24 21:09:05 +08:00
2022-06-26 00:50:12 +02:00
// Delete member in their teams.
2022-03-29 14:29:02 +08:00
teams , err := organization . GetUserOrgTeams ( ctx , org . ID , userID )
2014-08-24 21:09:05 +08:00
if err != nil {
return err
}
2015-03-17 21:51:39 -04:00
for _ , t := range teams {
2021-11-19 19:41:40 +08:00
if err = removeTeamMember ( ctx , t , userID ) ; err != nil {
2014-08-24 21:09:05 +08:00
return err
}
}
2018-02-23 16:42:02 +08:00
return nil
}
// RemoveOrgUser removes user from given organization.
func RemoveOrgUser ( orgID , userID int64 ) error {
2022-11-13 04:18:50 +08:00
ctx , committer , err := db . TxContext ( db . DefaultContext )
2021-11-19 19:41:40 +08:00
if err != nil {
2018-02-23 16:42:02 +08:00
return err
}
2021-11-19 19:41:40 +08:00
defer committer . Close ( )
if err := removeOrgUser ( ctx , orgID , userID ) ; err != nil {
2018-02-23 16:42:02 +08:00
return err
}
2021-11-19 19:41:40 +08:00
return committer . Commit ( )
2014-08-15 18:29:41 +08:00
}