From 23aba523b551d20ee2bbc694ae630989bcdeaccd Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Tue, 14 Feb 2017 15:28:22 +0800 Subject: [PATCH] feat: support search bar on star tab of user profile. (#917) * feat: support search bar on star tab of user profile. * fix: update testing. * fix: Using loadAttributes * fix: remove empty line. * remove LOWER Signed-off-by: Bo-Yi Wu --- models/repo.go | 30 ++++++-- models/star.go | 4 +- models/star_test.go | 4 +- routers/user/profile.go | 121 +++++++++++++++++-------------- templates/base/paginate.tmpl | 10 +-- templates/explore/repo_list.tmpl | 2 +- templates/explore/search.tmpl | 13 ++-- templates/user/profile.tmpl | 1 + 8 files changed, 109 insertions(+), 76 deletions(-) diff --git a/models/repo.go b/models/repo.go index 7a6eaea21..d83c5fd6a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1778,13 +1778,15 @@ type SearchRepoOptions struct { Searcher *User //ID of the person who's seeking OrderBy string Private bool // Include private repositories in results + Starred bool Page int PageSize int // Can be smaller than or equal to setting.ExplorePagingNum } // SearchRepositoryByName takes keyword and part of repository name to search, // it returns results in given range and number of total results. -func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int64, _ error) { +func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) { + var sess *xorm.Session if len(opts.Keyword) == 0 { return repos, 0, nil } @@ -1796,9 +1798,17 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int repos = make([]*Repository, 0, opts.PageSize) + if opts.Starred && opts.OwnerID > 0 { + sess = x. + Join("INNER", "star", "star.repo_id = repository.id"). + Where("star.uid = ?", opts.OwnerID). + And("lower_name LIKE ?", "%"+opts.Keyword+"%") + } else { + sess = x.Where("lower_name LIKE ?", "%"+opts.Keyword+"%") + } + // Append conditions - sess := x.Where("LOWER(lower_name) LIKE ?", "%"+opts.Keyword+"%") - if opts.OwnerID > 0 { + if !opts.Starred && opts.OwnerID > 0 { sess.And("owner_id = ?", opts.OwnerID) } if !opts.Private { @@ -1831,10 +1841,20 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int return nil, 0, fmt.Errorf("Count: %v", err) } - return repos, count, sess. + if err = sess. Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). OrderBy(opts.OrderBy). - Find(&repos) + Find(&repos); err != nil { + return nil, 0, fmt.Errorf("Repo: %v", err) + } + + if opts.Starred { + if err = repos.loadAttributes(x); err != nil { + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) + } + } + + return repos, count, nil } // DeleteRepositoryArchives deletes all repositories' archives. diff --git a/models/star.go b/models/star.go index 39f6eac1f..7525c8a6f 100644 --- a/models/star.go +++ b/models/star.go @@ -73,12 +73,12 @@ func (repo *Repository) GetStargazers(page int) ([]*User, error) { // GetStarredRepos returns the repos the user starred. func (u *User) GetStarredRepos(private bool, page, pageSize int, orderBy string) (repos []*Repository, err error) { if len(orderBy) == 0 { - orderBy = "star.id" + orderBy = "updated_unix DESC" } sess := x. Join("INNER", "star", "star.repo_id = repository.id"). Where("star.uid = ?", u.ID). - Desc(orderBy) + OrderBy(orderBy) if !private { sess = sess.And("is_private = ?", false) diff --git a/models/star_test.go b/models/star_test.go index d6a83199b..714f5df5c 100644 --- a/models/star_test.go +++ b/models/star_test.go @@ -61,8 +61,8 @@ func TestUser_GetStarredRepos(t *testing.T) { starred, err = user.GetStarredRepos(true, 1, 10, "") assert.NoError(t, err) assert.Len(t, starred, 2) - assert.Equal(t, int64(4), starred[0].ID) - assert.Equal(t, int64(2), starred[1].ID) + assert.Equal(t, int64(2), starred[0].ID) + assert.Equal(t, int64(4), starred[1].ID) } func TestUser_GetStarredRepos2(t *testing.T) { diff --git a/routers/user/profile.go b/routers/user/profile.go index f0b1be306..bb1ab64e0 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -90,6 +90,44 @@ func Profile(ctx *context.Context) { tab := ctx.Query("tab") ctx.Data["TabName"] = tab + + page := ctx.QueryInt("page") + if page <= 0 { + page = 1 + } + + var ( + repos []*models.Repository + count int64 + orderBy string + ) + + ctx.Data["SortType"] = ctx.Query("sort") + switch ctx.Query("sort") { + case "newest": + orderBy = "created_unix DESC" + case "oldest": + orderBy = "created_unix ASC" + case "recentupdate": + orderBy = "updated_unix DESC" + case "leastupdate": + orderBy = "updated_unix ASC" + case "reversealphabetically": + orderBy = "name DESC" + case "alphabetically": + orderBy = "name ASC" + default: + ctx.Data["SortType"] = "recentupdate" + orderBy = "updated_unix DESC" + } + + // set default sort value if sort is empty. + if ctx.Query("sort") == "" { + ctx.Data["SortType"] = "recentupdate" + } + + keyword := strings.Trim(ctx.Query("q"), " ") + ctx.Data["Keyword"] = keyword switch tab { case "activity": retrieveFeeds(ctx, ctxUser, -1, 0, !showPrivate) @@ -97,66 +135,39 @@ func Profile(ctx *context.Context) { return } case "stars": - page := ctx.QueryInt("page") - if page <= 0 { - page = 1 - } - - repos, err := ctxUser.GetStarredRepos(showPrivate, page, setting.UI.User.RepoPagingNum, "") - if err != nil { - ctx.Handle(500, "GetStarredRepos", err) - return - } + ctx.Data["PageIsProfileStarList"] = true + if len(keyword) == 0 { + repos, err = ctxUser.GetStarredRepos(showPrivate, page, setting.UI.User.RepoPagingNum, orderBy) + if err != nil { + ctx.Handle(500, "GetStarredRepos", err) + return + } - counts, err := ctxUser.GetStarredRepoCount(showPrivate) - if err != nil { - ctx.Handle(500, "GetStarredRepoCount", err) - return + count, err = ctxUser.GetStarredRepoCount(showPrivate) + if err != nil { + ctx.Handle(500, "GetStarredRepoCount", err) + return + } + } else { + repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ + Keyword: keyword, + OwnerID: ctxUser.ID, + OrderBy: orderBy, + Private: showPrivate, + Page: page, + PageSize: setting.UI.User.RepoPagingNum, + Starred: true, + }) + if err != nil { + ctx.Handle(500, "SearchRepositoryByName", err) + return + } } ctx.Data["Repos"] = repos - ctx.Data["Page"] = paginater.New(int(counts), setting.UI.User.RepoPagingNum, page, 5) - ctx.Data["Total"] = int(counts) - ctx.Data["Tabs"] = "stars" + ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5) + ctx.Data["Total"] = count default: - page := ctx.QueryInt("page") - if page <= 0 { - page = 1 - } - - var ( - repos []*models.Repository - count int64 - err error - orderBy string - ) - - ctx.Data["SortType"] = ctx.Query("sort") - switch ctx.Query("sort") { - case "newest": - orderBy = "created_unix DESC" - case "oldest": - orderBy = "created_unix ASC" - case "recentupdate": - orderBy = "updated_unix DESC" - case "leastupdate": - orderBy = "updated_unix ASC" - case "reversealphabetically": - orderBy = "name DESC" - case "alphabetically": - orderBy = "name ASC" - default: - ctx.Data["SortType"] = "recentupdate" - orderBy = "updated_unix DESC" - } - - // set default sort value if sort is empty. - if ctx.Query("sort") == "" { - ctx.Data["SortType"] = "recentupdate" - } - - keyword := strings.Trim(ctx.Query("q"), " ") - ctx.Data["Keyword"] = keyword if len(keyword) == 0 { var total int repos, err = models.GetUserRepositories(ctxUser.ID, showPrivate, page, setting.UI.User.RepoPagingNum, orderBy) diff --git a/templates/base/paginate.tmpl b/templates/base/paginate.tmpl index 427a4b095..0291c0128 100644 --- a/templates/base/paginate.tmpl +++ b/templates/base/paginate.tmpl @@ -2,21 +2,21 @@ {{if gt .TotalPages 1}} {{end}} diff --git a/templates/explore/repo_list.tmpl b/templates/explore/repo_list.tmpl index 961e510c0..76ed6491f 100644 --- a/templates/explore/repo_list.tmpl +++ b/templates/explore/repo_list.tmpl @@ -2,7 +2,7 @@ {{range .Repos}}
+
diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index e1a8ca1ea..08627616b 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -92,6 +92,7 @@ {{else if eq .TabName "stars"}}
+ {{template "explore/search" .}} {{template "explore/repo_list" .}} {{template "base/paginate" .}}