profile.go 2.9 KB

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