|
|
@@ -249,14 +249,35 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond { |
|
|
|
} |
|
|
|
|
|
|
|
if opts.Collaborate != util.OptionalBoolFalse { |
|
|
|
// A Collaboration is: |
|
|
|
collaborateCond := builder.And( |
|
|
|
// 1. Repository we don't own |
|
|
|
builder.Neq{"owner_id": opts.OwnerID}, |
|
|
|
// 2. But we can see because of: |
|
|
|
builder.Or( |
|
|
|
builder.Expr("repository.id IN (SELECT repo_id FROM `access` WHERE access.user_id = ?)", opts.OwnerID), |
|
|
|
builder.In("id", builder.Select("`team_repo`.repo_id"). |
|
|
|
// A. We have access |
|
|
|
builder.In("`repository`.id", |
|
|
|
builder.Select("`access`.repo_id"). |
|
|
|
From("access"). |
|
|
|
Where(builder.Eq{"`access`.user_id": opts.OwnerID})), |
|
|
|
// B. We are in a team for |
|
|
|
builder.In("`repository`.id", builder.Select("`team_repo`.repo_id"). |
|
|
|
From("team_repo"). |
|
|
|
Where(builder.Eq{"`team_user`.uid": opts.OwnerID}). |
|
|
|
Join("INNER", "team_user", "`team_user`.team_id = `team_repo`.team_id"))), |
|
|
|
builder.Neq{"owner_id": opts.OwnerID}) |
|
|
|
Join("INNER", "team_user", "`team_user`.team_id = `team_repo`.team_id")), |
|
|
|
// C. Public repositories in private organizations that we are member of |
|
|
|
builder.And( |
|
|
|
builder.Eq{"`repository`.is_private": false}, |
|
|
|
builder.In("`repository`.owner_id", |
|
|
|
builder.Select("`org_user`.org_id"). |
|
|
|
From("org_user"). |
|
|
|
Join("INNER", "`user`", "`user`.id = `org_user`.org_id"). |
|
|
|
Where(builder.Eq{ |
|
|
|
"`org_user`.uid": opts.OwnerID, |
|
|
|
"`user`.type": UserTypeOrganization, |
|
|
|
"`user`.visibility": structs.VisibleTypePrivate, |
|
|
|
})))), |
|
|
|
) |
|
|
|
if !opts.Private { |
|
|
|
collaborateCond = collaborateCond.And(builder.Expr("owner_id NOT IN (SELECT org_id FROM org_user WHERE org_user.uid = ? AND org_user.is_public = ?)", opts.OwnerID, false)) |
|
|
|
} |