aboutsummaryrefslogtreecommitdiffstats
path: root/routers/api
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2020-09-14 13:48:03 +0200
committerGitHub <noreply@github.com>2020-09-14 14:48:03 +0300
commit00a806de681088805a6f1f6632c0a411ff03c256 (patch)
treeb9035e9100c714b7cbf4201077731f7a0a44c1bb /routers/api
parent33f606ce4cf2aeb25013122cc7b9c2ce1d688289 (diff)
downloadgitea-00a806de681088805a6f1f6632c0a411ff03c256.tar.gz
gitea-00a806de681088805a6f1f6632c0a411ff03c256.zip
[API] Milestone endpoints accept names too (#12649)
* API: Milestone endpoints accept names too * add test * rename Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'routers/api')
-rw-r--r--routers/api/v1/repo/milestone.go76
1 files changed, 49 insertions, 27 deletions
diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go
index f6f6b29465..5a250dbd80 100644
--- a/routers/api/v1/repo/milestone.go
+++ b/routers/api/v1/repo/milestone.go
@@ -7,6 +7,7 @@ package repo
import (
"net/http"
+ "strconv"
"time"
"code.gitea.io/gitea/models"
@@ -73,7 +74,7 @@ func ListMilestones(ctx *context.APIContext) {
ctx.JSON(http.StatusOK, &apiMilestones)
}
-// GetMilestone get a milestone for a repository
+// GetMilestone get a milestone for a repository by ID and if not available by name
func GetMilestone(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone
// ---
@@ -93,23 +94,18 @@ func GetMilestone(ctx *context.APIContext) {
// required: true
// - name: id
// in: path
- // description: id of the milestone
- // type: integer
- // format: int64
+ // description: the milestone to get, identified by ID and if not available by name
+ // type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/Milestone"
- milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
- if err != nil {
- if models.IsErrMilestoneNotExist(err) {
- ctx.NotFound()
- } else {
- ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
- }
+ milestone := getMilestoneByIDOrName(ctx)
+ if ctx.Written() {
return
}
+
ctx.JSON(http.StatusOK, convert.ToAPIMilestone(milestone))
}
@@ -165,7 +161,7 @@ func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) {
ctx.JSON(http.StatusCreated, convert.ToAPIMilestone(milestone))
}
-// EditMilestone modify a milestone for a repository
+// EditMilestone modify a milestone for a repository by ID and if not available by name
func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
// swagger:operation PATCH /repos/{owner}/{repo}/milestones/{id} issue issueEditMilestone
// ---
@@ -187,9 +183,8 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
// required: true
// - name: id
// in: path
- // description: id of the milestone
- // type: integer
- // format: int64
+ // description: the milestone to edit, identified by ID and if not available by name
+ // type: string
// required: true
// - name: body
// in: body
@@ -199,13 +194,8 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
// "200":
// "$ref": "#/responses/Milestone"
- milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
- if err != nil {
- if models.IsErrMilestoneNotExist(err) {
- ctx.NotFound()
- } else {
- ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
- }
+ milestone := getMilestoneByIDOrName(ctx)
+ if ctx.Written() {
return
}
@@ -231,7 +221,7 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
ctx.JSON(http.StatusOK, convert.ToAPIMilestone(milestone))
}
-// DeleteMilestone delete a milestone for a repository
+// DeleteMilestone delete a milestone for a repository by ID and if not available by name
func DeleteMilestone(ctx *context.APIContext) {
// swagger:operation DELETE /repos/{owner}/{repo}/milestones/{id} issue issueDeleteMilestone
// ---
@@ -249,17 +239,49 @@ func DeleteMilestone(ctx *context.APIContext) {
// required: true
// - name: id
// in: path
- // description: id of the milestone to delete
- // type: integer
- // format: int64
+ // description: the milestone to delete, identified by ID and if not available by name
+ // type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
- if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil {
+ m := getMilestoneByIDOrName(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, m.ID); err != nil {
ctx.Error(http.StatusInternalServerError, "DeleteMilestoneByRepoID", err)
return
}
ctx.Status(http.StatusNoContent)
}
+
+// getMilestoneByIDOrName get milestone by ID and if not available by name
+func getMilestoneByIDOrName(ctx *context.APIContext) *models.Milestone {
+ mile := ctx.Params(":id")
+ mileID, _ := strconv.ParseInt(mile, 0, 64)
+
+ if mileID != 0 {
+ milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, mileID)
+ if err == nil {
+ return milestone
+ } else if !models.IsErrMilestoneNotExist(err) {
+ ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
+ return nil
+ }
+ }
+
+ milestone, err := models.GetMilestoneByRepoIDANDName(ctx.Repo.Repository.ID, mile)
+ if err != nil {
+ if models.IsErrMilestoneNotExist(err) {
+ ctx.NotFound()
+ return nil
+ }
+ ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
+ return nil
+ }
+
+ return milestone
+}