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

milestone.go 5.8 kB

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