From c0898cc0e3c0a009353a14f38768af28865e5e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=98=99=E2=97=A6=20The=20Tablet=20=E2=9D=80=20GamerGirla?= =?UTF-8?q?ndCo=20=E2=97=A6=E2=9D=A7?= Date: Thu, 9 Jan 2025 19:02:28 -0500 Subject: [PATCH] [models/conds] add functions returning builders to help find repos matching various group-related conditions --- models/repo/repo_list.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go index e7923c9b1a..eef4578096 100644 --- a/models/repo/repo_list.go +++ b/models/repo/repo_list.go @@ -303,6 +303,12 @@ func userOrgTeamRepoBuilder(userID int64) *builder.Builder { Where(builder.Eq{"`team_user`.uid": userID}) } +// userOrgTeamRepoGroupBuilder selects repos that the given user has access to through team membership and group permissions +func userOrgTeamRepoGroupBuilder(userID int64) *builder.Builder { + return userOrgTeamRepoBuilder(userID). + Join("INNER", "group_team", "`group_team`.team_id=`team_repo`.team_id") +} + // userOrgTeamUnitRepoBuilder returns repo ids where user's teams can access the special unit. func userOrgTeamUnitRepoBuilder(userID int64, unitType unit.Type) *builder.Builder { return userOrgTeamRepoBuilder(userID). @@ -311,6 +317,13 @@ func userOrgTeamUnitRepoBuilder(userID int64, unitType unit.Type) *builder.Build And(builder.Gt{"`team_unit`.`access_mode`": int(perm.AccessModeNone)}) } +func userOrgTeamUnitRepoGroupBuilder(userID int64, unitType unit.Type) *builder.Builder { + return userOrgTeamRepoGroupBuilder(userID). + Join("INNER", "team_unit", "`team_unit`.team_id = `team_repo`.team_id"). + Where(builder.Eq{"`team_unit`.`type`": unitType}). + And(builder.Gt{"`team_unit`.`access_mode`": int(perm.AccessModeNone)}) +} + // userOrgTeamUnitRepoCond returns a condition to select repo ids where user's teams can access the special unit. func userOrgTeamUnitRepoCond(idStr string, userID int64, unitType unit.Type) builder.Cond { return builder.In(idStr, userOrgTeamUnitRepoBuilder(userID, unitType)) @@ -324,6 +337,17 @@ func UserOrgUnitRepoCond(idStr string, userID, orgID int64, unitType unit.Type) ) } +// ReposAccessibleByGroupTeamBuilder returns repositories that are accessible by a team via group permissions +func ReposAccessibleByGroupTeamBuilder(teamID int64) *builder.Builder { + innerGroupCond := builder.Select("`repo_group`.id"). + From("repo_group"). + InnerJoin("group_team", "`group_team`.group_id = `repo_group`.id"). + Where(builder.Eq{"`group_team`.team_id": teamID}) + return builder.Select("`repository`.id"). + From("repository"). + Where(builder.In("`repository`.group_id", innerGroupCond)) +} + // userOrgPublicRepoCond returns the condition that one user could access all public repositories in organizations func userOrgPublicRepoCond(userID int64) builder.Cond { return builder.And(