milestone.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. api "github.com/gogits/go-gogs-client"
  7. "github.com/gogits/gogs/models"
  8. "github.com/gogits/gogs/modules/context"
  9. "github.com/gogits/gogs/routers/api/v1/convert"
  10. "time"
  11. )
  12. func ListMilestones(ctx *context.APIContext) {
  13. milestones, err := models.GetAllRepoMilestones(ctx.Repo.Repository.ID)
  14. if err != nil {
  15. ctx.Error(500, "GetAllRepoMilestones", err)
  16. return
  17. }
  18. apiMilestones := make([]*api.Milestone, len(milestones))
  19. for i := range milestones {
  20. apiMilestones[i] = convert.ToMilestone(milestones[i])
  21. }
  22. ctx.JSON(200, &apiMilestones)
  23. }
  24. func GetMilestone(ctx *context.APIContext) {
  25. milestone, err := models.GetRepoMilestoneByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
  26. if err != nil {
  27. if models.IsErrMilestoneNotExist(err) {
  28. ctx.Status(404)
  29. } else {
  30. ctx.Error(500, "GetRepoMilestoneByID", err)
  31. }
  32. return
  33. }
  34. ctx.JSON(200, convert.ToMilestone(milestone))
  35. }
  36. func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) {
  37. if !ctx.Repo.IsWriter() {
  38. ctx.Status(403)
  39. return
  40. }
  41. if form.Deadline == nil {
  42. defaultDeadline, _ := time.ParseInLocation("2006-01-02", "9999-12-31", time.Local)
  43. form.Deadline = &defaultDeadline
  44. }
  45. milestone := &models.Milestone{
  46. RepoID: ctx.Repo.Repository.ID,
  47. Name: form.Title,
  48. Content: form.Description,
  49. Deadline: *form.Deadline,
  50. }
  51. if err := models.NewMilestone(milestone); err != nil {
  52. ctx.Error(500, "NewMilestone", err)
  53. return
  54. }
  55. ctx.JSON(201, convert.ToMilestone(milestone))
  56. }
  57. func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
  58. if !ctx.Repo.IsWriter() {
  59. ctx.Status(403)
  60. return
  61. }
  62. milestone, err := models.GetRepoMilestoneByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
  63. if err != nil {
  64. if models.IsErrMilestoneNotExist(err) {
  65. ctx.Status(404)
  66. } else {
  67. ctx.Error(500, "GetRepoMilestoneByID", err)
  68. }
  69. return
  70. }
  71. if len(form.Title) > 0 {
  72. milestone.Name = form.Title
  73. }
  74. if len(form.Description) > 0 {
  75. milestone.Content = form.Description
  76. }
  77. if !form.Deadline.IsZero() {
  78. milestone.Deadline = *form.Deadline
  79. }
  80. if err := models.UpdateMilestone(milestone); err != nil {
  81. ctx.Handle(500, "UpdateMilestone", err)
  82. return
  83. }
  84. ctx.JSON(200, convert.ToMilestone(milestone))
  85. }
  86. func DeleteMilestone(ctx *context.APIContext) {
  87. if !ctx.Repo.IsWriter() {
  88. ctx.Status(403)
  89. return
  90. }
  91. if err := models.DeleteMilestoneByID(ctx.ParamsInt64(":id")); err != nil {
  92. ctx.Error(500, "DeleteMilestoneByID", err)
  93. return
  94. }
  95. ctx.Status(204)
  96. }
  97. func ChangeMilestoneStatus(ctx *context.APIContext) {
  98. if !ctx.Repo.IsWriter() {
  99. ctx.Status(403)
  100. return
  101. }
  102. m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id"))
  103. if err != nil {
  104. if models.IsErrMilestoneNotExist(err) {
  105. ctx.Handle(404, "GetMilestoneByID", err)
  106. } else {
  107. ctx.Handle(500, "GetMilestoneByID", err)
  108. }
  109. return
  110. }
  111. switch ctx.Params(":action") {
  112. case "open":
  113. if m.IsClosed {
  114. if err = models.ChangeMilestoneStatus(m, false); err != nil {
  115. ctx.Handle(500, "ChangeMilestoneStatus", err)
  116. return
  117. }
  118. }
  119. ctx.JSON(200, convert.ToMilestone(m))
  120. case "close":
  121. if !m.IsClosed {
  122. m.ClosedDate = time.Now()
  123. if err = models.ChangeMilestoneStatus(m, true); err != nil {
  124. ctx.Handle(500, "ChangeMilestoneStatus", err)
  125. return
  126. }
  127. }
  128. ctx.JSON(200, convert.ToMilestone(m))
  129. default:
  130. ctx.Status(400)
  131. }
  132. }