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