You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repo.go 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright 2017 The Gitea 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. "net/http"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/convert"
  10. api "code.gitea.io/gitea/modules/structs"
  11. "code.gitea.io/gitea/routers/api/v1/utils"
  12. )
  13. // listUserRepos - List the repositories owned by the given user.
  14. func listUserRepos(ctx *context.APIContext, u *models.User, private bool) {
  15. opts := utils.GetListOptions(ctx)
  16. repos, count, err := models.GetUserRepositories(&models.SearchRepoOptions{
  17. Actor: u,
  18. Private: private,
  19. ListOptions: opts,
  20. OrderBy: "id ASC",
  21. })
  22. if err != nil {
  23. ctx.Error(http.StatusInternalServerError, "GetUserRepositories", err)
  24. return
  25. }
  26. apiRepos := make([]*api.Repository, 0, len(repos))
  27. for i := range repos {
  28. access, err := models.AccessLevel(ctx.User, repos[i])
  29. if err != nil {
  30. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  31. return
  32. }
  33. if ctx.IsSigned && ctx.User.IsAdmin || access >= models.AccessModeRead {
  34. apiRepos = append(apiRepos, convert.ToRepo(repos[i], access))
  35. }
  36. }
  37. ctx.SetLinkHeader(int(count), opts.PageSize)
  38. ctx.SetTotalCountHeader(count)
  39. ctx.JSON(http.StatusOK, &apiRepos)
  40. }
  41. // ListUserRepos - list the repos owned by the given user.
  42. func ListUserRepos(ctx *context.APIContext) {
  43. // swagger:operation GET /users/{username}/repos user userListRepos
  44. // ---
  45. // summary: List the repos owned by the given user
  46. // produces:
  47. // - application/json
  48. // parameters:
  49. // - name: username
  50. // in: path
  51. // description: username of user
  52. // type: string
  53. // required: true
  54. // - name: page
  55. // in: query
  56. // description: page number of results to return (1-based)
  57. // type: integer
  58. // - name: limit
  59. // in: query
  60. // description: page size of results
  61. // type: integer
  62. // responses:
  63. // "200":
  64. // "$ref": "#/responses/RepositoryList"
  65. user := GetUserByParams(ctx)
  66. if ctx.Written() {
  67. return
  68. }
  69. private := ctx.IsSigned
  70. listUserRepos(ctx, user, private)
  71. }
  72. // ListMyRepos - list the repositories you own or have access to.
  73. func ListMyRepos(ctx *context.APIContext) {
  74. // swagger:operation GET /user/repos user userCurrentListRepos
  75. // ---
  76. // summary: List the repos that the authenticated user owns
  77. // produces:
  78. // - application/json
  79. // parameters:
  80. // - name: page
  81. // in: query
  82. // description: page number of results to return (1-based)
  83. // type: integer
  84. // - name: limit
  85. // in: query
  86. // description: page size of results
  87. // type: integer
  88. // responses:
  89. // "200":
  90. // "$ref": "#/responses/RepositoryList"
  91. opts := &models.SearchRepoOptions{
  92. ListOptions: utils.GetListOptions(ctx),
  93. Actor: ctx.User,
  94. OwnerID: ctx.User.ID,
  95. Private: ctx.IsSigned,
  96. IncludeDescription: true,
  97. }
  98. var err error
  99. repos, count, err := models.SearchRepository(opts)
  100. if err != nil {
  101. ctx.Error(http.StatusInternalServerError, "SearchRepository", err)
  102. return
  103. }
  104. results := make([]*api.Repository, len(repos))
  105. for i, repo := range repos {
  106. if err = repo.GetOwner(); err != nil {
  107. ctx.Error(http.StatusInternalServerError, "GetOwner", err)
  108. return
  109. }
  110. accessMode, err := models.AccessLevel(ctx.User, repo)
  111. if err != nil {
  112. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  113. }
  114. results[i] = convert.ToRepo(repo, accessMode)
  115. }
  116. ctx.SetLinkHeader(int(count), opts.ListOptions.PageSize)
  117. ctx.SetTotalCountHeader(count)
  118. ctx.JSON(http.StatusOK, &results)
  119. }
  120. // ListOrgRepos - list the repositories of an organization.
  121. func ListOrgRepos(ctx *context.APIContext) {
  122. // swagger:operation GET /orgs/{org}/repos organization orgListRepos
  123. // ---
  124. // summary: List an organization's repos
  125. // produces:
  126. // - application/json
  127. // parameters:
  128. // - name: org
  129. // in: path
  130. // description: name of the organization
  131. // type: string
  132. // required: true
  133. // - name: page
  134. // in: query
  135. // description: page number of results to return (1-based)
  136. // type: integer
  137. // - name: limit
  138. // in: query
  139. // description: page size of results
  140. // type: integer
  141. // responses:
  142. // "200":
  143. // "$ref": "#/responses/RepositoryList"
  144. listUserRepos(ctx, ctx.Org.Organization, ctx.IsSigned)
  145. }