2016-03-06 02:08:42 +03:00
// Copyright 2016 The Gogs Authors. All rights reserved.
2020-01-24 22:00:29 +03:00
// Copyright 2020 The Gitea Authors.
2016-03-06 02:08:42 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
2021-12-10 04:27:50 +03:00
"context"
2016-03-06 02:08:42 +03:00
"fmt"
2020-04-08 00:52:01 +03:00
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2021-11-28 14:58:28 +03:00
"code.gitea.io/gitea/models/perm"
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"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-10-13 03:01:57 +03:00
2020-04-08 00:52:01 +03:00
"xorm.io/builder"
2016-03-06 02:08:42 +03:00
)
2021-12-10 04:27:50 +03:00
func addCollaborator ( ctx context . Context , repo * repo_model . Repository , u * user_model . User ) error {
2022-05-11 13:09:36 +03:00
collaboration := & repo_model . Collaboration {
2016-03-06 02:08:42 +03:00
RepoID : repo . ID ,
2016-07-23 20:08:22 +03:00
UserID : u . ID ,
2016-03-06 02:08:42 +03:00
}
2022-06-04 22:18:50 +03:00
has , err := db . GetByBean ( ctx , collaboration )
2016-03-06 02:08:42 +03:00
if err != nil {
return err
} else if has {
return nil
}
2021-11-28 14:58:28 +03:00
collaboration . Mode = perm . AccessModeWrite
2016-03-06 02:08:42 +03:00
2022-06-04 22:18:50 +03:00
if err = db . Insert ( ctx , collaboration ) ; err != nil {
2016-03-06 02:08:42 +03:00
return err
}
2022-05-11 13:09:36 +03:00
return access_model . RecalculateUserAccess ( ctx , repo , u . ID )
2019-11-20 14:27:49 +03:00
}
// AddCollaborator adds new collaboration to a repository with default access mode.
2021-12-10 04:27:50 +03:00
func AddCollaborator ( repo * repo_model . Repository , u * user_model . User ) error {
2021-11-21 18:41:00 +03:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2016-03-06 02:08:42 +03:00
return err
}
2021-11-21 18:41:00 +03:00
defer committer . Close ( )
2016-03-06 02:08:42 +03:00
2021-12-10 04:27:50 +03:00
if err := addCollaborator ( ctx , repo , u ) ; err != nil {
2019-11-20 14:27:49 +03:00
return err
2016-03-06 02:08:42 +03:00
}
2021-11-21 18:41:00 +03:00
return committer . Commit ( )
2016-03-06 02:08:42 +03:00
}
// DeleteCollaboration removes collaboration relation between the user and repository.
2021-12-10 04:27:50 +03:00
func DeleteCollaboration ( repo * repo_model . Repository , uid int64 ) ( err error ) {
2022-05-11 13:09:36 +03:00
collaboration := & repo_model . Collaboration {
2016-03-06 02:08:42 +03:00
RepoID : repo . ID ,
UserID : uid ,
}
2021-11-21 18:41:00 +03:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2016-03-06 02:08:42 +03:00
return err
}
2021-11-21 18:41:00 +03:00
defer committer . Close ( )
2021-12-12 18:48:20 +03:00
if has , err := db . GetEngine ( ctx ) . Delete ( collaboration ) ; err != nil || has == 0 {
2016-03-06 02:08:42 +03:00
return err
2022-05-11 13:09:36 +03:00
} else if err = access_model . RecalculateAccesses ( ctx , repo ) ; err != nil {
2016-03-06 02:08:42 +03:00
return err
}
2022-05-20 17:08:52 +03:00
if err = repo_model . WatchRepo ( ctx , uid , repo . ID , false ) ; err != nil {
2018-06-19 22:44:33 +03:00
return err
}
2021-12-10 04:27:50 +03:00
if err = reconsiderWatches ( ctx , repo , uid ) ; err != nil {
2020-04-08 00:52:01 +03:00
return err
}
// Unassign a user from any issue (s)he has been assigned to in the repository
2021-12-10 04:27:50 +03:00
if err := reconsiderRepoIssuesAssignee ( ctx , repo , uid ) ; err != nil {
2018-06-19 22:44:33 +03:00
return err
}
2021-11-21 18:41:00 +03:00
return committer . Commit ( )
2016-03-06 02:08:42 +03:00
}
2019-09-23 23:08:03 +03:00
2021-12-10 04:27:50 +03:00
func reconsiderRepoIssuesAssignee ( ctx context . Context , repo * repo_model . Repository , uid int64 ) error {
2022-05-20 17:08:52 +03:00
user , err := user_model . GetUserByIDCtx ( ctx , uid )
2020-04-08 00:52:01 +03:00
if err != nil {
return err
}
2022-05-11 13:09:36 +03:00
if canAssigned , err := access_model . CanBeAssigned ( ctx , user , repo , true ) ; err != nil || canAssigned {
2020-04-08 00:52:01 +03:00
return err
}
2021-12-10 04:27:50 +03:00
if _ , err := db . GetEngine ( ctx ) . Where ( builder . Eq { "assignee_id" : uid } ) .
2020-04-08 00:52:01 +03:00
In ( "issue_id" , builder . Select ( "id" ) . From ( "issue" ) . Where ( builder . Eq { "repo_id" : repo . ID } ) ) .
2022-06-13 12:37:59 +03:00
Delete ( & issues_model . IssueAssignees { } ) ; err != nil {
2020-04-08 00:52:01 +03:00
return fmt . Errorf ( "Could not delete assignee[%d] %v" , uid , err )
}
return nil
}
2021-12-10 04:27:50 +03:00
func reconsiderWatches ( ctx context . Context , repo * repo_model . Repository , uid int64 ) error {
2022-05-11 13:09:36 +03:00
if has , err := access_model . HasAccess ( ctx , uid , repo ) ; err != nil || has {
2020-04-08 00:52:01 +03:00
return err
}
2022-05-20 17:08:52 +03:00
if err := repo_model . WatchRepo ( ctx , uid , repo . ID , false ) ; err != nil {
2020-04-08 00:52:01 +03:00
return err
}
// Remove all IssueWatches a user has subscribed to in the repository
2022-06-13 12:37:59 +03:00
return issues_model . RemoveIssueWatchersByRepoID ( ctx , uid , repo . ID )
2020-04-08 00:52:01 +03:00
}