mirror of https://github.com/go-gitea/gitea
Move RepoTransfer from models to models/repo sub package (#32506)
`RepoTransfer` now is at models, but if we want to move it into `repo` model, it will depend on `Team`. So this PR also makes repo model depend on org model to make it possible. Just refactor, no code change. - [x] Move `DeleteOrganization` from `models/organization` to service layer - [x] Move `AccessibleTeamReposEnv` to `models/repo` - [x] Move `RepoTransfer` from `models` to `models/repo` - [x] Merge `getUserTeamIDs` and `GetUserTeamIDs`, Merge `GetUserTeams` and `getUserTeams`. - [x] Remove `Team`'s `Repos []*repo_model.Repository` to avoid dependency recycle.pull/32201/head^2
parent
b945742293
commit
e4c4629465
@ -1,17 +0,0 @@ |
|||||||
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
package organization |
|
||||||
|
|
||||||
import ( |
|
||||||
"context" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db" |
|
||||||
repo_model "code.gitea.io/gitea/models/repo" |
|
||||||
) |
|
||||||
|
|
||||||
// GetOrgRepositories get repos belonging to the given organization
|
|
||||||
func GetOrgRepositories(ctx context.Context, orgID int64) (repo_model.RepositoryList, error) { |
|
||||||
var orgRepos []*repo_model.Repository |
|
||||||
return orgRepos, db.GetEngine(ctx).Where("owner_id = ?", orgID).Find(&orgRepos) |
|
||||||
} |
|
@ -0,0 +1,206 @@ |
|||||||
|
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package repo |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"fmt" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db" |
||||||
|
org_model "code.gitea.io/gitea/models/organization" |
||||||
|
user_model "code.gitea.io/gitea/models/user" |
||||||
|
|
||||||
|
"xorm.io/builder" |
||||||
|
) |
||||||
|
|
||||||
|
// GetOrgRepositories get repos belonging to the given organization
|
||||||
|
func GetOrgRepositories(ctx context.Context, orgID int64) (RepositoryList, error) { |
||||||
|
var orgRepos []*Repository |
||||||
|
return orgRepos, db.GetEngine(ctx).Where("owner_id = ?", orgID).Find(&orgRepos) |
||||||
|
} |
||||||
|
|
||||||
|
type SearchTeamRepoOptions struct { |
||||||
|
db.ListOptions |
||||||
|
TeamID int64 |
||||||
|
} |
||||||
|
|
||||||
|
// GetRepositories returns paginated repositories in team of organization.
|
||||||
|
func GetTeamRepositories(ctx context.Context, opts *SearchTeamRepoOptions) (RepositoryList, error) { |
||||||
|
sess := db.GetEngine(ctx) |
||||||
|
if opts.TeamID > 0 { |
||||||
|
sess = sess.In("id", |
||||||
|
builder.Select("repo_id"). |
||||||
|
From("team_repo"). |
||||||
|
Where(builder.Eq{"team_id": opts.TeamID}), |
||||||
|
) |
||||||
|
} |
||||||
|
if opts.PageSize > 0 { |
||||||
|
sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) |
||||||
|
} |
||||||
|
var repos []*Repository |
||||||
|
return repos, sess.OrderBy("repository.name"). |
||||||
|
Find(&repos) |
||||||
|
} |
||||||
|
|
||||||
|
// AccessibleReposEnvironment operations involving the repositories that are
|
||||||
|
// accessible to a particular user
|
||||||
|
type AccessibleReposEnvironment interface { |
||||||
|
CountRepos() (int64, error) |
||||||
|
RepoIDs(page, pageSize int) ([]int64, error) |
||||||
|
Repos(page, pageSize int) (RepositoryList, error) |
||||||
|
MirrorRepos() (RepositoryList, error) |
||||||
|
AddKeyword(keyword string) |
||||||
|
SetSort(db.SearchOrderBy) |
||||||
|
} |
||||||
|
|
||||||
|
type accessibleReposEnv struct { |
||||||
|
org *org_model.Organization |
||||||
|
user *user_model.User |
||||||
|
team *org_model.Team |
||||||
|
teamIDs []int64 |
||||||
|
ctx context.Context |
||||||
|
keyword string |
||||||
|
orderBy db.SearchOrderBy |
||||||
|
} |
||||||
|
|
||||||
|
// AccessibleReposEnv builds an AccessibleReposEnvironment for the repositories in `org`
|
||||||
|
// that are accessible to the specified user.
|
||||||
|
func AccessibleReposEnv(ctx context.Context, org *org_model.Organization, userID int64) (AccessibleReposEnvironment, error) { |
||||||
|
var user *user_model.User |
||||||
|
|
||||||
|
if userID > 0 { |
||||||
|
u, err := user_model.GetUserByID(ctx, userID) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
user = u |
||||||
|
} |
||||||
|
|
||||||
|
teamIDs, err := org.GetUserTeamIDs(ctx, userID) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
return &accessibleReposEnv{ |
||||||
|
org: org, |
||||||
|
user: user, |
||||||
|
teamIDs: teamIDs, |
||||||
|
ctx: ctx, |
||||||
|
orderBy: db.SearchOrderByRecentUpdated, |
||||||
|
}, nil |
||||||
|
} |
||||||
|
|
||||||
|
// AccessibleTeamReposEnv an AccessibleReposEnvironment for the repositories in `org`
|
||||||
|
// that are accessible to the specified team.
|
||||||
|
func AccessibleTeamReposEnv(ctx context.Context, org *org_model.Organization, team *org_model.Team) AccessibleReposEnvironment { |
||||||
|
return &accessibleReposEnv{ |
||||||
|
org: org, |
||||||
|
team: team, |
||||||
|
ctx: ctx, |
||||||
|
orderBy: db.SearchOrderByRecentUpdated, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) cond() builder.Cond { |
||||||
|
cond := builder.NewCond() |
||||||
|
if env.team != nil { |
||||||
|
cond = cond.And(builder.Eq{"team_repo.team_id": env.team.ID}) |
||||||
|
} else { |
||||||
|
if env.user == nil || !env.user.IsRestricted { |
||||||
|
cond = cond.Or(builder.Eq{ |
||||||
|
"`repository`.owner_id": env.org.ID, |
||||||
|
"`repository`.is_private": false, |
||||||
|
}) |
||||||
|
} |
||||||
|
if len(env.teamIDs) > 0 { |
||||||
|
cond = cond.Or(builder.In("team_repo.team_id", env.teamIDs)) |
||||||
|
} |
||||||
|
} |
||||||
|
if env.keyword != "" { |
||||||
|
cond = cond.And(builder.Like{"`repository`.lower_name", strings.ToLower(env.keyword)}) |
||||||
|
} |
||||||
|
return cond |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) CountRepos() (int64, error) { |
||||||
|
repoCount, err := db.GetEngine(env.ctx). |
||||||
|
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id"). |
||||||
|
Where(env.cond()). |
||||||
|
Distinct("`repository`.id"). |
||||||
|
Count(&Repository{}) |
||||||
|
if err != nil { |
||||||
|
return 0, fmt.Errorf("count user repositories in organization: %w", err) |
||||||
|
} |
||||||
|
return repoCount, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) { |
||||||
|
if page <= 0 { |
||||||
|
page = 1 |
||||||
|
} |
||||||
|
|
||||||
|
repoIDs := make([]int64, 0, pageSize) |
||||||
|
return repoIDs, db.GetEngine(env.ctx). |
||||||
|
Table("repository"). |
||||||
|
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id"). |
||||||
|
Where(env.cond()). |
||||||
|
GroupBy("`repository`.id,`repository`."+strings.Fields(string(env.orderBy))[0]). |
||||||
|
OrderBy(string(env.orderBy)). |
||||||
|
Limit(pageSize, (page-1)*pageSize). |
||||||
|
Cols("`repository`.id"). |
||||||
|
Find(&repoIDs) |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) Repos(page, pageSize int) (RepositoryList, error) { |
||||||
|
repoIDs, err := env.RepoIDs(page, pageSize) |
||||||
|
if err != nil { |
||||||
|
return nil, fmt.Errorf("GetUserRepositoryIDs: %w", err) |
||||||
|
} |
||||||
|
|
||||||
|
repos := make([]*Repository, 0, len(repoIDs)) |
||||||
|
if len(repoIDs) == 0 { |
||||||
|
return repos, nil |
||||||
|
} |
||||||
|
|
||||||
|
return repos, db.GetEngine(env.ctx). |
||||||
|
In("`repository`.id", repoIDs). |
||||||
|
OrderBy(string(env.orderBy)). |
||||||
|
Find(&repos) |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) { |
||||||
|
repoIDs := make([]int64, 0, 10) |
||||||
|
return repoIDs, db.GetEngine(env.ctx). |
||||||
|
Table("repository"). |
||||||
|
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true). |
||||||
|
Where(env.cond()). |
||||||
|
GroupBy("`repository`.id, `repository`.updated_unix"). |
||||||
|
OrderBy(string(env.orderBy)). |
||||||
|
Cols("`repository`.id"). |
||||||
|
Find(&repoIDs) |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) MirrorRepos() (RepositoryList, error) { |
||||||
|
repoIDs, err := env.MirrorRepoIDs() |
||||||
|
if err != nil { |
||||||
|
return nil, fmt.Errorf("MirrorRepoIDs: %w", err) |
||||||
|
} |
||||||
|
|
||||||
|
repos := make([]*Repository, 0, len(repoIDs)) |
||||||
|
if len(repoIDs) == 0 { |
||||||
|
return repos, nil |
||||||
|
} |
||||||
|
|
||||||
|
return repos, db.GetEngine(env.ctx). |
||||||
|
In("`repository`.id", repoIDs). |
||||||
|
Find(&repos) |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) AddKeyword(keyword string) { |
||||||
|
env.keyword = keyword |
||||||
|
} |
||||||
|
|
||||||
|
func (env *accessibleReposEnv) SetSort(orderBy db.SearchOrderBy) { |
||||||
|
env.orderBy = orderBy |
||||||
|
} |
Loading…
Reference in new issue