From 7971b05d2b96e45a4ee3954a39a7db9b9bbb807f Mon Sep 17 00:00:00 2001 From: David Svantesson Date: Sun, 3 Nov 2019 15:46:32 +0100 Subject: [PATCH] Fix API deadline removal (#8759) * Handle deadline is zero (to remove deadline) * Better API documentation for issue deadline. * Add parameter to unset due date. * Update pull edit API comment --- go.mod | 2 -- modules/structs/issue.go | 3 ++- modules/structs/pull.go | 3 ++- routers/api/v1/repo/issue.go | 13 ++++++++++--- routers/api/v1/repo/pull.go | 15 +++++++++++---- templates/swagger/v1_json.tmpl | 10 +++++++++- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 7e920ac03..02f0c46f2 100644 --- a/go.mod +++ b/go.mod @@ -69,8 +69,6 @@ require ( github.com/mattn/go-sqlite3 v1.11.0 github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75 github.com/microcosm-cc/bluemonday v0.0.0-20161012083705-f77f16ffc87a - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae // indirect github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 diff --git a/modules/structs/issue.go b/modules/structs/issue.go index bd39f9ea4..b27c757fa 100644 --- a/modules/structs/issue.go +++ b/modules/structs/issue.go @@ -99,7 +99,8 @@ type EditIssueOption struct { Milestone *int64 `json:"milestone"` State *string `json:"state"` // swagger:strfmt date-time - Deadline *time.Time `json:"due_date"` + Deadline *time.Time `json:"due_date"` + RemoveDeadline *bool `json:"unset_due_date"` } // EditDeadlineOption options for creating a deadline diff --git a/modules/structs/pull.go b/modules/structs/pull.go index 722d245af..c4ec7d416 100644 --- a/modules/structs/pull.go +++ b/modules/structs/pull.go @@ -88,5 +88,6 @@ type EditPullRequestOption struct { Labels []int64 `json:"labels"` State *string `json:"state"` // swagger:strfmt date-time - Deadline *time.Time `json:"due_date"` + Deadline *time.Time `json:"due_date"` + RemoveDeadline *bool `json:"unset_due_date"` } diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 1534c45df..186e66cb8 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -458,9 +458,16 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) { issue.Content = *form.Body } - // Update the deadline - if form.Deadline != nil && ctx.Repo.CanWrite(models.UnitTypeIssues) { - deadlineUnix := timeutil.TimeStamp(form.Deadline.Unix()) + // Update or remove the deadline, only if set and allowed + if (form.Deadline != nil || form.RemoveDeadline != nil) && ctx.Repo.CanWrite(models.UnitTypeIssues) { + var deadlineUnix timeutil.TimeStamp + + if (form.RemoveDeadline == nil || !*form.RemoveDeadline) && !form.Deadline.IsZero() { + deadline := time.Date(form.Deadline.Year(), form.Deadline.Month(), form.Deadline.Day(), + 23, 59, 59, 0, form.Deadline.Location()) + deadlineUnix = timeutil.TimeStamp(deadline.Unix()) + } + if err := models.UpdateIssueDeadline(issue, deadlineUnix, ctx.User); err != nil { ctx.Error(500, "UpdateIssueDeadline", err) return diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 9264c00ce..6d86105a1 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -8,6 +8,7 @@ import ( "fmt" "net/http" "strings" + "time" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/auth" @@ -326,7 +327,7 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { // swagger:operation PATCH /repos/{owner}/{repo}/pulls/{index} repository repoEditPullRequest // --- - // summary: Update a pull request + // summary: Update a pull request. If using deadline only the date will be taken into account, and time of day ignored. // consumes: // - application/json // produces: @@ -385,9 +386,15 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { issue.Content = form.Body } - // Update Deadline - if form.Deadline != nil { - deadlineUnix := timeutil.TimeStamp(form.Deadline.Unix()) + // Update or remove deadline if set + if form.Deadline != nil || form.RemoveDeadline != nil { + var deadlineUnix timeutil.TimeStamp + if (form.RemoveDeadline == nil || !*form.RemoveDeadline) && !form.Deadline.IsZero() { + deadline := time.Date(form.Deadline.Year(), form.Deadline.Month(), form.Deadline.Day(), + 23, 59, 59, 0, form.Deadline.Location()) + deadlineUnix = timeutil.TimeStamp(deadline.Unix()) + } + if err := models.UpdateIssueDeadline(issue, deadlineUnix, ctx.User); err != nil { ctx.Error(500, "UpdateIssueDeadline", err) return diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 41e5353ea..17b8eab6c 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -4715,7 +4715,7 @@ "tags": [ "repository" ], - "summary": "Update a pull request", + "summary": "Update a pull request. If using deadline only the date will be taken into account, and time of day ignored.", "operationId": "repoEditPullRequest", "parameters": [ { @@ -8532,6 +8532,10 @@ "title": { "type": "string", "x-go-name": "Title" + }, + "unset_due_date": { + "type": "boolean", + "x-go-name": "RemoveDeadline" } }, "x-go-package": "code.gitea.io/gitea/modules/structs" @@ -8660,6 +8664,10 @@ "title": { "type": "string", "x-go-name": "Title" + }, + "unset_due_date": { + "type": "boolean", + "x-go-name": "RemoveDeadline" } }, "x-go-package": "code.gitea.io/gitea/modules/structs"