API: Fix GetQueryBeforeSince (#13559) (#13560)

* API: Fix GetQueryBeforeSince

* CI.restart()

Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
6543 2020-11-15 19:12:23 +01:00 committed by GitHub
parent dc9f5a7311
commit f9648888f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 45 additions and 25 deletions

View file

@ -101,7 +101,7 @@ func ListRepoNotifications(ctx *context.APIContext) {
before, since, err := utils.GetQueryBeforeSince(ctx) before, since, err := utils.GetQueryBeforeSince(ctx)
if err != nil { if err != nil {
ctx.InternalServerError(err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }
opts := models.FindNotificationOptions{ opts := models.FindNotificationOptions{

View file

@ -63,7 +63,7 @@ func ListNotifications(ctx *context.APIContext) {
before, since, err := utils.GetQueryBeforeSince(ctx) before, since, err := utils.GetQueryBeforeSince(ctx)
if err != nil { if err != nil {
ctx.InternalServerError(err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }
opts := models.FindNotificationOptions{ opts := models.FindNotificationOptions{

View file

@ -56,7 +56,7 @@ func ListIssueComments(ctx *context.APIContext) {
before, since, err := utils.GetQueryBeforeSince(ctx) before, since, err := utils.GetQueryBeforeSince(ctx)
if err != nil { if err != nil {
ctx.Error(http.StatusInternalServerError, "GetQueryBeforeSince", err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
@ -132,7 +132,7 @@ func ListRepoIssueComments(ctx *context.APIContext) {
before, since, err := utils.GetQueryBeforeSince(ctx) before, since, err := utils.GetQueryBeforeSince(ctx)
if err != nil { if err != nil {
ctx.Error(http.StatusInternalServerError, "GetQueryBeforeSince", err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }

View file

@ -86,7 +86,7 @@ func ListTrackedTimes(ctx *context.APIContext) {
} }
if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil { if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil {
ctx.InternalServerError(err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }
@ -491,7 +491,7 @@ func ListTrackedTimesByRepository(ctx *context.APIContext) {
var err error var err error
if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil { if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil {
ctx.InternalServerError(err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }
@ -554,7 +554,7 @@ func ListMyTrackedTimes(ctx *context.APIContext) {
var err error var err error
if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil { if opts.CreatedBeforeUnix, opts.CreatedAfterUnix, err = utils.GetQueryBeforeSince(ctx); err != nil {
ctx.InternalServerError(err) ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
return return
} }

View file

@ -5,6 +5,7 @@
package utils package utils
import ( import (
"net/url"
"strings" "strings"
"time" "time"
@ -15,30 +16,49 @@ import (
// GetQueryBeforeSince return parsed time (unix format) from URL query's before and since // GetQueryBeforeSince return parsed time (unix format) from URL query's before and since
func GetQueryBeforeSince(ctx *context.APIContext) (before, since int64, err error) { func GetQueryBeforeSince(ctx *context.APIContext) (before, since int64, err error) {
qCreatedBefore := strings.Trim(ctx.Query("before"), " ") qCreatedBefore, err := prepareQueryArg(ctx, "before")
if qCreatedBefore != "" {
createdBefore, err := time.Parse(time.RFC3339, qCreatedBefore)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }
if !createdBefore.IsZero() {
before = createdBefore.Unix()
}
}
qCreatedAfter := strings.Trim(ctx.Query("since"), " ") qCreatedSince, err := prepareQueryArg(ctx, "since")
if qCreatedAfter != "" {
createdAfter, err := time.Parse(time.RFC3339, qCreatedAfter)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }
if !createdAfter.IsZero() {
since = createdAfter.Unix() before, err = parseTime(qCreatedBefore)
if err != nil {
return 0, 0, err
} }
since, err = parseTime(qCreatedSince)
if err != nil {
return 0, 0, err
} }
return before, since, nil return before, since, nil
} }
// parseTime parse time and return unix timestamp
func parseTime(value string) (int64, error) {
if len(value) != 0 {
t, err := time.Parse(time.RFC3339, value)
if err != nil {
return 0, err
}
if !t.IsZero() {
return t.Unix(), nil
}
}
return 0, nil
}
// prepareQueryArg unescape and trim a query arg
func prepareQueryArg(ctx *context.APIContext, name string) (value string, err error) {
value, err = url.PathUnescape(ctx.Query(name))
value = strings.Trim(value, " ")
return
}
// GetListOptions returns list options using the page and limit parameters // GetListOptions returns list options using the page and limit parameters
func GetListOptions(ctx *context.APIContext) models.ListOptions { func GetListOptions(ctx *context.APIContext) models.ListOptions {
return models.ListOptions{ return models.ListOptions{