@@ -218,50 +218,44 @@ func getReviewers(ctx context.Context, repo *repo_model.Repository, doerID, post
218218 return nil , err
219219 }
220220
221- var users []* user_model.User
222- e := db .GetEngine (ctx )
221+ cond := builder .And (builder.Neq {"`user`.id" : posterID })
223222
224223 if repo .IsPrivate || repo .Owner .Visibility == api .VisibleTypePrivate {
225224 // This a private repository:
226225 // Anyone who can read the repository is a requestable reviewer
227- if err := e .
228- SQL ("SELECT * FROM `user` WHERE id in (" +
229- "SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id != ?" + // private org repos
230- ") ORDER BY name" ,
231- repo .ID , perm .AccessModeRead ,
232- posterID ).
233- Find (& users ); err != nil {
234- return nil , err
235- }
226+
227+ cond = cond .And (builder .In ("`user`.id" ,
228+ builder .Select ("user_id" ).From ("access" ).Where (
229+ builder.Eq {"repo_id" : repo .ID }.
230+ And (builder.Gte {"mode" : perm .AccessModeRead }),
231+ ),
232+ ))
236233
237234 if repo .Owner .Type == user_model .UserTypeIndividual && repo .Owner .ID != posterID {
238235 // as private *user* repos don't generate an entry in the `access` table,
239236 // the owner of a private repo needs to be explicitly added.
240- users = append ( users , repo .Owner )
237+ cond = cond . Or (builder. Eq { "`user`.id" : repo .Owner . ID } )
241238 }
242239
243- return users , nil
244- }
245-
246- // This is a "public" repository:
247- // Any user that has read access, is a watcher or organization member can be requested to review
248- if err := e .
249- SQL ("SELECT * FROM `user` WHERE id IN ( " +
250- "SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? " +
251- "UNION " +
252- "SELECT user_id FROM `watch` WHERE repo_id = ? AND mode IN (?, ?) " +
253- "UNION " +
254- "SELECT uid AS user_id FROM `org_user` WHERE org_id = ? " +
255- ") AND id != ? ORDER BY name" ,
256- repo .ID , perm .AccessModeRead ,
257- repo .ID , repo_model .WatchModeNormal , repo_model .WatchModeAuto ,
258- repo .OwnerID ,
259- posterID ).
260- Find (& users ); err != nil {
261- return nil , err
262- }
263-
264- return users , nil
240+ } else {
241+ // This is a "public" repository:
242+ // Any user that has read access, is a watcher or organization member can be requested to review
243+ cond = cond .And (builder .And (builder .In ("`user`.id" ,
244+ builder .Select ("user_id" ).From ("access" ).
245+ Where (builder.Eq {"repo_id" : repo .ID }.
246+ And (builder.Gte {"mode" : perm .AccessModeRead })),
247+ ).Or (builder .In ("`user`.id" ,
248+ builder .Select ("user_id" ).From ("watch" ).
249+ Where (builder.Eq {"repo_id" : repo .ID }.
250+ And (builder .In ("mode" , repo_model .WatchModeNormal , repo_model .WatchModeAuto ))),
251+ ).Or (builder .In ("`user`.id" ,
252+ builder .Select ("uid" ).From ("org_user" ).
253+ Where (builder.Eq {"org_id" : repo .OwnerID }),
254+ )))))
255+ }
256+
257+ users := make ([]* user_model.User , 0 , 8 )
258+ return users , db .GetEngine (ctx ).Where (cond ).OrderBy ("name" ).Find (& users )
265259}
266260
267261// GetReviewers get all users can be requested to review:
0 commit comments