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.

milestone.go 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2020 The Gitea Authors.
  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. "net/http"
  8. "time"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/context"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "code.gitea.io/gitea/modules/timeutil"
  13. "code.gitea.io/gitea/routers/api/v1/utils"
  14. )
  15. // ListMilestones list milestones for a repository
  16. func ListMilestones(ctx *context.APIContext) {
  17. // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList
  18. // ---
  19. // summary: Get all of a repository's opened milestones
  20. // produces:
  21. // - application/json
  22. // parameters:
  23. // - name: owner
  24. // in: path
  25. // description: owner of the repo
  26. // type: string
  27. // required: true
  28. // - name: repo
  29. // in: path
  30. // description: name of the repo
  31. // type: string
  32. // required: true
  33. // - name: state
  34. // in: query
  35. // description: Milestone state, Recognised values are open, closed and all. Defaults to "open"
  36. // type: string
  37. // - name: page
  38. // in: query
  39. // description: page number of results to return (1-based)
  40. // type: integer
  41. // - name: limit
  42. // in: query
  43. // description: page size of results, maximum page size is 50
  44. // type: integer
  45. // responses:
  46. // "200":
  47. // "$ref": "#/responses/MilestoneList"
  48. milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID, api.StateType(ctx.Query("state")), utils.GetListOptions(ctx))
  49. if err != nil {
  50. ctx.Error(http.StatusInternalServerError, "GetMilestonesByRepoID", err)
  51. return
  52. }
  53. apiMilestones := make([]*api.Milestone, len(milestones))
  54. for i := range milestones {
  55. apiMilestones[i] = milestones[i].APIFormat()
  56. }
  57. ctx.JSON(http.StatusOK, &apiMilestones)
  58. }
  59. // GetMilestone get a milestone for a repository
  60. func GetMilestone(ctx *context.APIContext) {
  61. // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone
  62. // ---
  63. // summary: Get a milestone
  64. // produces:
  65. // - application/json
  66. // parameters:
  67. // - name: owner
  68. // in: path
  69. // description: owner of the repo
  70. // type: string
  71. // required: true
  72. // - name: repo
  73. // in: path
  74. // description: name of the repo
  75. // type: string
  76. // required: true
  77. // - name: id
  78. // in: path
  79. // description: id of the milestone
  80. // type: integer
  81. // format: int64
  82. // required: true
  83. // responses:
  84. // "200":
  85. // "$ref": "#/responses/Milestone"
  86. milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
  87. if err != nil {
  88. if models.IsErrMilestoneNotExist(err) {
  89. ctx.NotFound()
  90. } else {
  91. ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
  92. }
  93. return
  94. }
  95. ctx.JSON(http.StatusOK, milestone.APIFormat())
  96. }
  97. // CreateMilestone create a milestone for a repository
  98. func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) {
  99. // swagger:operation POST /repos/{owner}/{repo}/milestones issue issueCreateMilestone
  100. // ---
  101. // summary: Create a milestone
  102. // consumes:
  103. // - application/json
  104. // produces:
  105. // - application/json
  106. // parameters:
  107. // - name: owner
  108. // in: path
  109. // description: owner of the repo
  110. // type: string
  111. // required: true
  112. // - name: repo
  113. // in: path
  114. // description: name of the repo
  115. // type: string
  116. // required: true
  117. // - name: body
  118. // in: body
  119. // schema:
  120. // "$ref": "#/definitions/CreateMilestoneOption"
  121. // responses:
  122. // "201":
  123. // "$ref": "#/responses/Milestone"
  124. if form.Deadline == nil {
  125. defaultDeadline, _ := time.ParseInLocation("2006-01-02", "9999-12-31", time.Local)
  126. form.Deadline = &defaultDeadline
  127. }
  128. milestone := &models.Milestone{
  129. RepoID: ctx.Repo.Repository.ID,
  130. Name: form.Title,
  131. Content: form.Description,
  132. DeadlineUnix: timeutil.TimeStamp(form.Deadline.Unix()),
  133. }
  134. if err := models.NewMilestone(milestone); err != nil {
  135. ctx.Error(http.StatusInternalServerError, "NewMilestone", err)
  136. return
  137. }
  138. ctx.JSON(http.StatusCreated, milestone.APIFormat())
  139. }
  140. // EditMilestone modify a milestone for a repository
  141. func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
  142. // swagger:operation PATCH /repos/{owner}/{repo}/milestones/{id} issue issueEditMilestone
  143. // ---
  144. // summary: Update a milestone
  145. // consumes:
  146. // - application/json
  147. // produces:
  148. // - application/json
  149. // parameters:
  150. // - name: owner
  151. // in: path
  152. // description: owner of the repo
  153. // type: string
  154. // required: true
  155. // - name: repo
  156. // in: path
  157. // description: name of the repo
  158. // type: string
  159. // required: true
  160. // - name: id
  161. // in: path
  162. // description: id of the milestone
  163. // type: integer
  164. // format: int64
  165. // required: true
  166. // - name: body
  167. // in: body
  168. // schema:
  169. // "$ref": "#/definitions/EditMilestoneOption"
  170. // responses:
  171. // "200":
  172. // "$ref": "#/responses/Milestone"
  173. milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
  174. if err != nil {
  175. if models.IsErrMilestoneNotExist(err) {
  176. ctx.NotFound()
  177. } else {
  178. ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
  179. }
  180. return
  181. }
  182. if len(form.Title) > 0 {
  183. milestone.Name = form.Title
  184. }
  185. if form.Description != nil {
  186. milestone.Content = *form.Description
  187. }
  188. if form.Deadline != nil && !form.Deadline.IsZero() {
  189. milestone.DeadlineUnix = timeutil.TimeStamp(form.Deadline.Unix())
  190. }
  191. var oldIsClosed = milestone.IsClosed
  192. if form.State != nil {
  193. milestone.IsClosed = *form.State == string(api.StateClosed)
  194. }
  195. if err := models.UpdateMilestone(milestone, oldIsClosed); err != nil {
  196. ctx.ServerError("UpdateMilestone", err)
  197. return
  198. }
  199. ctx.JSON(http.StatusOK, milestone.APIFormat())
  200. }
  201. // DeleteMilestone delete a milestone for a repository
  202. func DeleteMilestone(ctx *context.APIContext) {
  203. // swagger:operation DELETE /repos/{owner}/{repo}/milestones/{id} issue issueDeleteMilestone
  204. // ---
  205. // summary: Delete a milestone
  206. // parameters:
  207. // - name: owner
  208. // in: path
  209. // description: owner of the repo
  210. // type: string
  211. // required: true
  212. // - name: repo
  213. // in: path
  214. // description: name of the repo
  215. // type: string
  216. // required: true
  217. // - name: id
  218. // in: path
  219. // description: id of the milestone to delete
  220. // type: integer
  221. // format: int64
  222. // required: true
  223. // responses:
  224. // "204":
  225. // "$ref": "#/responses/empty"
  226. if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil {
  227. ctx.Error(http.StatusInternalServerError, "DeleteMilestoneByRepoID", err)
  228. return
  229. }
  230. ctx.Status(http.StatusNoContent)
  231. }