Skip to content

Commit a1dc3c9

Browse files
GiteaBotChristopherHXwxiaoguang
authored
Fix remove org user failure on mssql (go-gitea#34449) (go-gitea#34453)
Backport go-gitea#34449 by @ChristopherHX * mssql does not support fetching 0 repositories * remove paging by NumRepos that might be 0 * extend admin api test to purge user 2 Fixes go-gitea#34448 Co-authored-by: ChristopherHX <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
1 parent 47ee84d commit a1dc3c9

File tree

5 files changed

+42
-57
lines changed

5 files changed

+42
-57
lines changed

models/activities/action.go

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

531531
if opts.RequestedTeam != nil {
532532
env := repo_model.AccessibleTeamReposEnv(organization.OrgFromUser(opts.RequestedUser), opts.RequestedTeam)
533-
teamRepoIDs, err := env.RepoIDs(ctx, 1, opts.RequestedUser.NumRepos)
533+
teamRepoIDs, err := env.RepoIDs(ctx)
534534
if err != nil {
535535
return nil, fmt.Errorf("GetTeamRepositories: %w", err)
536536
}

models/organization/org_test.go

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -334,33 +334,14 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
334334
testSuccess := func(userID int64, expectedRepoIDs []int64) {
335335
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
336336
assert.NoError(t, err)
337-
repoIDs, err := env.RepoIDs(db.DefaultContext, 1, 100)
337+
repoIDs, err := env.RepoIDs(db.DefaultContext)
338338
assert.NoError(t, err)
339339
assert.Equal(t, expectedRepoIDs, repoIDs)
340340
}
341341
testSuccess(2, []int64{3, 5, 32})
342342
testSuccess(4, []int64{3, 32})
343343
}
344344

345-
func TestAccessibleReposEnv_Repos(t *testing.T) {
346-
assert.NoError(t, unittest.PrepareTestDatabase())
347-
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
348-
testSuccess := func(userID int64, expectedRepoIDs []int64) {
349-
env, err := repo_model.AccessibleReposEnv(db.DefaultContext, org, userID)
350-
assert.NoError(t, err)
351-
repos, err := env.Repos(db.DefaultContext, 1, 100)
352-
assert.NoError(t, err)
353-
expectedRepos := make(repo_model.RepositoryList, len(expectedRepoIDs))
354-
for i, repoID := range expectedRepoIDs {
355-
expectedRepos[i] = unittest.AssertExistsAndLoadBean(t,
356-
&repo_model.Repository{ID: repoID})
357-
}
358-
assert.Equal(t, expectedRepos, repos)
359-
}
360-
testSuccess(2, []int64{3, 5, 32})
361-
testSuccess(4, []int64{3, 32})
362-
}
363-
364345
func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
365346
assert.NoError(t, unittest.PrepareTestDatabase())
366347
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})

models/repo/org_repo.go

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ func GetTeamRepositories(ctx context.Context, opts *SearchTeamRepoOptions) (Repo
4848
// accessible to a particular user
4949
type AccessibleReposEnvironment interface {
5050
CountRepos(ctx context.Context) (int64, error)
51-
RepoIDs(ctx context.Context, page, pageSize int) ([]int64, error)
52-
Repos(ctx context.Context, page, pageSize int) (RepositoryList, error)
51+
RepoIDs(ctx context.Context) ([]int64, error)
5352
MirrorRepos(ctx context.Context) (RepositoryList, error)
5453
AddKeyword(keyword string)
5554
SetSort(db.SearchOrderBy)
@@ -132,40 +131,18 @@ func (env *accessibleReposEnv) CountRepos(ctx context.Context) (int64, error) {
132131
return repoCount, nil
133132
}
134133

135-
func (env *accessibleReposEnv) RepoIDs(ctx context.Context, page, pageSize int) ([]int64, error) {
136-
if page <= 0 {
137-
page = 1
138-
}
139-
140-
repoIDs := make([]int64, 0, pageSize)
134+
func (env *accessibleReposEnv) RepoIDs(ctx context.Context) ([]int64, error) {
135+
var repoIDs []int64
141136
return repoIDs, db.GetEngine(ctx).
142137
Table("repository").
143138
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id").
144139
Where(env.cond()).
145-
GroupBy("`repository`.id,`repository`."+strings.Fields(string(env.orderBy))[0]).
140+
GroupBy("`repository`.id,`repository`." + strings.Fields(string(env.orderBy))[0]).
146141
OrderBy(string(env.orderBy)).
147-
Limit(pageSize, (page-1)*pageSize).
148142
Cols("`repository`.id").
149143
Find(&repoIDs)
150144
}
151145

152-
func (env *accessibleReposEnv) Repos(ctx context.Context, page, pageSize int) (RepositoryList, error) {
153-
repoIDs, err := env.RepoIDs(ctx, page, pageSize)
154-
if err != nil {
155-
return nil, fmt.Errorf("GetUserRepositoryIDs: %w", err)
156-
}
157-
158-
repos := make([]*Repository, 0, len(repoIDs))
159-
if len(repoIDs) == 0 {
160-
return repos, nil
161-
}
162-
163-
return repos, db.GetEngine(ctx).
164-
In("`repository`.id", repoIDs).
165-
OrderBy(string(env.orderBy)).
166-
Find(&repos)
167-
}
168-
169146
func (env *accessibleReposEnv) MirrorRepoIDs(ctx context.Context) ([]int64, error) {
170147
repoIDs := make([]int64, 0, 10)
171148
return repoIDs, db.GetEngine(ctx).

services/org/user.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,11 @@ func RemoveOrgUser(ctx context.Context, org *organization.Organization, user *us
6464
if err != nil {
6565
return fmt.Errorf("AccessibleReposEnv: %w", err)
6666
}
67-
repoIDs, err := env.RepoIDs(ctx, 1, org.NumRepos)
67+
repoIDs, err := env.RepoIDs(ctx)
6868
if err != nil {
6969
return fmt.Errorf("GetUserRepositories [%d]: %w", user.ID, err)
7070
}
71+
7172
for _, repoID := range repoIDs {
7273
repo, err := repo_model.GetRepositoryByID(ctx, repoID)
7374
if err != nil {

tests/integration/admin_user_test.go

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package integration
55

66
import (
7+
"fmt"
78
"net/http"
89
"strconv"
910
"testing"
@@ -72,12 +73,37 @@ func TestAdminDeleteUser(t *testing.T) {
7273

7374
session := loginUser(t, "user1")
7475

75-
csrf := GetUserCSRFToken(t, session)
76-
req := NewRequestWithValues(t, "POST", "/-/admin/users/8/delete", map[string]string{
77-
"_csrf": csrf,
78-
})
79-
session.MakeRequest(t, req, http.StatusSeeOther)
80-
81-
assertUserDeleted(t, 8)
82-
unittest.CheckConsistencyFor(t, &user_model.User{})
76+
usersToDelete := []struct {
77+
userID int64
78+
purge bool
79+
}{
80+
{
81+
userID: 2,
82+
purge: true,
83+
},
84+
{
85+
userID: 8,
86+
},
87+
}
88+
89+
for _, entry := range usersToDelete {
90+
t.Run(fmt.Sprintf("DeleteUser%d", entry.userID), func(t *testing.T) {
91+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: entry.userID})
92+
assert.NotNil(t, user)
93+
94+
var query string
95+
if entry.purge {
96+
query = "?purge=true"
97+
}
98+
99+
csrf := GetUserCSRFToken(t, session)
100+
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/-/admin/users/%d/delete%s", entry.userID, query), map[string]string{
101+
"_csrf": csrf,
102+
})
103+
session.MakeRequest(t, req, http.StatusSeeOther)
104+
105+
assertUserDeleted(t, entry.userID)
106+
unittest.CheckConsistencyFor(t, &user_model.User{})
107+
})
108+
}
83109
}

0 commit comments

Comments
 (0)