mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	use xorm builder for models.getReviewers() (#19033)
* xorm builder * dedup code
This commit is contained in:
		@@ -218,50 +218,44 @@ func getReviewers(ctx context.Context, repo *repo_model.Repository, doerID, post
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var users []*user_model.User
 | 
						cond := builder.And(builder.Neq{"`user`.id": posterID})
 | 
				
			||||||
	e := db.GetEngine(ctx)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if repo.IsPrivate || repo.Owner.Visibility == api.VisibleTypePrivate {
 | 
						if repo.IsPrivate || repo.Owner.Visibility == api.VisibleTypePrivate {
 | 
				
			||||||
		// This a private repository:
 | 
							// This a private repository:
 | 
				
			||||||
		// Anyone who can read the repository is a requestable reviewer
 | 
							// Anyone who can read the repository is a requestable reviewer
 | 
				
			||||||
		if err := e.
 | 
					
 | 
				
			||||||
			SQL("SELECT * FROM `user` WHERE id in ("+
 | 
							cond = cond.And(builder.In("`user`.id",
 | 
				
			||||||
				"SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id != ?"+ // private org repos
 | 
								builder.Select("user_id").From("access").Where(
 | 
				
			||||||
				") ORDER BY name",
 | 
									builder.Eq{"repo_id": repo.ID}.
 | 
				
			||||||
				repo.ID, perm.AccessModeRead,
 | 
										And(builder.Gte{"mode": perm.AccessModeRead}),
 | 
				
			||||||
				posterID).
 | 
								),
 | 
				
			||||||
			Find(&users); err != nil {
 | 
							))
 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if repo.Owner.Type == user_model.UserTypeIndividual && repo.Owner.ID != posterID {
 | 
							if repo.Owner.Type == user_model.UserTypeIndividual && repo.Owner.ID != posterID {
 | 
				
			||||||
			// as private *user* repos don't generate an entry in the `access` table,
 | 
								// as private *user* repos don't generate an entry in the `access` table,
 | 
				
			||||||
			// the owner of a private repo needs to be explicitly added.
 | 
								// the owner of a private repo needs to be explicitly added.
 | 
				
			||||||
			users = append(users, repo.Owner)
 | 
								cond = cond.Or(builder.Eq{"`user`.id": repo.Owner.ID})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return users, nil
 | 
						} else {
 | 
				
			||||||
 | 
							// This is a "public" repository:
 | 
				
			||||||
 | 
							// Any user that has read access, is a watcher or organization member can be requested to review
 | 
				
			||||||
 | 
							cond = cond.And(builder.And(builder.In("`user`.id",
 | 
				
			||||||
 | 
								builder.Select("user_id").From("access").
 | 
				
			||||||
 | 
									Where(builder.Eq{"repo_id": repo.ID}.
 | 
				
			||||||
 | 
										And(builder.Gte{"mode": perm.AccessModeRead})),
 | 
				
			||||||
 | 
							).Or(builder.In("`user`.id",
 | 
				
			||||||
 | 
								builder.Select("user_id").From("watch").
 | 
				
			||||||
 | 
									Where(builder.Eq{"repo_id": repo.ID}.
 | 
				
			||||||
 | 
										And(builder.In("mode", repo_model.WatchModeNormal, repo_model.WatchModeAuto))),
 | 
				
			||||||
 | 
							).Or(builder.In("`user`.id",
 | 
				
			||||||
 | 
								builder.Select("uid").From("org_user").
 | 
				
			||||||
 | 
									Where(builder.Eq{"org_id": repo.OwnerID}),
 | 
				
			||||||
 | 
							)))))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// This is a "public" repository:
 | 
						users := make([]*user_model.User, 0, 8)
 | 
				
			||||||
	// Any user that has read access, is a watcher or organization member can be requested to review
 | 
						return users, db.GetEngine(ctx).Where(cond).OrderBy("name").Find(&users)
 | 
				
			||||||
	if err := e.
 | 
					 | 
				
			||||||
		SQL("SELECT * FROM `user` WHERE id IN ( "+
 | 
					 | 
				
			||||||
			"SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? "+
 | 
					 | 
				
			||||||
			"UNION "+
 | 
					 | 
				
			||||||
			"SELECT user_id FROM `watch` WHERE repo_id = ? AND mode IN (?, ?) "+
 | 
					 | 
				
			||||||
			"UNION "+
 | 
					 | 
				
			||||||
			"SELECT uid AS user_id FROM `org_user` WHERE org_id = ? "+
 | 
					 | 
				
			||||||
			") AND id != ? ORDER BY name",
 | 
					 | 
				
			||||||
			repo.ID, perm.AccessModeRead,
 | 
					 | 
				
			||||||
			repo.ID, repo_model.WatchModeNormal, repo_model.WatchModeAuto,
 | 
					 | 
				
			||||||
			repo.OwnerID,
 | 
					 | 
				
			||||||
			posterID).
 | 
					 | 
				
			||||||
		Find(&users); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return users, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetReviewers get all users can be requested to review:
 | 
					// GetReviewers get all users can be requested to review:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user