code.gitea.io/gitea@v1.21.7/routers/web/explore/repo.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package explore 5 6 import ( 7 "fmt" 8 "net/http" 9 10 "code.gitea.io/gitea/models/db" 11 repo_model "code.gitea.io/gitea/models/repo" 12 "code.gitea.io/gitea/modules/base" 13 "code.gitea.io/gitea/modules/context" 14 "code.gitea.io/gitea/modules/log" 15 "code.gitea.io/gitea/modules/setting" 16 "code.gitea.io/gitea/modules/sitemap" 17 ) 18 19 const ( 20 // tplExploreRepos explore repositories page template 21 tplExploreRepos base.TplName = "explore/repos" 22 relevantReposOnlyParam string = "only_show_relevant" 23 ) 24 25 // RepoSearchOptions when calling search repositories 26 type RepoSearchOptions struct { 27 OwnerID int64 28 Private bool 29 Restricted bool 30 PageSize int 31 OnlyShowRelevant bool 32 TplName base.TplName 33 } 34 35 // RenderRepoSearch render repositories search page 36 // This function is also used to render the Admin Repository Management page. 37 func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { 38 // Sitemap index for sitemap paths 39 page := int(ctx.ParamsInt64("idx")) 40 isSitemap := ctx.Params("idx") != "" 41 if page <= 1 { 42 page = ctx.FormInt("page") 43 } 44 45 if page <= 0 { 46 page = 1 47 } 48 49 if isSitemap { 50 opts.PageSize = setting.UI.SitemapPagingNum 51 } 52 53 var ( 54 repos []*repo_model.Repository 55 count int64 56 err error 57 orderBy db.SearchOrderBy 58 ) 59 60 ctx.Data["SortType"] = ctx.FormString("sort") 61 switch ctx.FormString("sort") { 62 case "newest": 63 orderBy = db.SearchOrderByNewest 64 case "oldest": 65 orderBy = db.SearchOrderByOldest 66 case "leastupdate": 67 orderBy = db.SearchOrderByLeastUpdated 68 case "reversealphabetically": 69 orderBy = db.SearchOrderByAlphabeticallyReverse 70 case "alphabetically": 71 orderBy = db.SearchOrderByAlphabetically 72 case "reversesize": 73 orderBy = db.SearchOrderBySizeReverse 74 case "size": 75 orderBy = db.SearchOrderBySize 76 case "reversegitsize": 77 orderBy = db.SearchOrderByGitSizeReverse 78 case "gitsize": 79 orderBy = db.SearchOrderByGitSize 80 case "reverselfssize": 81 orderBy = db.SearchOrderByLFSSizeReverse 82 case "lfssize": 83 orderBy = db.SearchOrderByLFSSize 84 case "moststars": 85 orderBy = db.SearchOrderByStarsReverse 86 case "feweststars": 87 orderBy = db.SearchOrderByStars 88 case "mostforks": 89 orderBy = db.SearchOrderByForksReverse 90 case "fewestforks": 91 orderBy = db.SearchOrderByForks 92 default: 93 ctx.Data["SortType"] = "recentupdate" 94 orderBy = db.SearchOrderByRecentUpdated 95 } 96 97 keyword := ctx.FormTrim("q") 98 99 ctx.Data["OnlyShowRelevant"] = opts.OnlyShowRelevant 100 101 topicOnly := ctx.FormBool("topic") 102 ctx.Data["TopicOnly"] = topicOnly 103 104 language := ctx.FormTrim("language") 105 ctx.Data["Language"] = language 106 107 repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{ 108 ListOptions: db.ListOptions{ 109 Page: page, 110 PageSize: opts.PageSize, 111 }, 112 Actor: ctx.Doer, 113 OrderBy: orderBy, 114 Private: opts.Private, 115 Keyword: keyword, 116 OwnerID: opts.OwnerID, 117 AllPublic: true, 118 AllLimited: true, 119 TopicOnly: topicOnly, 120 Language: language, 121 IncludeDescription: setting.UI.SearchRepoDescription, 122 OnlyShowRelevant: opts.OnlyShowRelevant, 123 }) 124 if err != nil { 125 ctx.ServerError("SearchRepository", err) 126 return 127 } 128 if isSitemap { 129 m := sitemap.NewSitemap() 130 for _, item := range repos { 131 m.Add(sitemap.URL{URL: item.HTMLURL(), LastMod: item.UpdatedUnix.AsTimePtr()}) 132 } 133 ctx.Resp.Header().Set("Content-Type", "text/xml") 134 if _, err := m.WriteTo(ctx.Resp); err != nil { 135 log.Error("Failed writing sitemap: %v", err) 136 } 137 return 138 } 139 140 ctx.Data["Keyword"] = keyword 141 ctx.Data["Total"] = count 142 ctx.Data["Repos"] = repos 143 ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled 144 145 pager := context.NewPagination(int(count), opts.PageSize, page, 5) 146 pager.SetDefaultParams(ctx) 147 pager.AddParam(ctx, "topic", "TopicOnly") 148 pager.AddParam(ctx, "language", "Language") 149 pager.AddParamString(relevantReposOnlyParam, fmt.Sprint(opts.OnlyShowRelevant)) 150 ctx.Data["Page"] = pager 151 152 ctx.HTML(http.StatusOK, opts.TplName) 153 } 154 155 // Repos render explore repositories page 156 func Repos(ctx *context.Context) { 157 ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage 158 ctx.Data["Title"] = ctx.Tr("explore") 159 ctx.Data["PageIsExplore"] = true 160 ctx.Data["PageIsExploreRepositories"] = true 161 ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled 162 163 var ownerID int64 164 if ctx.Doer != nil && !ctx.Doer.IsAdmin { 165 ownerID = ctx.Doer.ID 166 } 167 168 onlyShowRelevant := setting.UI.OnlyShowRelevantRepos 169 170 _ = ctx.Req.ParseForm() // parse the form first, to prepare the ctx.Req.Form field 171 if len(ctx.Req.Form[relevantReposOnlyParam]) != 0 { 172 onlyShowRelevant = ctx.FormBool(relevantReposOnlyParam) 173 } 174 175 RenderRepoSearch(ctx, &RepoSearchOptions{ 176 PageSize: setting.UI.ExplorePagingNum, 177 OwnerID: ownerID, 178 Private: ctx.Doer != nil, 179 TplName: tplExploreRepos, 180 OnlyShowRelevant: onlyShowRelevant, 181 }) 182 }