forked from NYANDEV/forgejo
fix: Wrong repo list on Explore page if user already loggin. (#1009)
* fix: Wrong repo list on Explore page if user already loggin. * fix: code readable. * fix: declare variable
This commit is contained in:
parent
d6748284bd
commit
83b6d03231
4 changed files with 128 additions and 12 deletions
|
@ -132,3 +132,39 @@
|
||||||
num_pulls: 0
|
num_pulls: 0
|
||||||
num_closed_pulls: 0
|
num_closed_pulls: 0
|
||||||
is_mirror: false
|
is_mirror: false
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 12
|
||||||
|
owner_id: 14
|
||||||
|
lower_name: test_repo_12
|
||||||
|
name: test_repo_12
|
||||||
|
is_private: false
|
||||||
|
num_issues: 0
|
||||||
|
num_closed_issues: 0
|
||||||
|
num_pulls: 0
|
||||||
|
num_closed_pulls: 0
|
||||||
|
is_mirror: false
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 13
|
||||||
|
owner_id: 14
|
||||||
|
lower_name: test_repo_13
|
||||||
|
name: test_repo_13
|
||||||
|
is_private: true
|
||||||
|
num_issues: 0
|
||||||
|
num_closed_issues: 0
|
||||||
|
num_pulls: 0
|
||||||
|
num_closed_pulls: 0
|
||||||
|
is_mirror: false
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 14
|
||||||
|
owner_id: 14
|
||||||
|
lower_name: test_repo_14
|
||||||
|
name: test_repo_14
|
||||||
|
is_private: false
|
||||||
|
num_issues: 0
|
||||||
|
num_closed_issues: 0
|
||||||
|
num_pulls: 0
|
||||||
|
num_closed_pulls: 0
|
||||||
|
is_mirror: false
|
||||||
|
|
|
@ -194,3 +194,18 @@
|
||||||
avatar_email: user13@example.com
|
avatar_email: user13@example.com
|
||||||
num_repos: 1
|
num_repos: 1
|
||||||
is_active: true
|
is_active: true
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 14
|
||||||
|
lower_name: user14
|
||||||
|
name: user14
|
||||||
|
full_name: User 14
|
||||||
|
email: user14@example.com
|
||||||
|
passwd: password
|
||||||
|
type: 0 # individual
|
||||||
|
salt: salt
|
||||||
|
is_admin: false
|
||||||
|
avatar: avatar14
|
||||||
|
avatar_email: user13@example.com
|
||||||
|
num_repos: 3
|
||||||
|
is_active: true
|
||||||
|
|
|
@ -30,6 +30,7 @@ import (
|
||||||
|
|
||||||
"github.com/Unknwon/cae/zip"
|
"github.com/Unknwon/cae/zip"
|
||||||
"github.com/Unknwon/com"
|
"github.com/Unknwon/com"
|
||||||
|
"github.com/go-xorm/builder"
|
||||||
"github.com/go-xorm/xorm"
|
"github.com/go-xorm/xorm"
|
||||||
version "github.com/mcuadros/go-version"
|
version "github.com/mcuadros/go-version"
|
||||||
ini "gopkg.in/ini.v1"
|
ini "gopkg.in/ini.v1"
|
||||||
|
@ -1797,7 +1798,11 @@ type SearchRepoOptions struct {
|
||||||
// SearchRepositoryByName takes keyword and part of repository name to search,
|
// SearchRepositoryByName takes keyword and part of repository name to search,
|
||||||
// it returns results in given range and number of total results.
|
// it returns results in given range and number of total results.
|
||||||
func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) {
|
func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) {
|
||||||
var sess *xorm.Session
|
var (
|
||||||
|
sess *xorm.Session
|
||||||
|
cond builder.Cond = builder.NewCond()
|
||||||
|
)
|
||||||
|
|
||||||
if len(opts.Keyword) == 0 {
|
if len(opts.Keyword) == 0 {
|
||||||
return repos, 0, nil
|
return repos, 0, nil
|
||||||
}
|
}
|
||||||
|
@ -1810,26 +1815,24 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ in
|
||||||
repos = make([]*Repository, 0, opts.PageSize)
|
repos = make([]*Repository, 0, opts.PageSize)
|
||||||
|
|
||||||
if opts.Starred && opts.OwnerID > 0 {
|
if opts.Starred && opts.OwnerID > 0 {
|
||||||
sess = x.
|
cond = builder.Eq{
|
||||||
Join("INNER", "star", "star.repo_id = repository.id").
|
"star.uid": opts.OwnerID,
|
||||||
Where("star.uid = ?", opts.OwnerID).
|
|
||||||
And("lower_name LIKE ?", "%"+opts.Keyword+"%")
|
|
||||||
} else {
|
|
||||||
sess = x.Where("lower_name LIKE ?", "%"+opts.Keyword+"%")
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
cond = cond.And(builder.Like{"lower_name", opts.Keyword})
|
||||||
|
|
||||||
// Append conditions
|
// Append conditions
|
||||||
if !opts.Starred && opts.OwnerID > 0 {
|
if !opts.Starred && opts.OwnerID > 0 {
|
||||||
sess.And("owner_id = ?", opts.OwnerID)
|
cond = cond.And(builder.Eq{"owner_id": opts.OwnerID})
|
||||||
}
|
}
|
||||||
if !opts.Private {
|
if !opts.Private {
|
||||||
sess.And("is_private=?", false)
|
cond = cond.And(builder.Eq{"is_private": false})
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.Searcher != nil {
|
if opts.Searcher != nil {
|
||||||
|
var ownerIds []int64
|
||||||
|
|
||||||
sess.Or("owner_id = ?", opts.Searcher.ID)
|
ownerIds = append(ownerIds, opts.Searcher.ID)
|
||||||
|
|
||||||
err := opts.Searcher.GetOrganizations(true)
|
err := opts.Searcher.GetOrganizations(true)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1837,14 +1840,24 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ in
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, org := range opts.Searcher.Orgs {
|
for _, org := range opts.Searcher.Orgs {
|
||||||
sess.Or("owner_id = ?", org.ID)
|
ownerIds = append(ownerIds, org.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond = cond.Or(builder.And(builder.Like{"lower_name", opts.Keyword}, builder.In("owner_id", ownerIds)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(opts.OrderBy) == 0 {
|
if len(opts.OrderBy) == 0 {
|
||||||
opts.OrderBy = "name ASC"
|
opts.OrderBy = "name ASC"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Starred && opts.OwnerID > 0 {
|
||||||
|
sess = x.
|
||||||
|
Join("INNER", "star", "star.repo_id = repository.id").
|
||||||
|
Where(cond)
|
||||||
|
} else {
|
||||||
|
sess = x.Where(cond)
|
||||||
|
}
|
||||||
|
|
||||||
var countSess xorm.Session
|
var countSess xorm.Session
|
||||||
countSess = *sess
|
countSess = *sess
|
||||||
count, err := countSess.Count(new(Repository))
|
count, err := countSess.Count(new(Repository))
|
||||||
|
|
|
@ -125,3 +125,55 @@ func TestForkRepository(t *testing.T) {
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
assert.True(t, IsErrRepoAlreadyExist(err))
|
assert.True(t, IsErrRepoAlreadyExist(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSearchRepositoryByName(t *testing.T) {
|
||||||
|
assert.NoError(t, PrepareTestDatabase())
|
||||||
|
|
||||||
|
// test search public repository on explore page
|
||||||
|
repos, count, err := SearchRepositoryByName(&SearchRepoOptions{
|
||||||
|
Keyword: "repo_12",
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 10,
|
||||||
|
Searcher: nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NotNil(t, repos)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "test_repo_12", repos[0].Name)
|
||||||
|
assert.Equal(t, int64(1), count)
|
||||||
|
|
||||||
|
repos, count, err = SearchRepositoryByName(&SearchRepoOptions{
|
||||||
|
Keyword: "test_repo",
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 10,
|
||||||
|
Searcher: nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NotNil(t, repos)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, int64(2), count)
|
||||||
|
|
||||||
|
// test search private repository on explore page
|
||||||
|
repos, count, err = SearchRepositoryByName(&SearchRepoOptions{
|
||||||
|
Keyword: "repo_13",
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 10,
|
||||||
|
Searcher: &User{ID: 14},
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NotNil(t, repos)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "test_repo_13", repos[0].Name)
|
||||||
|
assert.Equal(t, int64(1), count)
|
||||||
|
|
||||||
|
repos, count, err = SearchRepositoryByName(&SearchRepoOptions{
|
||||||
|
Keyword: "test_repo",
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 10,
|
||||||
|
Searcher: &User{ID: 14},
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NotNil(t, repos)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, int64(3), count)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue