* API allow to create closed milestones * set CloseDate too Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: techknowlogick <techknowlogick@gitea.io>tags/v1.13.0-rc1
@@ -44,4 +44,17 @@ func TestAPIIssuesMilestone(t *testing.T) { | |||||
var apiMilestone2 structs.Milestone | var apiMilestone2 structs.Milestone | ||||
DecodeJSON(t, resp, &apiMilestone2) | DecodeJSON(t, resp, &apiMilestone2) | ||||
assert.EqualValues(t, "closed", apiMilestone2.State) | assert.EqualValues(t, "closed", apiMilestone2.State) | ||||
req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/milestones?token=%s", owner.Name, repo.Name, token), structs.CreateMilestoneOption{ | |||||
Title: "wow", | |||||
Description: "closed one", | |||||
State: "closed", | |||||
}) | |||||
resp = session.MakeRequest(t, req, http.StatusCreated) | |||||
DecodeJSON(t, resp, &apiMilestone) | |||||
assert.Equal(t, "wow", apiMilestone.Title) | |||||
assert.Equal(t, structs.StateClosed, apiMilestone.State) | |||||
req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/%s/%s/milestones/%d?token=%s", owner.Name, repo.Name, apiMilestone.ID, token)) | |||||
resp = session.MakeRequest(t, req, http.StatusNoContent) | |||||
} | } |
@@ -28,6 +28,8 @@ type CreateMilestoneOption struct { | |||||
Description string `json:"description"` | Description string `json:"description"` | ||||
// swagger:strfmt date-time | // swagger:strfmt date-time | ||||
Deadline *time.Time `json:"due_on"` | Deadline *time.Time `json:"due_on"` | ||||
// enum: open,closed | |||||
State string `json:"state"` | |||||
} | } | ||||
// EditMilestoneOption options for editing a milestone | // EditMilestoneOption options for editing a milestone | ||||
@@ -144,6 +144,11 @@ func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) { | |||||
DeadlineUnix: timeutil.TimeStamp(form.Deadline.Unix()), | DeadlineUnix: timeutil.TimeStamp(form.Deadline.Unix()), | ||||
} | } | ||||
if form.State == "closed" { | |||||
milestone.IsClosed = true | |||||
milestone.ClosedDateUnix = timeutil.TimeStampNow() | |||||
} | |||||
if err := models.NewMilestone(milestone); err != nil { | if err := models.NewMilestone(milestone); err != nil { | ||||
ctx.Error(http.StatusInternalServerError, "NewMilestone", err) | ctx.Error(http.StatusInternalServerError, "NewMilestone", err) | ||||
return | return | ||||
@@ -11384,6 +11384,14 @@ | |||||
"format": "date-time", | "format": "date-time", | ||||
"x-go-name": "Deadline" | "x-go-name": "Deadline" | ||||
}, | }, | ||||
"state": { | |||||
"type": "string", | |||||
"enum": [ | |||||
"open", | |||||
"closed" | |||||
], | |||||
"x-go-name": "State" | |||||
}, | |||||
"title": { | "title": { | ||||
"type": "string", | "type": "string", | ||||
"x-go-name": "Title" | "x-go-name": "Title" | ||||