You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

home.go 15 kB

11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
4 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
3 years ago
3 years ago
3 years ago
3 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
10 years ago
3 years ago
10 years ago
10 years ago
3 years ago
3 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
10 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package routers
  6. import (
  7. "bytes"
  8. "net/http"
  9. "strings"
  10. "code.gitea.io/gitea/models"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/context"
  13. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  14. "code.gitea.io/gitea/modules/log"
  15. "code.gitea.io/gitea/modules/setting"
  16. "code.gitea.io/gitea/modules/structs"
  17. "code.gitea.io/gitea/modules/util"
  18. "code.gitea.io/gitea/routers/user"
  19. )
  20. const (
  21. // tplHome home page template
  22. tplHome base.TplName = "home"
  23. // tplExploreRepos explore repositories page template
  24. tplExploreRepos base.TplName = "explore/repos"
  25. // tplExploreDataset explore datasets page template
  26. tplExploreDataset base.TplName = "explore/datasets"
  27. // tplExploreUsers explore users page template
  28. tplExploreUsers base.TplName = "explore/users"
  29. // tplExploreOrganizations explore organizations page template
  30. tplExploreOrganizations base.TplName = "explore/organizations"
  31. // tplExploreCode explore code page template
  32. tplExploreCode base.TplName = "explore/code"
  33. tplExploreImages base.TplName = "explore/images"
  34. )
  35. // Home render home page
  36. func Home(ctx *context.Context) {
  37. ctx.Data["PageIsHome"] = true
  38. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  39. ctx.HTML(200, tplHome)
  40. }
  41. func Dashboard(ctx *context.Context) {
  42. if ctx.IsSigned {
  43. if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
  44. ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
  45. ctx.HTML(200, user.TplActivate)
  46. } else if !ctx.User.IsActive || ctx.User.ProhibitLogin {
  47. log.Info("Failed authentication attempt for %s from %s", ctx.User.Name, ctx.RemoteAddr())
  48. ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
  49. ctx.HTML(200, "user/auth/prohibit_login")
  50. } else if ctx.User.MustChangePassword {
  51. ctx.Data["Title"] = ctx.Tr("auth.must_change_password")
  52. ctx.Data["ChangePasscodeLink"] = setting.AppSubURL + "/user/change_password"
  53. ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(), 0, setting.AppSubURL)
  54. ctx.Redirect(setting.AppSubURL + "/user/settings/change_password")
  55. } else {
  56. user.Dashboard(ctx)
  57. }
  58. return
  59. // Check non-logged users landing page.
  60. } else if setting.LandingPageURL != setting.LandingPageHome {
  61. ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL))
  62. return
  63. }
  64. // Check auto-login.
  65. uname := ctx.GetCookie(setting.CookieUserName)
  66. if len(uname) != 0 {
  67. ctx.Redirect(setting.AppSubURL + "/user/login")
  68. return
  69. }
  70. ctx.Data["PageIsHome"] = true
  71. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  72. ctx.HTML(200, tplHome)
  73. }
  74. // RepoSearchOptions when calling search repositories
  75. type RepoSearchOptions struct {
  76. OwnerID int64
  77. Private bool
  78. Restricted bool
  79. PageSize int
  80. TplName base.TplName
  81. }
  82. var (
  83. nullByte = []byte{0x00}
  84. )
  85. func isKeywordValid(keyword string) bool {
  86. return !bytes.Contains([]byte(keyword), nullByte)
  87. }
  88. // RenderRepoSearch render repositories search page
  89. func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
  90. page := ctx.QueryInt("page")
  91. if page <= 0 {
  92. page = 1
  93. }
  94. var (
  95. repos []*models.Repository
  96. count int64
  97. err error
  98. orderBy models.SearchOrderBy
  99. )
  100. ctx.Data["SortType"] = ctx.Query("sort")
  101. switch ctx.Query("sort") {
  102. case "newest":
  103. orderBy = models.SearchOrderByNewest
  104. case "oldest":
  105. orderBy = models.SearchOrderByOldest
  106. case "recentupdate":
  107. orderBy = models.SearchOrderByRecentUpdated
  108. case "leastupdate":
  109. orderBy = models.SearchOrderByLeastUpdated
  110. case "reversealphabetically":
  111. orderBy = models.SearchOrderByAlphabeticallyReverse
  112. case "alphabetically":
  113. orderBy = models.SearchOrderByAlphabetically
  114. case "reversesize":
  115. orderBy = models.SearchOrderBySizeReverse
  116. case "size":
  117. orderBy = models.SearchOrderBySize
  118. case "moststars":
  119. orderBy = models.SearchOrderByStarsReverse
  120. case "feweststars":
  121. orderBy = models.SearchOrderByStars
  122. case "mostforks":
  123. orderBy = models.SearchOrderByForksReverse
  124. case "fewestforks":
  125. orderBy = models.SearchOrderByForks
  126. case "hot":
  127. orderBy = models.SearchOrderByHot
  128. case "active":
  129. orderBy = models.SearchOrderByActive
  130. default:
  131. ctx.Data["SortType"] = "hot"
  132. orderBy = models.SearchOrderByHot
  133. }
  134. orderBy = orderBy + ",id"
  135. //todo:support other topics
  136. keyword := strings.Trim(ctx.Query("q"), " ")
  137. topic := strings.Trim(ctx.Query("topic"), " ")
  138. repos, count, err = models.SearchRepository(&models.SearchRepoOptions{
  139. ListOptions: models.ListOptions{
  140. Page: page,
  141. PageSize: opts.PageSize,
  142. },
  143. Actor: ctx.User,
  144. OrderBy: orderBy,
  145. Private: opts.Private,
  146. Keyword: keyword,
  147. OwnerID: opts.OwnerID,
  148. AllPublic: true,
  149. AllLimited: true,
  150. TopicName: topic,
  151. IncludeDescription: setting.UI.SearchRepoDescription,
  152. })
  153. if err != nil {
  154. ctx.ServerError("SearchRepository", err)
  155. return
  156. }
  157. for _, repo := range repos {
  158. repo.Hot = int64(repo.NumWatches) + int64(repo.NumStars) + int64(repo.NumForks) + int64(repo.CloneCnt)
  159. repo.Active = int64(repo.NumIssues) + int64(repo.NumPulls) + int64(repo.NumCommit)
  160. }
  161. ctx.Data["Keyword"] = keyword
  162. ctx.Data["Topic"] = topic
  163. ctx.Data["Total"] = count
  164. ctx.Data["Repos"] = repos
  165. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  166. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  167. pager.SetDefaultParams(ctx)
  168. pager.AddParam(ctx, "topic", "TopicOnly")
  169. ctx.Data["Page"] = pager
  170. recommendOrgs, err := models.GetRecommendOrgInfos()
  171. if err != nil {
  172. log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  173. ctx.ServerError("GetRecommendOrgInfos", err)
  174. return
  175. }
  176. ctx.Data["RecommendOrgs"] = recommendOrgs
  177. ctx.HTML(http.StatusOK, opts.TplName)
  178. }
  179. // ExploreRepos render explore repositories page
  180. func ExploreRepos(ctx *context.Context) {
  181. ctx.Data["Title"] = ctx.Tr("explore")
  182. ctx.Data["PageIsExplore"] = true
  183. ctx.Data["PageIsExploreRepositories"] = true
  184. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  185. var ownerID int64
  186. if ctx.User != nil && !ctx.User.IsAdmin {
  187. ownerID = ctx.User.ID
  188. }
  189. RenderRepoSearch(ctx, &RepoSearchOptions{
  190. PageSize: setting.UI.ExplorePagingNum,
  191. OwnerID: ownerID,
  192. Private: ctx.User != nil,
  193. TplName: tplExploreRepos,
  194. })
  195. }
  196. func ExploreDatasets(ctx *context.Context) {
  197. ctx.Data["Title"] = ctx.Tr("explore")
  198. ctx.Data["PageIsExplore"] = true
  199. ctx.Data["PageIsExploreDatasets"] = true
  200. // ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  201. var (
  202. datasets []*models.Dataset
  203. count int64
  204. err error
  205. orderBy models.SearchOrderBy
  206. )
  207. page := ctx.QueryInt("page")
  208. if page <= 0 {
  209. page = 1
  210. }
  211. ctx.Data["SortType"] = ctx.Query("sort")
  212. switch ctx.Query("sort") {
  213. case "newest":
  214. orderBy = models.SearchOrderByNewest
  215. case "oldest":
  216. orderBy = models.SearchOrderByOldest
  217. case "recentupdate":
  218. orderBy = models.SearchOrderByRecentUpdated
  219. case "leastupdate":
  220. orderBy = models.SearchOrderByLeastUpdated
  221. case "reversealphabetically":
  222. orderBy = models.SearchOrderByAlphabeticallyReverse
  223. case "alphabetically":
  224. orderBy = models.SearchOrderByAlphabetically
  225. case "reversesize":
  226. orderBy = models.SearchOrderBySizeReverse
  227. case "downloadtimes":
  228. orderBy = models.SearchOrderByDownloadTimes
  229. default:
  230. ctx.Data["SortType"] = "recentupdate"
  231. orderBy = models.SearchOrderByRecentUpdated
  232. }
  233. keyword := strings.Trim(ctx.Query("q"), " ")
  234. var ownerID int64
  235. if ctx.User != nil && !ctx.User.IsAdmin {
  236. ownerID = ctx.User.ID
  237. }
  238. opts := &models.SearchDatasetOptions{
  239. Keyword: keyword,
  240. IncludePublic: true,
  241. SearchOrderBy: orderBy,
  242. OwnerID: ownerID,
  243. ListOptions: models.ListOptions{
  244. Page: page,
  245. PageSize: setting.UI.ExplorePagingNum,
  246. },
  247. }
  248. datasets, count, err = models.SearchDataset(opts)
  249. if err != nil {
  250. ctx.ServerError("SearchDatasets", err)
  251. return
  252. }
  253. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  254. ctx.Data["Keyword"] = opts.Keyword
  255. pager.SetDefaultParams(ctx)
  256. ctx.Data["Page"] = pager
  257. ctx.Data["Datasets"] = datasets
  258. ctx.Data["Total"] = count
  259. ctx.Data["PageIsDatasets"] = true
  260. ctx.HTML(200, tplExploreDataset)
  261. }
  262. // RenderUserSearch render user search page
  263. func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplName base.TplName) {
  264. opts.Page = ctx.QueryInt("page")
  265. if opts.Page <= 1 {
  266. opts.Page = 1
  267. }
  268. var (
  269. users []*models.User
  270. count int64
  271. err error
  272. orderBy models.SearchOrderBy
  273. )
  274. ctx.Data["SortType"] = ctx.Query("sort")
  275. switch ctx.Query("sort") {
  276. case "newest":
  277. orderBy = models.SearchOrderByIDReverse
  278. case "oldest":
  279. orderBy = models.SearchOrderByID
  280. case "recentupdate":
  281. orderBy = models.SearchOrderByRecentUpdated
  282. case "leastupdate":
  283. orderBy = models.SearchOrderByLeastUpdated
  284. case "reversealphabetically":
  285. orderBy = models.SearchOrderByAlphabeticallyReverse
  286. case "alphabetically":
  287. orderBy = models.SearchOrderByAlphabetically
  288. default:
  289. ctx.Data["SortType"] = "alphabetically"
  290. orderBy = models.SearchOrderByAlphabetically
  291. }
  292. opts.Keyword = strings.Trim(ctx.Query("q"), " ")
  293. opts.OrderBy = orderBy
  294. if len(opts.Keyword) == 0 || isKeywordValid(opts.Keyword) {
  295. users, count, err = models.SearchUsers(opts)
  296. if err != nil {
  297. ctx.ServerError("SearchUsers", err)
  298. return
  299. }
  300. }
  301. ctx.Data["Keyword"] = opts.Keyword
  302. ctx.Data["Total"] = count
  303. ctx.Data["Users"] = users
  304. ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail
  305. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  306. pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5)
  307. pager.SetDefaultParams(ctx)
  308. ctx.Data["Page"] = pager
  309. ctx.HTML(200, tplName)
  310. }
  311. // ExploreUsers render explore users page
  312. func ExploreUsers(ctx *context.Context) {
  313. ctx.Data["Title"] = ctx.Tr("explore")
  314. ctx.Data["PageIsExplore"] = true
  315. ctx.Data["PageIsExploreUsers"] = true
  316. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  317. RenderUserSearch(ctx, &models.SearchUserOptions{
  318. Actor: ctx.User,
  319. Type: models.UserTypeIndividual,
  320. ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
  321. IsActive: util.OptionalBoolTrue,
  322. Visible: []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate},
  323. }, tplExploreUsers)
  324. }
  325. // ExploreOrganizations render explore organizations page
  326. func ExploreOrganizations(ctx *context.Context) {
  327. ctx.Data["Title"] = ctx.Tr("explore")
  328. ctx.Data["PageIsExplore"] = true
  329. ctx.Data["PageIsExploreOrganizations"] = true
  330. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  331. visibleTypes := []structs.VisibleType{structs.VisibleTypePublic}
  332. if ctx.User != nil {
  333. visibleTypes = append(visibleTypes, structs.VisibleTypeLimited, structs.VisibleTypePrivate)
  334. }
  335. RenderUserSearch(ctx, &models.SearchUserOptions{
  336. Actor: ctx.User,
  337. Type: models.UserTypeOrganization,
  338. ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
  339. Visible: visibleTypes,
  340. }, tplExploreOrganizations)
  341. }
  342. // ExploreCode render explore code page
  343. func ExploreCode(ctx *context.Context) {
  344. if !setting.Indexer.RepoIndexerEnabled {
  345. ctx.Redirect(setting.AppSubURL+"/explore", 302)
  346. return
  347. }
  348. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  349. ctx.Data["Title"] = ctx.Tr("explore")
  350. ctx.Data["PageIsExplore"] = true
  351. ctx.Data["PageIsExploreCode"] = true
  352. language := strings.TrimSpace(ctx.Query("l"))
  353. keyword := strings.TrimSpace(ctx.Query("q"))
  354. page := ctx.QueryInt("page")
  355. if page <= 0 {
  356. page = 1
  357. }
  358. var (
  359. repoIDs []int64
  360. err error
  361. isAdmin bool
  362. userID int64
  363. )
  364. if ctx.User != nil {
  365. userID = ctx.User.ID
  366. isAdmin = ctx.User.IsAdmin
  367. }
  368. // guest user or non-admin user
  369. if ctx.User == nil || !isAdmin {
  370. repoIDs, err = models.FindUserAccessibleRepoIDs(ctx.User)
  371. if err != nil {
  372. ctx.ServerError("SearchResults", err)
  373. return
  374. }
  375. }
  376. var (
  377. total int
  378. searchResults []*code_indexer.Result
  379. searchResultLanguages []*code_indexer.SearchResultLanguages
  380. )
  381. // if non-admin login user, we need check UnitTypeCode at first
  382. if ctx.User != nil && len(repoIDs) > 0 {
  383. repoMaps, err := models.GetRepositoriesMapByIDs(repoIDs)
  384. if err != nil {
  385. ctx.ServerError("SearchResults", err)
  386. return
  387. }
  388. var rightRepoMap = make(map[int64]*models.Repository, len(repoMaps))
  389. repoIDs = make([]int64, 0, len(repoMaps))
  390. for id, repo := range repoMaps {
  391. if repo.CheckUnitUser(userID, isAdmin, models.UnitTypeCode) {
  392. rightRepoMap[id] = repo
  393. repoIDs = append(repoIDs, id)
  394. }
  395. }
  396. ctx.Data["RepoMaps"] = rightRepoMap
  397. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  398. if err != nil {
  399. ctx.ServerError("SearchResults", err)
  400. return
  401. }
  402. // if non-login user or isAdmin, no need to check UnitTypeCode
  403. } else if (ctx.User == nil && len(repoIDs) > 0) || isAdmin {
  404. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  405. if err != nil {
  406. ctx.ServerError("SearchResults", err)
  407. return
  408. }
  409. var loadRepoIDs = make([]int64, 0, len(searchResults))
  410. for _, result := range searchResults {
  411. var find bool
  412. for _, id := range loadRepoIDs {
  413. if id == result.RepoID {
  414. find = true
  415. break
  416. }
  417. }
  418. if !find {
  419. loadRepoIDs = append(loadRepoIDs, result.RepoID)
  420. }
  421. }
  422. repoMaps, err := models.GetRepositoriesMapByIDs(loadRepoIDs)
  423. if err != nil {
  424. ctx.ServerError("SearchResults", err)
  425. return
  426. }
  427. ctx.Data["RepoMaps"] = repoMaps
  428. }
  429. ctx.Data["Keyword"] = keyword
  430. ctx.Data["Language"] = language
  431. ctx.Data["SearchResults"] = searchResults
  432. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  433. ctx.Data["RequireHighlightJS"] = true
  434. ctx.Data["PageIsViewCode"] = true
  435. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  436. pager.SetDefaultParams(ctx)
  437. pager.AddParam(ctx, "l", "Language")
  438. ctx.Data["Page"] = pager
  439. ctx.HTML(200, tplExploreCode)
  440. }
  441. func ExploreImages(ctx *context.Context) {
  442. ctx.HTML(200, tplExploreImages)
  443. }
  444. // NotFound render 404 page
  445. func NotFound(ctx *context.Context) {
  446. ctx.Data["Title"] = "Page Not Found"
  447. ctx.NotFound("home.NotFound", nil)
  448. }