Skip to content

Commit e4c4629

Browse files
authored
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.
1 parent b945742 commit e4c4629

30 files changed

+383
-389
lines changed

models/activities/action.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ func ActivityQueryCondition(ctx context.Context, opts GetFeedsOptions) (builder.
511511
}
512512

513513
if opts.RequestedTeam != nil {
514-
env := organization.OrgFromUser(opts.RequestedUser).AccessibleTeamReposEnv(ctx, opts.RequestedTeam)
514+
env := repo_model.AccessibleTeamReposEnv(ctx, organization.OrgFromUser(opts.RequestedUser), opts.RequestedTeam)
515515
teamRepoIDs, err := env.RepoIDs(1, opts.RequestedUser.NumRepos)
516516
if err != nil {
517517
return nil, fmt.Errorf("GetTeamRepositories: %w", err)

models/error.go

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -72,48 +72,6 @@ func (err ErrDeleteLastAdminUser) Error() string {
7272
return fmt.Sprintf("can not delete the last admin user [uid: %d]", err.UID)
7373
}
7474

75-
// ErrNoPendingRepoTransfer is an error type for repositories without a pending
76-
// transfer request
77-
type ErrNoPendingRepoTransfer struct {
78-
RepoID int64
79-
}
80-
81-
func (err ErrNoPendingRepoTransfer) Error() string {
82-
return fmt.Sprintf("repository doesn't have a pending transfer [repo_id: %d]", err.RepoID)
83-
}
84-
85-
// IsErrNoPendingTransfer is an error type when a repository has no pending
86-
// transfers
87-
func IsErrNoPendingTransfer(err error) bool {
88-
_, ok := err.(ErrNoPendingRepoTransfer)
89-
return ok
90-
}
91-
92-
func (err ErrNoPendingRepoTransfer) Unwrap() error {
93-
return util.ErrNotExist
94-
}
95-
96-
// ErrRepoTransferInProgress represents the state of a repository that has an
97-
// ongoing transfer
98-
type ErrRepoTransferInProgress struct {
99-
Uname string
100-
Name string
101-
}
102-
103-
// IsErrRepoTransferInProgress checks if an error is a ErrRepoTransferInProgress.
104-
func IsErrRepoTransferInProgress(err error) bool {
105-
_, ok := err.(ErrRepoTransferInProgress)
106-
return ok
107-
}
108-
109-
func (err ErrRepoTransferInProgress) Error() string {
110-
return fmt.Sprintf("repository is already being transferred [uname: %s, name: %s]", err.Uname, err.Name)
111-
}
112-
113-
func (err ErrRepoTransferInProgress) Unwrap() error {
114-
return util.ErrAlreadyExist
115-
}
116-
11775
// ErrInvalidCloneAddr represents a "InvalidCloneAddr" kind of error.
11876
type ErrInvalidCloneAddr struct {
11977
Host string

models/organization/org.go

Lines changed: 5 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ import (
99
"fmt"
1010
"strings"
1111

12-
actions_model "code.gitea.io/gitea/models/actions"
1312
"code.gitea.io/gitea/models/db"
1413
"code.gitea.io/gitea/models/perm"
15-
repo_model "code.gitea.io/gitea/models/repo"
16-
secret_model "code.gitea.io/gitea/models/secret"
1714
"code.gitea.io/gitea/models/unit"
1815
user_model "code.gitea.io/gitea/models/user"
1916
"code.gitea.io/gitea/modules/log"
@@ -407,33 +404,6 @@ func GetOrgByName(ctx context.Context, name string) (*Organization, error) {
407404
return u, nil
408405
}
409406

410-
// DeleteOrganization deletes models associated to an organization.
411-
func DeleteOrganization(ctx context.Context, org *Organization) error {
412-
if org.Type != user_model.UserTypeOrganization {
413-
return fmt.Errorf("%s is a user not an organization", org.Name)
414-
}
415-
416-
if err := db.DeleteBeans(ctx,
417-
&Team{OrgID: org.ID},
418-
&OrgUser{OrgID: org.ID},
419-
&TeamUser{OrgID: org.ID},
420-
&TeamUnit{OrgID: org.ID},
421-
&TeamInvite{OrgID: org.ID},
422-
&secret_model.Secret{OwnerID: org.ID},
423-
&user_model.Blocking{BlockerID: org.ID},
424-
&actions_model.ActionRunner{OwnerID: org.ID},
425-
&actions_model.ActionRunnerToken{OwnerID: org.ID},
426-
); err != nil {
427-
return fmt.Errorf("DeleteBeans: %w", err)
428-
}
429-
430-
if _, err := db.GetEngine(ctx).ID(org.ID).Delete(new(user_model.User)); err != nil {
431-
return fmt.Errorf("Delete: %w", err)
432-
}
433-
434-
return nil
435-
}
436-
437407
// GetOrgUserMaxAuthorizeLevel returns highest authorize level of user in an organization
438408
func (org *Organization) GetOrgUserMaxAuthorizeLevel(ctx context.Context, uid int64) (perm.AccessMode, error) {
439409
var authorize perm.AccessMode
@@ -604,7 +574,9 @@ func RemoveOrgRepo(ctx context.Context, orgID, repoID int64) error {
604574
return err
605575
}
606576

607-
func (org *Organization) getUserTeams(ctx context.Context, userID int64, cols ...string) ([]*Team, error) {
577+
// GetUserTeams returns all teams that belong to user,
578+
// and that the user has joined.
579+
func (org *Organization) GetUserTeams(ctx context.Context, userID int64, cols ...string) ([]*Team, error) {
608580
teams := make([]*Team, 0, org.NumTeams)
609581
return teams, db.GetEngine(ctx).
610582
Where("`team_user`.org_id = ?", org.ID).
@@ -616,7 +588,8 @@ func (org *Organization) getUserTeams(ctx context.Context, userID int64, cols ..
616588
Find(&teams)
617589
}
618590

619-
func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) {
591+
// GetUserTeamIDs returns of all team IDs of the organization that user is member of.
592+
func (org *Organization) GetUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) {
620593
teamIDs := make([]int64, 0, org.NumTeams)
621594
return teamIDs, db.GetEngine(ctx).
622595
Table("team").
@@ -640,175 +613,3 @@ func getUserTeamIDsQueryBuilder(orgID, userID int64) *builder.Builder {
640613
func (org *Organization) TeamsWithAccessToRepo(ctx context.Context, repoID int64, mode perm.AccessMode) ([]*Team, error) {
641614
return GetTeamsWithAccessToRepo(ctx, org.ID, repoID, mode)
642615
}
643-
644-
// GetUserTeamIDs returns of all team IDs of the organization that user is member of.
645-
func (org *Organization) GetUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) {
646-
return org.getUserTeamIDs(ctx, userID)
647-
}
648-
649-
// GetUserTeams returns all teams that belong to user,
650-
// and that the user has joined.
651-
func (org *Organization) GetUserTeams(ctx context.Context, userID int64) ([]*Team, error) {
652-
return org.getUserTeams(ctx, userID)
653-
}
654-
655-
// AccessibleReposEnvironment operations involving the repositories that are
656-
// accessible to a particular user
657-
type AccessibleReposEnvironment interface {
658-
CountRepos() (int64, error)
659-
RepoIDs(page, pageSize int) ([]int64, error)
660-
Repos(page, pageSize int) (repo_model.RepositoryList, error)
661-
MirrorRepos() (repo_model.RepositoryList, error)
662-
AddKeyword(keyword string)
663-
SetSort(db.SearchOrderBy)
664-
}
665-
666-
type accessibleReposEnv struct {
667-
org *Organization
668-
user *user_model.User
669-
team *Team
670-
teamIDs []int64
671-
ctx context.Context
672-
keyword string
673-
orderBy db.SearchOrderBy
674-
}
675-
676-
// AccessibleReposEnv builds an AccessibleReposEnvironment for the repositories in `org`
677-
// that are accessible to the specified user.
678-
func AccessibleReposEnv(ctx context.Context, org *Organization, userID int64) (AccessibleReposEnvironment, error) {
679-
var user *user_model.User
680-
681-
if userID > 0 {
682-
u, err := user_model.GetUserByID(ctx, userID)
683-
if err != nil {
684-
return nil, err
685-
}
686-
user = u
687-
}
688-
689-
teamIDs, err := org.getUserTeamIDs(ctx, userID)
690-
if err != nil {
691-
return nil, err
692-
}
693-
return &accessibleReposEnv{
694-
org: org,
695-
user: user,
696-
teamIDs: teamIDs,
697-
ctx: ctx,
698-
orderBy: db.SearchOrderByRecentUpdated,
699-
}, nil
700-
}
701-
702-
// AccessibleTeamReposEnv an AccessibleReposEnvironment for the repositories in `org`
703-
// that are accessible to the specified team.
704-
func (org *Organization) AccessibleTeamReposEnv(ctx context.Context, team *Team) AccessibleReposEnvironment {
705-
return &accessibleReposEnv{
706-
org: org,
707-
team: team,
708-
ctx: ctx,
709-
orderBy: db.SearchOrderByRecentUpdated,
710-
}
711-
}
712-
713-
func (env *accessibleReposEnv) cond() builder.Cond {
714-
cond := builder.NewCond()
715-
if env.team != nil {
716-
cond = cond.And(builder.Eq{"team_repo.team_id": env.team.ID})
717-
} else {
718-
if env.user == nil || !env.user.IsRestricted {
719-
cond = cond.Or(builder.Eq{
720-
"`repository`.owner_id": env.org.ID,
721-
"`repository`.is_private": false,
722-
})
723-
}
724-
if len(env.teamIDs) > 0 {
725-
cond = cond.Or(builder.In("team_repo.team_id", env.teamIDs))
726-
}
727-
}
728-
if env.keyword != "" {
729-
cond = cond.And(builder.Like{"`repository`.lower_name", strings.ToLower(env.keyword)})
730-
}
731-
return cond
732-
}
733-
734-
func (env *accessibleReposEnv) CountRepos() (int64, error) {
735-
repoCount, err := db.GetEngine(env.ctx).
736-
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id").
737-
Where(env.cond()).
738-
Distinct("`repository`.id").
739-
Count(&repo_model.Repository{})
740-
if err != nil {
741-
return 0, fmt.Errorf("count user repositories in organization: %w", err)
742-
}
743-
return repoCount, nil
744-
}
745-
746-
func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) {
747-
if page <= 0 {
748-
page = 1
749-
}
750-
751-
repoIDs := make([]int64, 0, pageSize)
752-
return repoIDs, db.GetEngine(env.ctx).
753-
Table("repository").
754-
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id").
755-
Where(env.cond()).
756-
GroupBy("`repository`.id,`repository`."+strings.Fields(string(env.orderBy))[0]).
757-
OrderBy(string(env.orderBy)).
758-
Limit(pageSize, (page-1)*pageSize).
759-
Cols("`repository`.id").
760-
Find(&repoIDs)
761-
}
762-
763-
func (env *accessibleReposEnv) Repos(page, pageSize int) (repo_model.RepositoryList, error) {
764-
repoIDs, err := env.RepoIDs(page, pageSize)
765-
if err != nil {
766-
return nil, fmt.Errorf("GetUserRepositoryIDs: %w", err)
767-
}
768-
769-
repos := make([]*repo_model.Repository, 0, len(repoIDs))
770-
if len(repoIDs) == 0 {
771-
return repos, nil
772-
}
773-
774-
return repos, db.GetEngine(env.ctx).
775-
In("`repository`.id", repoIDs).
776-
OrderBy(string(env.orderBy)).
777-
Find(&repos)
778-
}
779-
780-
func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) {
781-
repoIDs := make([]int64, 0, 10)
782-
return repoIDs, db.GetEngine(env.ctx).
783-
Table("repository").
784-
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true).
785-
Where(env.cond()).
786-
GroupBy("`repository`.id, `repository`.updated_unix").
787-
OrderBy(string(env.orderBy)).
788-
Cols("`repository`.id").
789-
Find(&repoIDs)
790-
}
791-
792-
func (env *accessibleReposEnv) MirrorRepos() (repo_model.RepositoryList, error) {
793-
repoIDs, err := env.MirrorRepoIDs()
794-
if err != nil {
795-
return nil, fmt.Errorf("MirrorRepoIDs: %w", err)
796-
}
797-
798-
repos := make([]*repo_model.Repository, 0, len(repoIDs))
799-
if len(repoIDs) == 0 {
800-
return repos, nil
801-
}
802-
803-
return repos, db.GetEngine(env.ctx).
804-
In("`repository`.id", repoIDs).
805-
Find(&repos)
806-
}
807-
808-
func (env *accessibleReposEnv) AddKeyword(keyword string) {
809-
env.keyword = keyword
810-
}
811-
812-
func (env *accessibleReposEnv) SetSort(orderBy db.SearchOrderBy) {
813-
env.orderBy = orderBy
814-
}

models/organization/org_repo.go

Lines changed: 0 additions & 17 deletions
This file was deleted.

models/organization/org_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) {
318318
assert.NoError(t, unittest.PrepareTestDatabase())
319319
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
320320
testSuccess := func(userID, expectedCount int64) {
321-
env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID)
321+
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
322322
assert.NoError(t, err)
323323
count, err := env.CountRepos()
324324
assert.NoError(t, err)
@@ -332,7 +332,7 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
332332
assert.NoError(t, unittest.PrepareTestDatabase())
333333
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
334334
testSuccess := func(userID int64, expectedRepoIDs []int64) {
335-
env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID)
335+
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
336336
assert.NoError(t, err)
337337
repoIDs, err := env.RepoIDs(1, 100)
338338
assert.NoError(t, err)
@@ -346,7 +346,7 @@ func TestAccessibleReposEnv_Repos(t *testing.T) {
346346
assert.NoError(t, unittest.PrepareTestDatabase())
347347
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
348348
testSuccess := func(userID int64, expectedRepoIDs []int64) {
349-
env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID)
349+
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
350350
assert.NoError(t, err)
351351
repos, err := env.Repos(1, 100)
352352
assert.NoError(t, err)
@@ -365,7 +365,7 @@ func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
365365
assert.NoError(t, unittest.PrepareTestDatabase())
366366
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
367367
testSuccess := func(userID int64, expectedRepoIDs []int64) {
368-
env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID)
368+
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
369369
assert.NoError(t, err)
370370
repos, err := env.MirrorRepos()
371371
assert.NoError(t, err)

models/organization/team.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
"code.gitea.io/gitea/models/db"
1313
"code.gitea.io/gitea/models/perm"
14-
repo_model "code.gitea.io/gitea/models/repo"
1514
"code.gitea.io/gitea/models/unit"
1615
user_model "code.gitea.io/gitea/models/user"
1716
"code.gitea.io/gitea/modules/log"
@@ -78,9 +77,8 @@ type Team struct {
7877
LowerName string
7978
Name string
8079
Description string
81-
AccessMode perm.AccessMode `xorm:"'authorize'"`
82-
Repos []*repo_model.Repository `xorm:"-"`
83-
Members []*user_model.User `xorm:"-"`
80+
AccessMode perm.AccessMode `xorm:"'authorize'"`
81+
Members []*user_model.User `xorm:"-"`
8482
NumRepos int
8583
NumMembers int
8684
Units []*TeamUnit `xorm:"-"`
@@ -155,17 +153,6 @@ func (t *Team) IsMember(ctx context.Context, userID int64) bool {
155153
return isMember
156154
}
157155

158-
// LoadRepositories returns paginated repositories in team of organization.
159-
func (t *Team) LoadRepositories(ctx context.Context) (err error) {
160-
if t.Repos != nil {
161-
return nil
162-
}
163-
t.Repos, err = GetTeamRepositories(ctx, &SearchTeamRepoOptions{
164-
TeamID: t.ID,
165-
})
166-
return err
167-
}
168-
169156
// LoadMembers returns paginated members in team of organization.
170157
func (t *Team) LoadMembers(ctx context.Context) (err error) {
171158
t.Members, err = GetTeamMembers(ctx, &SearchMembersOptions{

0 commit comments

Comments
 (0)