diff options
Diffstat (limited to 'models/repo.go')
-rw-r--r-- | models/repo.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/models/repo.go b/models/repo.go index 74b5a021f4..8f0736ef82 100644 --- a/models/repo.go +++ b/models/repo.go @@ -622,6 +622,64 @@ func (repo *Repository) GetAssignees() (_ []*User, err error) { return repo.getAssignees(x) } +func (repo *Repository) getReviewersPrivate(e Engine, doerID, posterID int64) (users []*User, err error) { + users = make([]*User, 0, 20) + + if err = e. + SQL("SELECT * FROM `user` WHERE id in (SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id NOT IN ( ?, ?)) ORDER BY name", + repo.ID, AccessModeRead, + doerID, posterID). + Find(&users); err != nil { + return nil, err + } + + return users, nil +} + +func (repo *Repository) getReviewersPublic(e Engine, doerID, posterID int64) (_ []*User, err error) { + + users := make([]*User, 0) + + const SQLCmd = "SELECT * FROM `user` WHERE id IN ( " + + "SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id NOT IN ( ?, ?) " + + "UNION " + + "SELECT user_id FROM `watch` WHERE repo_id = ? AND user_id NOT IN ( ?, ?) AND mode IN (?, ?) " + + ") ORDER BY name" + + if err = e. + SQL(SQLCmd, + repo.ID, AccessModeRead, doerID, posterID, + repo.ID, doerID, posterID, RepoWatchModeNormal, RepoWatchModeAuto). + Find(&users); err != nil { + return nil, err + } + + return users, nil +} + +func (repo *Repository) getReviewers(e Engine, doerID, posterID int64) (users []*User, err error) { + if err = repo.getOwner(e); err != nil { + return nil, err + } + + if repo.IsPrivate || + (repo.Owner.IsOrganization() && repo.Owner.Visibility == api.VisibleTypePrivate) { + users, err = repo.getReviewersPrivate(x, doerID, posterID) + } else { + users, err = repo.getReviewersPublic(x, doerID, posterID) + } + return +} + +// GetReviewers get all users can be requested to review +// for private rpo , that return all users that have read access or higher to the repository. +// but for public rpo, that return all users that have write access or higher to the repository, +// and all repo watchers. +// TODO: may be we should hava a busy choice for users to block review request to them. +func (repo *Repository) GetReviewers(doerID, posterID int64) (_ []*User, err error) { + return repo.getReviewers(x, doerID, posterID) +} + // GetMilestoneByID returns the milestone belongs to repository by given ID. func (repo *Repository) GetMilestoneByID(milestoneID int64) (*Milestone, error) { return GetMilestoneByRepoID(repo.ID, milestoneID) |