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

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
8 years ago
11 years ago
8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package routers
  5. import (
  6. "fmt"
  7. "github.com/Unknwon/paginater"
  8. "bytes"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/base"
  11. "code.gitea.io/gitea/modules/context"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/routers/user"
  14. )
  15. const (
  16. // tplHome home page template
  17. tplHome base.TplName = "home"
  18. // tplExploreRepos explore repositories page template
  19. tplExploreRepos base.TplName = "explore/repos"
  20. // tplExploreUsers explore users page template
  21. tplExploreUsers base.TplName = "explore/users"
  22. // tplExploreOrganizations explore organizations page template
  23. tplExploreOrganizations base.TplName = "explore/organizations"
  24. )
  25. // Home render home page
  26. func Home(ctx *context.Context) {
  27. if ctx.IsSigned {
  28. if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
  29. ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
  30. ctx.HTML(200, user.TplActivate)
  31. } else {
  32. user.Dashboard(ctx)
  33. }
  34. return
  35. }
  36. // Check auto-login.
  37. uname := ctx.GetCookie(setting.CookieUserName)
  38. if len(uname) != 0 {
  39. ctx.Redirect(setting.AppSubURL + "/user/login")
  40. return
  41. }
  42. ctx.Data["PageIsHome"] = true
  43. ctx.HTML(200, tplHome)
  44. }
  45. // RepoSearchOptions when calling search repositories
  46. type RepoSearchOptions struct {
  47. Counter func(bool) int64
  48. Ranger func(int, int) ([]*models.Repository, error)
  49. Private bool
  50. PageSize int
  51. OrderBy string
  52. TplName base.TplName
  53. }
  54. var (
  55. nullByte = []byte{0x00}
  56. )
  57. func isKeywordValid(keyword string) bool {
  58. return !bytes.Contains([]byte(keyword), nullByte)
  59. }
  60. // RenderRepoSearch render repositories search page
  61. func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
  62. page := ctx.QueryInt("page")
  63. if page <= 0 {
  64. page = 1
  65. }
  66. var (
  67. repos []*models.Repository
  68. count int64
  69. err error
  70. )
  71. keyword := ctx.Query("q")
  72. if len(keyword) == 0 {
  73. repos, err = opts.Ranger(page, opts.PageSize)
  74. if err != nil {
  75. ctx.Handle(500, "opts.Ranger", err)
  76. return
  77. }
  78. count = opts.Counter(opts.Private)
  79. } else {
  80. if isKeywordValid(keyword) {
  81. repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
  82. Keyword: keyword,
  83. OrderBy: opts.OrderBy,
  84. Private: opts.Private,
  85. Page: page,
  86. PageSize: opts.PageSize,
  87. })
  88. if err != nil {
  89. ctx.Handle(500, "SearchRepositoryByName", err)
  90. return
  91. }
  92. }
  93. }
  94. ctx.Data["Keyword"] = keyword
  95. ctx.Data["Total"] = count
  96. ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5)
  97. for _, repo := range repos {
  98. if err = repo.GetOwner(); err != nil {
  99. ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err))
  100. return
  101. }
  102. }
  103. ctx.Data["Repos"] = repos
  104. ctx.HTML(200, opts.TplName)
  105. }
  106. // ExploreRepos render explore repositories page
  107. func ExploreRepos(ctx *context.Context) {
  108. ctx.Data["Title"] = ctx.Tr("explore")
  109. ctx.Data["PageIsExplore"] = true
  110. ctx.Data["PageIsExploreRepositories"] = true
  111. RenderRepoSearch(ctx, &RepoSearchOptions{
  112. Counter: models.CountRepositories,
  113. Ranger: models.GetRecentUpdatedRepositories,
  114. PageSize: setting.UI.ExplorePagingNum,
  115. OrderBy: "updated_unix DESC",
  116. TplName: tplExploreRepos,
  117. })
  118. }
  119. // UserSearchOptions options when render search user page
  120. type UserSearchOptions struct {
  121. Type models.UserType
  122. Counter func() int64
  123. Ranger func(int, int) ([]*models.User, error)
  124. PageSize int
  125. OrderBy string
  126. TplName base.TplName
  127. }
  128. // RenderUserSearch render user search page
  129. func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) {
  130. page := ctx.QueryInt("page")
  131. if page <= 1 {
  132. page = 1
  133. }
  134. var (
  135. users []*models.User
  136. count int64
  137. err error
  138. )
  139. keyword := ctx.Query("q")
  140. if len(keyword) == 0 {
  141. users, err = opts.Ranger(page, opts.PageSize)
  142. if err != nil {
  143. ctx.Handle(500, "opts.Ranger", err)
  144. return
  145. }
  146. count = opts.Counter()
  147. } else {
  148. if isKeywordValid(keyword) {
  149. users, count, err = models.SearchUserByName(&models.SearchUserOptions{
  150. Keyword: keyword,
  151. Type: opts.Type,
  152. OrderBy: opts.OrderBy,
  153. Page: page,
  154. PageSize: opts.PageSize,
  155. })
  156. if err != nil {
  157. ctx.Handle(500, "SearchUserByName", err)
  158. return
  159. }
  160. }
  161. }
  162. ctx.Data["Keyword"] = keyword
  163. ctx.Data["Total"] = count
  164. ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5)
  165. ctx.Data["Users"] = users
  166. ctx.HTML(200, opts.TplName)
  167. }
  168. // ExploreUsers render explore users page
  169. func ExploreUsers(ctx *context.Context) {
  170. ctx.Data["Title"] = ctx.Tr("explore")
  171. ctx.Data["PageIsExplore"] = true
  172. ctx.Data["PageIsExploreUsers"] = true
  173. RenderUserSearch(ctx, &UserSearchOptions{
  174. Type: models.UserTypeIndividual,
  175. Counter: models.CountUsers,
  176. Ranger: models.Users,
  177. PageSize: setting.UI.ExplorePagingNum,
  178. OrderBy: "name ASC",
  179. TplName: tplExploreUsers,
  180. })
  181. }
  182. // ExploreOrganizations render explore organizations page
  183. func ExploreOrganizations(ctx *context.Context) {
  184. ctx.Data["Title"] = ctx.Tr("explore")
  185. ctx.Data["PageIsExplore"] = true
  186. ctx.Data["PageIsExploreOrganizations"] = true
  187. RenderUserSearch(ctx, &UserSearchOptions{
  188. Type: models.UserTypeOrganization,
  189. Counter: models.CountOrganizations,
  190. Ranger: models.Organizations,
  191. PageSize: setting.UI.ExplorePagingNum,
  192. OrderBy: "name ASC",
  193. TplName: tplExploreOrganizations,
  194. })
  195. }
  196. // NotFound render 404 page
  197. func NotFound(ctx *context.Context) {
  198. ctx.Data["Title"] = "Page Not Found"
  199. ctx.Handle(404, "home.NotFound", nil)
  200. }