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.

266 lines
6.6 KiB

API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
4 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
4 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
4 years ago
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2018 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package repo
  6. import (
  7. "fmt"
  8. "net/http"
  9. "strconv"
  10. "strings"
  11. "code.gitea.io/gitea/models"
  12. "code.gitea.io/gitea/modules/context"
  13. api "code.gitea.io/gitea/modules/structs"
  14. "code.gitea.io/gitea/routers/api/v1/utils"
  15. )
  16. // ListLabels list all the labels of a repository
  17. func ListLabels(ctx *context.APIContext) {
  18. // swagger:operation GET /repos/{owner}/{repo}/labels issue issueListLabels
  19. // ---
  20. // summary: Get all of a repository's labels
  21. // produces:
  22. // - application/json
  23. // parameters:
  24. // - name: owner
  25. // in: path
  26. // description: owner of the repo
  27. // type: string
  28. // required: true
  29. // - name: repo
  30. // in: path
  31. // description: name of the repo
  32. // type: string
  33. // required: true
  34. // - name: page
  35. // in: query
  36. // description: page number of results to return (1-based)
  37. // type: integer
  38. // - name: limit
  39. // in: query
  40. // description: page size of results, maximum page size is 50
  41. // type: integer
  42. // responses:
  43. // "200":
  44. // "$ref": "#/responses/LabelList"
  45. labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID, ctx.Query("sort"), utils.GetListOptions(ctx))
  46. if err != nil {
  47. ctx.Error(http.StatusInternalServerError, "GetLabelsByRepoID", err)
  48. return
  49. }
  50. apiLabels := make([]*api.Label, len(labels))
  51. for i := range labels {
  52. apiLabels[i] = labels[i].APIFormat()
  53. }
  54. ctx.JSON(http.StatusOK, &apiLabels)
  55. }
  56. // GetLabel get label by repository and label id
  57. func GetLabel(ctx *context.APIContext) {
  58. // swagger:operation GET /repos/{owner}/{repo}/labels/{id} issue issueGetLabel
  59. // ---
  60. // summary: Get a single label
  61. // produces:
  62. // - application/json
  63. // parameters:
  64. // - name: owner
  65. // in: path
  66. // description: owner of the repo
  67. // type: string
  68. // required: true
  69. // - name: repo
  70. // in: path
  71. // description: name of the repo
  72. // type: string
  73. // required: true
  74. // - name: id
  75. // in: path
  76. // description: id of the label to get
  77. // type: integer
  78. // format: int64
  79. // required: true
  80. // responses:
  81. // "200":
  82. // "$ref": "#/responses/Label"
  83. var (
  84. label *models.Label
  85. err error
  86. )
  87. strID := ctx.Params(":id")
  88. if intID, err2 := strconv.ParseInt(strID, 10, 64); err2 != nil {
  89. label, err = models.GetLabelInRepoByName(ctx.Repo.Repository.ID, strID)
  90. } else {
  91. label, err = models.GetLabelInRepoByID(ctx.Repo.Repository.ID, intID)
  92. }
  93. if err != nil {
  94. if models.IsErrLabelNotExist(err) {
  95. ctx.NotFound()
  96. } else {
  97. ctx.Error(http.StatusInternalServerError, "GetLabelByRepoID", err)
  98. }
  99. return
  100. }
  101. ctx.JSON(http.StatusOK, label.APIFormat())
  102. }
  103. // CreateLabel create a label for a repository
  104. func CreateLabel(ctx *context.APIContext, form api.CreateLabelOption) {
  105. // swagger:operation POST /repos/{owner}/{repo}/labels issue issueCreateLabel
  106. // ---
  107. // summary: Create a label
  108. // consumes:
  109. // - application/json
  110. // produces:
  111. // - application/json
  112. // parameters:
  113. // - name: owner
  114. // in: path
  115. // description: owner of the repo
  116. // type: string
  117. // required: true
  118. // - name: repo
  119. // in: path
  120. // description: name of the repo
  121. // type: string
  122. // required: true
  123. // - name: body
  124. // in: body
  125. // schema:
  126. // "$ref": "#/definitions/CreateLabelOption"
  127. // responses:
  128. // "201":
  129. // "$ref": "#/responses/Label"
  130. // "422":
  131. // "$ref": "#/responses/validationError"
  132. form.Color = strings.Trim(form.Color, " ")
  133. if len(form.Color) == 6 {
  134. form.Color = "#" + form.Color
  135. }
  136. if !models.LabelColorPattern.MatchString(form.Color) {
  137. ctx.Error(http.StatusUnprocessableEntity, "ColorPattern", fmt.Errorf("bad color code: %s", form.Color))
  138. return
  139. }
  140. label := &models.Label{
  141. Name: form.Name,
  142. Color: form.Color,
  143. RepoID: ctx.Repo.Repository.ID,
  144. Description: form.Description,
  145. }
  146. if err := models.NewLabel(label); err != nil {
  147. ctx.Error(http.StatusInternalServerError, "NewLabel", err)
  148. return
  149. }
  150. ctx.JSON(http.StatusCreated, label.APIFormat())
  151. }
  152. // EditLabel modify a label for a repository
  153. func EditLabel(ctx *context.APIContext, form api.EditLabelOption) {
  154. // swagger:operation PATCH /repos/{owner}/{repo}/labels/{id} issue issueEditLabel
  155. // ---
  156. // summary: Update a label
  157. // consumes:
  158. // - application/json
  159. // produces:
  160. // - application/json
  161. // parameters:
  162. // - name: owner
  163. // in: path
  164. // description: owner of the repo
  165. // type: string
  166. // required: true
  167. // - name: repo
  168. // in: path
  169. // description: name of the repo
  170. // type: string
  171. // required: true
  172. // - name: id
  173. // in: path
  174. // description: id of the label to edit
  175. // type: integer
  176. // format: int64
  177. // required: true
  178. // - name: body
  179. // in: body
  180. // schema:
  181. // "$ref": "#/definitions/EditLabelOption"
  182. // responses:
  183. // "200":
  184. // "$ref": "#/responses/Label"
  185. // "422":
  186. // "$ref": "#/responses/validationError"
  187. label, err := models.GetLabelInRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
  188. if err != nil {
  189. if models.IsErrLabelNotExist(err) {
  190. ctx.NotFound()
  191. } else {
  192. ctx.Error(http.StatusInternalServerError, "GetLabelByRepoID", err)
  193. }
  194. return
  195. }
  196. if form.Name != nil {
  197. label.Name = *form.Name
  198. }
  199. if form.Color != nil {
  200. label.Color = strings.Trim(*form.Color, " ")
  201. if len(label.Color) == 6 {
  202. label.Color = "#" + label.Color
  203. }
  204. if !models.LabelColorPattern.MatchString(label.Color) {
  205. ctx.Error(http.StatusUnprocessableEntity, "ColorPattern", fmt.Errorf("bad color code: %s", label.Color))
  206. return
  207. }
  208. }
  209. if form.Description != nil {
  210. label.Description = *form.Description
  211. }
  212. if err := models.UpdateLabel(label); err != nil {
  213. ctx.ServerError("UpdateLabel", err)
  214. return
  215. }
  216. ctx.JSON(http.StatusOK, label.APIFormat())
  217. }
  218. // DeleteLabel delete a label for a repository
  219. func DeleteLabel(ctx *context.APIContext) {
  220. // swagger:operation DELETE /repos/{owner}/{repo}/labels/{id} issue issueDeleteLabel
  221. // ---
  222. // summary: Delete a label
  223. // parameters:
  224. // - name: owner
  225. // in: path
  226. // description: owner of the repo
  227. // type: string
  228. // required: true
  229. // - name: repo
  230. // in: path
  231. // description: name of the repo
  232. // type: string
  233. // required: true
  234. // - name: id
  235. // in: path
  236. // description: id of the label to delete
  237. // type: integer
  238. // format: int64
  239. // required: true
  240. // responses:
  241. // "204":
  242. // "$ref": "#/responses/empty"
  243. if err := models.DeleteLabel(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil {
  244. ctx.Error(http.StatusInternalServerError, "DeleteLabel", err)
  245. return
  246. }
  247. ctx.Status(http.StatusNoContent)
  248. }