From ff03b2f6064e436a03586fa9e2c73bf0d70ba0cc Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 25 Apr 2019 02:20:22 +0800 Subject: [PATCH] Fix: Sort repos on org home page with non-admin login (#6741) --- integrations/org_test.go | 43 ++++++++++++++++++++++++++++++++++++++++ models/org.go | 14 ++++++++++--- routers/user/home.go | 1 + 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 integrations/org_test.go diff --git a/integrations/org_test.go b/integrations/org_test.go new file mode 100644 index 000000000..b17d229d6 --- /dev/null +++ b/integrations/org_test.go @@ -0,0 +1,43 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestOrgRepos(t *testing.T) { + prepareTestEnv(t) + + var ( + users = []string{"user1", "user2"} + cases = map[string][]string{ + "alphabetically": {"repo21", "repo3", "repo5"}, + "reversealphabetically": {"repo5", "repo3", "repo21"}, + } + ) + + for _, user := range users { + t.Run(user, func(t *testing.T) { + session := loginUser(t, user) + for sortBy, repos := range cases { + req := NewRequest(t, "GET", "/user3?sort="+sortBy) + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + + sel := htmlDoc.doc.Find("a.name") + assert.EqualValues(t, len(repos), len(sel.Nodes)) + for i := 0; i < len(repos); i++ { + assert.EqualValues(t, repos[i], strings.TrimSpace(sel.Eq(i).Text())) + } + } + }) + } +} diff --git a/models/org.go b/models/org.go index 5235dad7a..149d6f7aa 100644 --- a/models/org.go +++ b/models/org.go @@ -657,6 +657,7 @@ type AccessibleReposEnvironment interface { Repos(page, pageSize int) ([]*Repository, error) MirrorRepos() ([]*Repository, error) AddKeyword(keyword string) + SetSort(SearchOrderBy) } type accessibleReposEnv struct { @@ -665,6 +666,7 @@ type accessibleReposEnv struct { teamIDs []int64 e Engine keyword string + orderBy SearchOrderBy } // AccessibleReposEnv an AccessibleReposEnvironment for the repositories in `org` @@ -683,6 +685,7 @@ func (org *User) accessibleReposEnv(e Engine, userID int64) (AccessibleReposEnvi userID: userID, teamIDs: teamIDs, e: e, + orderBy: SearchOrderByRecentUpdated, }, nil } @@ -722,8 +725,8 @@ func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) { Table("repository"). Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id"). Where(env.cond()). - GroupBy("`repository`.id,`repository`.updated_unix"). - OrderBy("updated_unix DESC"). + GroupBy("`repository`.id,`repository`."+strings.Fields(string(env.orderBy))[0]). + OrderBy(string(env.orderBy)). Limit(pageSize, (page-1)*pageSize). Cols("`repository`.id"). Find(&repoIDs) @@ -742,6 +745,7 @@ func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*Repository, error) return repos, env.e. In("`repository`.id", repoIDs). + OrderBy(string(env.orderBy)). Find(&repos) } @@ -752,7 +756,7 @@ func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) { 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("updated_unix DESC"). + OrderBy(string(env.orderBy)). Cols("`repository`.id"). Find(&repoIDs) } @@ -776,3 +780,7 @@ func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) { func (env *accessibleReposEnv) AddKeyword(keyword string) { env.keyword = keyword } + +func (env *accessibleReposEnv) SetSort(orderBy SearchOrderBy) { + env.orderBy = orderBy +} diff --git a/routers/user/home.go b/routers/user/home.go index 2293461f0..b53a47db9 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -505,6 +505,7 @@ func showOrgProfile(ctx *context.Context) { ctx.ServerError("AccessibleReposEnv", err) return } + env.SetSort(orderBy) if len(keyword) != 0 { env.AddKeyword(keyword) }