profile.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2015 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 user
  5. import (
  6. "strings"
  7. "github.com/unknwon/paginater"
  8. "gogs.io/gogs/internal/conf"
  9. "gogs.io/gogs/internal/context"
  10. "gogs.io/gogs/internal/database"
  11. "gogs.io/gogs/internal/route/repo"
  12. "gogs.io/gogs/internal/tool"
  13. )
  14. const (
  15. FOLLOWERS = "user/meta/followers"
  16. STARS = "user/meta/stars"
  17. )
  18. func Profile(c *context.Context, puser *context.ParamsUser) {
  19. // Show SSH keys.
  20. if strings.HasSuffix(c.Params(":username"), ".keys") {
  21. ShowSSHKeys(c, puser.ID)
  22. return
  23. }
  24. if puser.IsOrganization() {
  25. showOrgProfile(c)
  26. return
  27. }
  28. c.Title(puser.DisplayName())
  29. c.PageIs("UserProfile")
  30. c.Data["Owner"] = puser
  31. orgs, err := database.GetOrgsByUserID(puser.ID, c.IsLogged && (c.User.IsAdmin || c.User.ID == puser.ID))
  32. if err != nil {
  33. c.Error(err, "get organizations by user ID")
  34. return
  35. }
  36. c.Data["Orgs"] = orgs
  37. tab := c.Query("tab")
  38. c.Data["TabName"] = tab
  39. switch tab {
  40. case "activity":
  41. retrieveFeeds(c, puser.User, c.UserID(), true)
  42. if c.Written() {
  43. return
  44. }
  45. default:
  46. page := c.QueryInt("page")
  47. if page <= 0 {
  48. page = 1
  49. }
  50. showPrivate := c.IsLogged && (puser.ID == c.User.ID || c.User.IsAdmin)
  51. c.Data["Repos"], err = database.GetUserRepositories(&database.UserRepoOptions{
  52. UserID: puser.ID,
  53. Private: showPrivate,
  54. Page: page,
  55. PageSize: conf.UI.User.RepoPagingNum,
  56. })
  57. if err != nil {
  58. c.Error(err, "get user repositories")
  59. return
  60. }
  61. count := database.CountUserRepositories(puser.ID, showPrivate)
  62. c.Data["Page"] = paginater.New(int(count), conf.UI.User.RepoPagingNum, page, 5)
  63. }
  64. c.Success(tmplUserProfile)
  65. }
  66. func Followers(c *context.Context, puser *context.ParamsUser) {
  67. c.Title(puser.DisplayName())
  68. c.PageIs("Followers")
  69. c.Data["CardsTitle"] = c.Tr("user.followers")
  70. c.Data["Owner"] = puser
  71. repo.RenderUserCards(
  72. c,
  73. puser.NumFollowers,
  74. func(page int) ([]*database.User, error) {
  75. return database.Handle.Users().ListFollowers(c.Req.Context(), puser.ID, page, database.ItemsPerPage)
  76. },
  77. FOLLOWERS,
  78. )
  79. }
  80. func Following(c *context.Context, puser *context.ParamsUser) {
  81. c.Title(puser.DisplayName())
  82. c.PageIs("Following")
  83. c.Data["CardsTitle"] = c.Tr("user.following")
  84. c.Data["Owner"] = puser
  85. repo.RenderUserCards(
  86. c,
  87. puser.NumFollowing,
  88. func(page int) ([]*database.User, error) {
  89. return database.Handle.Users().ListFollowings(c.Req.Context(), puser.ID, page, database.ItemsPerPage)
  90. },
  91. FOLLOWERS,
  92. )
  93. }
  94. func Stars(_ *context.Context) {
  95. }
  96. func Action(c *context.Context, puser *context.ParamsUser) {
  97. var err error
  98. switch c.Params(":action") {
  99. case "follow":
  100. err = database.Handle.Users().Follow(c.Req.Context(), c.UserID(), puser.ID)
  101. case "unfollow":
  102. err = database.Handle.Users().Unfollow(c.Req.Context(), c.UserID(), puser.ID)
  103. }
  104. if err != nil {
  105. c.Errorf(err, "action %q", c.Params(":action"))
  106. return
  107. }
  108. redirectTo := c.Query("redirect_to")
  109. if !tool.IsSameSiteURLPath(redirectTo) {
  110. redirectTo = puser.HomeURLPath()
  111. }
  112. c.Redirect(redirectTo)
  113. }