profile.go 3.1 KB

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