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 14 kB

11 years ago
11 years ago
11 years ago
10 years ago
11 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
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
10 years ago
10 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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. "strings"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/base"
  11. "code.gitea.io/gitea/modules/context"
  12. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  13. "code.gitea.io/gitea/modules/log"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/modules/structs"
  16. "code.gitea.io/gitea/modules/util"
  17. "code.gitea.io/gitea/routers/user"
  18. )
  19. const (
  20. // tplHome home page template
  21. tplHome base.TplName = "home"
  22. // tplExploreRepos explore repositories page template
  23. tplExploreRepos base.TplName = "explore/repos"
  24. // tplExploreDataset explore datasets page template
  25. tplExploreDataset base.TplName = "explore/datasets"
  26. // tplExploreUsers explore users page template
  27. tplExploreUsers base.TplName = "explore/users"
  28. // tplExploreOrganizations explore organizations page template
  29. tplExploreOrganizations base.TplName = "explore/organizations"
  30. // tplExploreCode explore code page template
  31. tplExploreCode base.TplName = "explore/code"
  32. )
  33. // Home render home page
  34. func Home(ctx *context.Context) {
  35. if ctx.IsSigned {
  36. if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
  37. ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
  38. ctx.HTML(200, user.TplActivate)
  39. } else if !ctx.User.IsActive || ctx.User.ProhibitLogin {
  40. log.Info("Failed authentication attempt for %s from %s", ctx.User.Name, ctx.RemoteAddr())
  41. ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
  42. ctx.HTML(200, "user/auth/prohibit_login")
  43. } else if ctx.User.MustChangePassword {
  44. ctx.Data["Title"] = ctx.Tr("auth.must_change_password")
  45. ctx.Data["ChangePasscodeLink"] = setting.AppSubURL + "/user/change_password"
  46. ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(), 0, setting.AppSubURL)
  47. ctx.Redirect(setting.AppSubURL + "/user/settings/change_password")
  48. } else {
  49. user.Dashboard(ctx)
  50. }
  51. return
  52. // Check non-logged users landing page.
  53. } else if setting.LandingPageURL != setting.LandingPageHome {
  54. ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL))
  55. return
  56. }
  57. // Check auto-login.
  58. uname := ctx.GetCookie(setting.CookieUserName)
  59. if len(uname) != 0 {
  60. ctx.Redirect(setting.AppSubURL + "/user/login")
  61. return
  62. }
  63. ctx.Data["PageIsHome"] = true
  64. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  65. ctx.HTML(200, tplHome)
  66. }
  67. // RepoSearchOptions when calling search repositories
  68. type RepoSearchOptions struct {
  69. OwnerID int64
  70. Private bool
  71. Restricted bool
  72. PageSize int
  73. TplName base.TplName
  74. }
  75. var (
  76. nullByte = []byte{0x00}
  77. )
  78. func isKeywordValid(keyword string) bool {
  79. return !bytes.Contains([]byte(keyword), nullByte)
  80. }
  81. // RenderRepoSearch render repositories search page
  82. func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
  83. page := ctx.QueryInt("page")
  84. if page <= 0 {
  85. page = 1
  86. }
  87. var (
  88. repos []*models.Repository
  89. count int64
  90. err error
  91. orderBy models.SearchOrderBy
  92. )
  93. ctx.Data["SortType"] = ctx.Query("sort")
  94. switch ctx.Query("sort") {
  95. case "newest":
  96. orderBy = models.SearchOrderByNewest
  97. case "oldest":
  98. orderBy = models.SearchOrderByOldest
  99. case "recentupdate":
  100. orderBy = models.SearchOrderByRecentUpdated
  101. case "leastupdate":
  102. orderBy = models.SearchOrderByLeastUpdated
  103. case "reversealphabetically":
  104. orderBy = models.SearchOrderByAlphabeticallyReverse
  105. case "alphabetically":
  106. orderBy = models.SearchOrderByAlphabetically
  107. case "reversesize":
  108. orderBy = models.SearchOrderBySizeReverse
  109. case "size":
  110. orderBy = models.SearchOrderBySize
  111. case "moststars":
  112. orderBy = models.SearchOrderByStarsReverse
  113. case "feweststars":
  114. orderBy = models.SearchOrderByStars
  115. case "mostforks":
  116. orderBy = models.SearchOrderByForksReverse
  117. case "fewestforks":
  118. orderBy = models.SearchOrderByForks
  119. default:
  120. ctx.Data["SortType"] = "recentupdate"
  121. orderBy = models.SearchOrderByRecentUpdated
  122. }
  123. keyword := strings.Trim(ctx.Query("q"), " ")
  124. topicOnly := ctx.QueryBool("topic")
  125. ctx.Data["TopicOnly"] = topicOnly
  126. repos, count, err = models.SearchRepository(&models.SearchRepoOptions{
  127. ListOptions: models.ListOptions{
  128. Page: page,
  129. PageSize: opts.PageSize,
  130. },
  131. Actor: ctx.User,
  132. OrderBy: orderBy,
  133. Private: opts.Private,
  134. Keyword: keyword,
  135. OwnerID: opts.OwnerID,
  136. AllPublic: true,
  137. AllLimited: true,
  138. TopicOnly: topicOnly,
  139. IncludeDescription: setting.UI.SearchRepoDescription,
  140. })
  141. if err != nil {
  142. ctx.ServerError("SearchRepository", err)
  143. return
  144. }
  145. ctx.Data["Keyword"] = keyword
  146. ctx.Data["Total"] = count
  147. ctx.Data["Repos"] = repos
  148. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  149. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  150. pager.SetDefaultParams(ctx)
  151. pager.AddParam(ctx, "topic", "TopicOnly")
  152. ctx.Data["Page"] = pager
  153. ctx.HTML(200, opts.TplName)
  154. }
  155. // ExploreRepos render explore repositories page
  156. func ExploreRepos(ctx *context.Context) {
  157. ctx.Data["Title"] = ctx.Tr("explore")
  158. ctx.Data["PageIsExplore"] = true
  159. ctx.Data["PageIsExploreRepositories"] = true
  160. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  161. var ownerID int64
  162. if ctx.User != nil && !ctx.User.IsAdmin {
  163. ownerID = ctx.User.ID
  164. }
  165. RenderRepoSearch(ctx, &RepoSearchOptions{
  166. PageSize: setting.UI.ExplorePagingNum,
  167. OwnerID: ownerID,
  168. Private: ctx.User != nil,
  169. TplName: tplExploreRepos,
  170. })
  171. }
  172. func ExploreDatasets(ctx *context.Context) {
  173. ctx.Data["Title"] = ctx.Tr("explore")
  174. ctx.Data["PageIsExplore"] = true
  175. ctx.Data["PageIsExploreDatasets"] = true
  176. // ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  177. var (
  178. datasets []*models.Dataset
  179. count int64
  180. err error
  181. orderBy models.SearchOrderBy
  182. )
  183. page := ctx.QueryInt("page")
  184. if page <= 0 {
  185. page = 1
  186. }
  187. ctx.Data["SortType"] = ctx.Query("sort")
  188. switch ctx.Query("sort") {
  189. case "newest":
  190. orderBy = models.SearchOrderByNewest
  191. case "oldest":
  192. orderBy = models.SearchOrderByOldest
  193. case "recentupdate":
  194. orderBy = models.SearchOrderByRecentUpdated
  195. case "leastupdate":
  196. orderBy = models.SearchOrderByLeastUpdated
  197. case "reversealphabetically":
  198. orderBy = models.SearchOrderByAlphabeticallyReverse
  199. case "alphabetically":
  200. orderBy = models.SearchOrderByAlphabetically
  201. case "reversesize":
  202. orderBy = models.SearchOrderBySizeReverse
  203. case "downloadtimes":
  204. orderBy = models.SearchOrderByDownloadTimes
  205. default:
  206. ctx.Data["SortType"] = "recentupdate"
  207. orderBy = models.SearchOrderByRecentUpdated
  208. }
  209. keyword := strings.Trim(ctx.Query("q"), " ")
  210. var ownerID int64
  211. if ctx.User != nil && !ctx.User.IsAdmin {
  212. ownerID = ctx.User.ID
  213. }
  214. opts := &models.SearchDatasetOptions{
  215. Keyword: keyword,
  216. IncludePublic: true,
  217. SearchOrderBy: orderBy,
  218. OwnerID: ownerID,
  219. ListOptions: models.ListOptions{
  220. Page: page,
  221. PageSize: setting.UI.ExplorePagingNum,
  222. },
  223. }
  224. datasets, count, err = models.SearchDataset(opts)
  225. if err != nil {
  226. ctx.ServerError("SearchDatasets", err)
  227. return
  228. }
  229. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  230. pager.SetDefaultParams(ctx)
  231. ctx.Data["Page"] = pager
  232. ctx.Data["Keyword"] = opts.Keyword
  233. ctx.Data["Datasets"] = datasets
  234. ctx.Data["Total"] = count
  235. ctx.Data["PageIsDatasets"] = true
  236. ctx.HTML(200, tplExploreDataset)
  237. }
  238. // RenderUserSearch render user search page
  239. func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplName base.TplName) {
  240. opts.Page = ctx.QueryInt("page")
  241. if opts.Page <= 1 {
  242. opts.Page = 1
  243. }
  244. var (
  245. users []*models.User
  246. count int64
  247. err error
  248. orderBy models.SearchOrderBy
  249. )
  250. ctx.Data["SortType"] = ctx.Query("sort")
  251. switch ctx.Query("sort") {
  252. case "newest":
  253. orderBy = models.SearchOrderByIDReverse
  254. case "oldest":
  255. orderBy = models.SearchOrderByID
  256. case "recentupdate":
  257. orderBy = models.SearchOrderByRecentUpdated
  258. case "leastupdate":
  259. orderBy = models.SearchOrderByLeastUpdated
  260. case "reversealphabetically":
  261. orderBy = models.SearchOrderByAlphabeticallyReverse
  262. case "alphabetically":
  263. orderBy = models.SearchOrderByAlphabetically
  264. default:
  265. ctx.Data["SortType"] = "alphabetically"
  266. orderBy = models.SearchOrderByAlphabetically
  267. }
  268. opts.Keyword = strings.Trim(ctx.Query("q"), " ")
  269. opts.OrderBy = orderBy
  270. if len(opts.Keyword) == 0 || isKeywordValid(opts.Keyword) {
  271. users, count, err = models.SearchUsers(opts)
  272. if err != nil {
  273. ctx.ServerError("SearchUsers", err)
  274. return
  275. }
  276. }
  277. ctx.Data["Keyword"] = opts.Keyword
  278. ctx.Data["Total"] = count
  279. ctx.Data["Users"] = users
  280. ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail
  281. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  282. pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5)
  283. pager.SetDefaultParams(ctx)
  284. ctx.Data["Page"] = pager
  285. ctx.HTML(200, tplName)
  286. }
  287. // ExploreUsers render explore users page
  288. func ExploreUsers(ctx *context.Context) {
  289. ctx.Data["Title"] = ctx.Tr("explore")
  290. ctx.Data["PageIsExplore"] = true
  291. ctx.Data["PageIsExploreUsers"] = true
  292. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  293. RenderUserSearch(ctx, &models.SearchUserOptions{
  294. Actor: ctx.User,
  295. Type: models.UserTypeIndividual,
  296. ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
  297. IsActive: util.OptionalBoolTrue,
  298. Visible: []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate},
  299. }, tplExploreUsers)
  300. }
  301. // ExploreOrganizations render explore organizations page
  302. func ExploreOrganizations(ctx *context.Context) {
  303. ctx.Data["Title"] = ctx.Tr("explore")
  304. ctx.Data["PageIsExplore"] = true
  305. ctx.Data["PageIsExploreOrganizations"] = true
  306. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  307. visibleTypes := []structs.VisibleType{structs.VisibleTypePublic}
  308. if ctx.User != nil {
  309. visibleTypes = append(visibleTypes, structs.VisibleTypeLimited, structs.VisibleTypePrivate)
  310. }
  311. RenderUserSearch(ctx, &models.SearchUserOptions{
  312. Actor: ctx.User,
  313. Type: models.UserTypeOrganization,
  314. ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
  315. Visible: visibleTypes,
  316. }, tplExploreOrganizations)
  317. }
  318. // ExploreCode render explore code page
  319. func ExploreCode(ctx *context.Context) {
  320. if !setting.Indexer.RepoIndexerEnabled {
  321. ctx.Redirect(setting.AppSubURL+"/explore", 302)
  322. return
  323. }
  324. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  325. ctx.Data["Title"] = ctx.Tr("explore")
  326. ctx.Data["PageIsExplore"] = true
  327. ctx.Data["PageIsExploreCode"] = true
  328. language := strings.TrimSpace(ctx.Query("l"))
  329. keyword := strings.TrimSpace(ctx.Query("q"))
  330. page := ctx.QueryInt("page")
  331. if page <= 0 {
  332. page = 1
  333. }
  334. var (
  335. repoIDs []int64
  336. err error
  337. isAdmin bool
  338. userID int64
  339. )
  340. if ctx.User != nil {
  341. userID = ctx.User.ID
  342. isAdmin = ctx.User.IsAdmin
  343. }
  344. // guest user or non-admin user
  345. if ctx.User == nil || !isAdmin {
  346. repoIDs, err = models.FindUserAccessibleRepoIDs(ctx.User)
  347. if err != nil {
  348. ctx.ServerError("SearchResults", err)
  349. return
  350. }
  351. }
  352. var (
  353. total int
  354. searchResults []*code_indexer.Result
  355. searchResultLanguages []*code_indexer.SearchResultLanguages
  356. )
  357. // if non-admin login user, we need check UnitTypeCode at first
  358. if ctx.User != nil && len(repoIDs) > 0 {
  359. repoMaps, err := models.GetRepositoriesMapByIDs(repoIDs)
  360. if err != nil {
  361. ctx.ServerError("SearchResults", err)
  362. return
  363. }
  364. var rightRepoMap = make(map[int64]*models.Repository, len(repoMaps))
  365. repoIDs = make([]int64, 0, len(repoMaps))
  366. for id, repo := range repoMaps {
  367. if repo.CheckUnitUser(userID, isAdmin, models.UnitTypeCode) {
  368. rightRepoMap[id] = repo
  369. repoIDs = append(repoIDs, id)
  370. }
  371. }
  372. ctx.Data["RepoMaps"] = rightRepoMap
  373. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  374. if err != nil {
  375. ctx.ServerError("SearchResults", err)
  376. return
  377. }
  378. // if non-login user or isAdmin, no need to check UnitTypeCode
  379. } else if (ctx.User == nil && len(repoIDs) > 0) || isAdmin {
  380. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  381. if err != nil {
  382. ctx.ServerError("SearchResults", err)
  383. return
  384. }
  385. var loadRepoIDs = make([]int64, 0, len(searchResults))
  386. for _, result := range searchResults {
  387. var find bool
  388. for _, id := range loadRepoIDs {
  389. if id == result.RepoID {
  390. find = true
  391. break
  392. }
  393. }
  394. if !find {
  395. loadRepoIDs = append(loadRepoIDs, result.RepoID)
  396. }
  397. }
  398. repoMaps, err := models.GetRepositoriesMapByIDs(loadRepoIDs)
  399. if err != nil {
  400. ctx.ServerError("SearchResults", err)
  401. return
  402. }
  403. ctx.Data["RepoMaps"] = repoMaps
  404. }
  405. ctx.Data["Keyword"] = keyword
  406. ctx.Data["Language"] = language
  407. ctx.Data["SearchResults"] = searchResults
  408. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  409. ctx.Data["RequireHighlightJS"] = true
  410. ctx.Data["PageIsViewCode"] = true
  411. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  412. pager.SetDefaultParams(ctx)
  413. pager.AddParam(ctx, "l", "Language")
  414. ctx.Data["Page"] = pager
  415. ctx.HTML(200, tplExploreCode)
  416. }
  417. // NotFound render 404 page
  418. func NotFound(ctx *context.Context) {
  419. ctx.Data["Title"] = "Page Not Found"
  420. ctx.NotFound("home.NotFound", nil)
  421. }