|
9 | 9 |
|
10 | 10 | "code.gitea.io/gitea/models/db" |
11 | 11 | "code.gitea.io/gitea/models/perm" |
| 12 | + "code.gitea.io/gitea/models/unit" |
12 | 13 | user_model "code.gitea.io/gitea/models/user" |
| 14 | + "code.gitea.io/gitea/modules/container" |
13 | 15 | "code.gitea.io/gitea/modules/log" |
14 | 16 |
|
15 | 17 | "xorm.io/builder" |
@@ -112,6 +114,49 @@ func IsUserOrgOwner(ctx context.Context, users user_model.UserList, orgID int64) |
112 | 114 | return results |
113 | 115 | } |
114 | 116 |
|
| 117 | +// GetOrgAssignees returns all users that have write access and can be assigned to issues |
| 118 | +// of the any repository in the organization. |
| 119 | +func GetOrgAssignees(ctx context.Context, orgID int64) (_ []*user_model.User, err error) { |
| 120 | + e := db.GetEngine(ctx) |
| 121 | + userIDs := make([]int64, 0, 10) |
| 122 | + if err = e.Table("access"). |
| 123 | + Join("INNER", "repository", "`repository`.id = `access`.repo_id"). |
| 124 | + Where("`repository`.owner_id = ? AND `access`.mode >= ?", orgID, perm.AccessModeWrite). |
| 125 | + Select("user_id"). |
| 126 | + Find(&userIDs); err != nil { |
| 127 | + return nil, err |
| 128 | + } |
| 129 | + |
| 130 | + additionalUserIDs := make([]int64, 0, 10) |
| 131 | + if err = e.Table("team_user"). |
| 132 | + Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id"). |
| 133 | + Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id"). |
| 134 | + Join("INNER", "repository", "`repository`.id = `team_repo`.repo_id"). |
| 135 | + Where("`repository`.owner_id = ? AND (`team_unit`.access_mode >= ? OR (`team_unit`.access_mode = ? AND `team_unit`.`type` = ?))", |
| 136 | + orgID, perm.AccessModeWrite, perm.AccessModeRead, unit.TypePullRequests). |
| 137 | + Distinct("`team_user`.uid"). |
| 138 | + Select("`team_user`.uid"). |
| 139 | + Find(&additionalUserIDs); err != nil { |
| 140 | + return nil, err |
| 141 | + } |
| 142 | + |
| 143 | + uniqueUserIDs := make(container.Set[int64]) |
| 144 | + uniqueUserIDs.AddMultiple(userIDs...) |
| 145 | + uniqueUserIDs.AddMultiple(additionalUserIDs...) |
| 146 | + |
| 147 | + users := make([]*user_model.User, 0, len(uniqueUserIDs)) |
| 148 | + if len(userIDs) > 0 { |
| 149 | + if err = e.In("id", uniqueUserIDs.Values()). |
| 150 | + Where(builder.Eq{"`user`.is_active": true}). |
| 151 | + OrderBy(user_model.GetOrderByName()). |
| 152 | + Find(&users); err != nil { |
| 153 | + return nil, err |
| 154 | + } |
| 155 | + } |
| 156 | + |
| 157 | + return users, nil |
| 158 | +} |
| 159 | + |
115 | 160 | func loadOrganizationOwners(ctx context.Context, users user_model.UserList, orgID int64) (map[int64]*TeamUser, error) { |
116 | 161 | if len(users) == 0 { |
117 | 162 | return nil, nil |
|
0 commit comments