From 66d68382b89ecfe9921c17a82312828979fe1f4e Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 8 Jan 2022 21:23:24 +0100 Subject: [PATCH 1/7] feat: add time range parser --- docs/content/doc/usage/errors.md | 214 ++++++++++++++------------- pkg/modules/parse-time/errors.go | 51 +++++++ pkg/modules/parse-time/parse.go | 79 ++++++++++ pkg/modules/parse-time/parse_test.go | 76 ++++++++++ 4 files changed, 316 insertions(+), 104 deletions(-) create mode 100644 pkg/modules/parse-time/errors.go create mode 100644 pkg/modules/parse-time/parse.go create mode 100644 pkg/modules/parse-time/parse_test.go diff --git a/docs/content/doc/usage/errors.md b/docs/content/doc/usage/errors.md index f5325ddd7..54d3f152f 100644 --- a/docs/content/doc/usage/errors.md +++ b/docs/content/doc/usage/errors.md @@ -16,146 +16,152 @@ This document describes the different errors Vikunja can return. ## Generic -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 0001 | 403 | Generic forbidden error. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|--------------------------| +| 0001 | 403 | Generic forbidden error. | ## User -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 1001 | 400 | A user with this username already exists. | -| 1002 | 400 | A user with this email address already exists. | -| 1004 | 400 | No username and password specified. | -| 1005 | 404 | The user does not exist. | -| 1006 | 400 | Could not get the user id. | -| 1008 | 412 | No password reset token provided. | -| 1009 | 412 | Invalid password reset token. | -| 1010 | 412 | Invalid email confirm token. | -| 1011 | 412 | Wrong username or password. | -| 1012 | 412 | Email address of the user not confirmed. | -| 1013 | 412 | New password is empty. | -| 1014 | 412 | Old password is empty. | -| 1015 | 412 | Totp is already enabled for this user. | -| 1016 | 412 | Totp is not enabled for this user. | -| 1017 | 412 | The provided Totp passcode is invalid. | -| 1018 | 412 | The provided user avatar provider type setting is invalid. | -| 1019 | 412 | No openid email address was provided. | -| 1020 | 412 | This user account is disabled. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|------------------------------------------------------------| +| 1001 | 400 | A user with this username already exists. | +| 1002 | 400 | A user with this email address already exists. | +| 1004 | 400 | No username and password specified. | +| 1005 | 404 | The user does not exist. | +| 1006 | 400 | Could not get the user id. | +| 1008 | 412 | No password reset token provided. | +| 1009 | 412 | Invalid password reset token. | +| 1010 | 412 | Invalid email confirm token. | +| 1011 | 412 | Wrong username or password. | +| 1012 | 412 | Email address of the user not confirmed. | +| 1013 | 412 | New password is empty. | +| 1014 | 412 | Old password is empty. | +| 1015 | 412 | Totp is already enabled for this user. | +| 1016 | 412 | Totp is not enabled for this user. | +| 1017 | 412 | The provided Totp passcode is invalid. | +| 1018 | 412 | The provided user avatar provider type setting is invalid. | +| 1019 | 412 | No openid email address was provided. | +| 1020 | 412 | This user account is disabled. | ## Validation -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 2001 | 400 | ID cannot be empty or 0. | -| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|---------------------------------------------------------------------------------------------------------| +| 2001 | 400 | ID cannot be empty or 0. | +| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. | ## List -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 3001 | 404 | The list does not exist. | -| 3004 | 403 | The user needs to have read permissions on that list to perform that action. | -| 3005 | 400 | The list title cannot be empty. | -| 3006 | 404 | The list share does not exist. | -| 3007 | 400 | A list with this identifier already exists. | -| 3008 | 412 | The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------------------------------------------------------------------------------------------------------------------------| +| 3001 | 404 | The list does not exist. | +| 3004 | 403 | The user needs to have read permissions on that list to perform that action. | +| 3005 | 400 | The list title cannot be empty. | +| 3006 | 404 | The list share does not exist. | +| 3007 | 400 | A list with this identifier already exists. | +| 3008 | 412 | The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list. | ## Task -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 4001 | 400 | The list task text cannot be empty. | -| 4002 | 404 | The list task does not exist. | -| 4003 | 403 | All bulk editing tasks must belong to the same list. | -| 4004 | 403 | Need at least one task when bulk editing tasks. | -| 4005 | 403 | The user does not have the right to see the task. | -| 4006 | 403 | The user tried to set a parent task as the task itself. | -| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. | -| 4008 | 409 | The user tried to create a task relation which already exists. | -| 4009 | 404 | The task relation does not exist. | -| 4010 | 400 | Cannot relate a task with itself. | -| 4011 | 404 | The task attachment does not exist. | -| 4012 | 400 | The task attachment is too large. | -| 4013 | 400 | The task sort param is invalid. | -| 4014 | 400 | The task sort order is invalid. | -| 4015 | 404 | The task comment does not exist. | -| 4016 | 403 | Invalid task field. | -| 4017 | 403 | Invalid task filter comparator. | -| 4018 | 403 | Invalid task filter concatinator. | -| 4019 | 403 | Invalid task filter value. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|----------------------------------------------------------------------------| +| 4001 | 400 | The list task text cannot be empty. | +| 4002 | 404 | The list task does not exist. | +| 4003 | 403 | All bulk editing tasks must belong to the same list. | +| 4004 | 403 | Need at least one task when bulk editing tasks. | +| 4005 | 403 | The user does not have the right to see the task. | +| 4006 | 403 | The user tried to set a parent task as the task itself. | +| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. | +| 4008 | 409 | The user tried to create a task relation which already exists. | +| 4009 | 404 | The task relation does not exist. | +| 4010 | 400 | Cannot relate a task with itself. | +| 4011 | 404 | The task attachment does not exist. | +| 4012 | 400 | The task attachment is too large. | +| 4013 | 400 | The task sort param is invalid. | +| 4014 | 400 | The task sort order is invalid. | +| 4015 | 404 | The task comment does not exist. | +| 4016 | 403 | Invalid task field. | +| 4017 | 403 | Invalid task filter comparator. | +| 4018 | 403 | Invalid task filter concatinator. | +| 4019 | 403 | Invalid task filter value. | ## Namespace -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 5001 | 404 | The namspace does not exist. | -| 5003 | 403 | The user does not have access to the specified namespace. | -| 5006 | 400 | The namespace name cannot be empty. | -| 5009 | 403 | The user needs to have namespace read access to perform that action. | -| 5010 | 403 | This team does not have access to that namespace. | -| 5011 | 409 | This user has already access to that namespace. | -| 5012 | 412 | The namespace is archived and can therefore only be accessed read only. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------------------------------------------------------------------| +| 5001 | 404 | The namspace does not exist. | +| 5003 | 403 | The user does not have access to the specified namespace. | +| 5006 | 400 | The namespace name cannot be empty. | +| 5009 | 403 | The user needs to have namespace read access to perform that action. | +| 5010 | 403 | This team does not have access to that namespace. | +| 5011 | 409 | This user has already access to that namespace. | +| 5012 | 412 | The namespace is archived and can therefore only be accessed read only. | ## Team -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 6001 | 400 | The team name cannot be emtpy. | -| 6002 | 404 | The team does not exist. | -| 6004 | 409 | The team already has access to that namespace or list. | -| 6005 | 409 | The user is already a member of that team. | -| 6006 | 400 | Cannot delete the last team member. | -| 6007 | 403 | The team does not have access to the list to perform that action. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------------------------------------------------------------| +| 6001 | 400 | The team name cannot be emtpy. | +| 6002 | 404 | The team does not exist. | +| 6004 | 409 | The team already has access to that namespace or list. | +| 6005 | 409 | The user is already a member of that team. | +| 6006 | 400 | Cannot delete the last team member. | +| 6007 | 403 | The team does not have access to the list to perform that action. | ## User List Access -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 7002 | 409 | The user already has access to that list. | -| 7003 | 403 | The user does not have access to that list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|---------------------------------------------| +| 7002 | 409 | The user already has access to that list. | +| 7003 | 403 | The user does not have access to that list. | ## Label -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 8001 | 403 | This label already exists on that task. | -| 8002 | 404 | The label does not exist. | -| 8003 | 403 | The user does not have access to this label. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|----------------------------------------------| +| 8001 | 403 | This label already exists on that task. | +| 8002 | 404 | The label does not exist. | +| 8003 | 403 | The user does not have access to this label. | ## Right -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 9001 | 403 | The right is invalid. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-----------------------| +| 9001 | 403 | The right is invalid. | ## Kanban -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 10001 | 404 | The bucket does not exist. | -| 10002 | 400 | The bucket does not belong to that list. | -| 10003 | 412 | You cannot remove the last bucket on a list. | -| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. | -| 10005 | 412 | There can be only one done bucket per list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-----------------------------------------------------------------------------------------------| +| 10001 | 404 | The bucket does not exist. | +| 10002 | 400 | The bucket does not belong to that list. | +| 10003 | 412 | You cannot remove the last bucket on a list. | +| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. | +| 10005 | 412 | There can be only one done bucket per list. | ## Saved Filters -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 11001 | 404 | The saved filter does not exist. | -| 11002 | 412 | Saved filters are not available for link shares. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|--------------------------------------------------| +| 11001 | 404 | The saved filter does not exist. | +| 11002 | 412 | Saved filters are not available for link shares. | ## Subscriptions -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 12001 | 412 | The subscription entity type is invalid. | -| 12002 | 412 | The user is already subscribed to the entity itself or a parent entity. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------------------------------------------------------------------| +| 12001 | 412 | The subscription entity type is invalid. | +| 12002 | 412 | The user is already subscribed to the entity itself or a parent entity. | ## Link Shares -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------| -| 13001 | 412 | This link share requires a password for authentication, but none was provided. | -| 13002 | 403 | The provided link share password was invalid. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|--------------------------------------------------------------------------------| +| 13001 | 412 | This link share requires a password for authentication, but none was provided. | +| 13002 | 403 | The provided link share password was invalid. | + +## Time Ranges + +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------------------------------| +| 14001 | 412 | The provided time range is invalid. | diff --git a/pkg/modules/parse-time/errors.go b/pkg/modules/parse-time/errors.go new file mode 100644 index 000000000..197648411 --- /dev/null +++ b/pkg/modules/parse-time/errors.go @@ -0,0 +1,51 @@ +// Vikunja is a to-do list application to facilitate your life. +// Copyright 2018-2022 Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public Licensee as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public Licensee for more details. +// +// You should have received a copy of the GNU Affero General Public Licensee +// along with this program. If not, see . + +package parse_time + +import ( + "fmt" + "net/http" + + "code.vikunja.io/web" +) + +// ErrInvalidTimeRange represents a "InvalidTimeRange" kind of error. Used if the provided time range is invalid. +type ErrInvalidTimeRange struct { + Range string +} + +// IsErrInvalidTimeRange checks if an error is a ErrInvalidTimeRange. +func IsErrInvalidTimeRange(err error) bool { + _, ok := err.(*ErrInvalidTimeRange) + return ok +} + +func (err *ErrInvalidTimeRange) Error() string { + return fmt.Sprintf("Time range '%s' is invalid", err.Range) +} + +// ErrCodeInvalidTimeRange holds the unique world-error code of this error +const ErrCodeInvalidTimeRange = 14001 + +// HTTPError holds the http error description +func (err *ErrInvalidTimeRange) HTTPError() web.HTTPError { + return web.HTTPError{ + HTTPCode: http.StatusPreconditionFailed, + Code: ErrCodeInvalidTimeRange, + Message: "The time range is invalid.", + } +} diff --git a/pkg/modules/parse-time/parse.go b/pkg/modules/parse-time/parse.go new file mode 100644 index 000000000..2efbd167a --- /dev/null +++ b/pkg/modules/parse-time/parse.go @@ -0,0 +1,79 @@ +// Vikunja is a to-do list application to facilitate your life. +// Copyright 2018-2022 Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public Licensee as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public Licensee for more details. +// +// You should have received a copy of the GNU Affero General Public Licensee +// along with this program. If not, see . + +package parse_time + +import ( + "strconv" + "strings" + "time" +) + +func ParseTimeRange(timeRange string) (from time.Time, to time.Time, err error) { + timeRange = strings.ReplaceAll(timeRange, " ", "") + + var parts []string + var factor int + if strings.Index(timeRange, "-") > 0 { + parts = strings.Split(timeRange, "-") + factor = -1 + } else { + parts = strings.Split(timeRange, "+") + factor = 1 + } + + if len(parts) != 2 { + return from, to, &ErrInvalidTimeRange{Range: timeRange} + } + + // Find the duration that is not "now" + var dur string + dur = parts[0] + if dur == "now" { + dur = parts[1] + } + + to = time.Now() + + var diff time.Duration + diff, err = parseTimeDuration(dur) + if err != nil { + return + } + + from = time.Now().Add(diff * time.Duration(factor)) + + // Make sure from is always before to + if to.Unix() < from.Unix() { + return to, from, nil + } + + return +} + +func parseTimeDuration(timeAmount string) (amount time.Duration, err error) { + if strings.Index(timeAmount, "d") > -1 { + var a int + a, err = strconv.Atoi(strings.ReplaceAll(timeAmount, "d", "")) + if err != nil { + return + } + + return time.Duration(a) * 24 * time.Hour, nil + } + + return time.ParseDuration(timeAmount) +} diff --git a/pkg/modules/parse-time/parse_test.go b/pkg/modules/parse-time/parse_test.go new file mode 100644 index 000000000..9ab3ca8c4 --- /dev/null +++ b/pkg/modules/parse-time/parse_test.go @@ -0,0 +1,76 @@ +// Vikunja is a to-do list application to facilitate your life. +// Copyright 2018-2022 Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public Licensee as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public Licensee for more details. +// +// You should have received a copy of the GNU Affero General Public Licensee +// along with this program. If not, see . + +package parse_time + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestParseTimeRange(t *testing.T) { + t.Run("last 7 days", func(t *testing.T) { + from, to, err := ParseTimeRange("now - 7d") + + assert.NoError(t, err) + assert.Equal(t, time.Now().Add(time.Hour*24*7*-1).Unix(), from.Unix()) + assert.Equal(t, time.Now().Unix(), to.Unix()) + }) + t.Run("last 7 days, but different", func(t *testing.T) { + from, to, err := ParseTimeRange("7d - now") + + assert.NoError(t, err) + assert.Equal(t, time.Now().Add(time.Hour*24*7*-1).Unix(), from.Unix()) + assert.Equal(t, time.Now().Unix(), to.Unix()) + }) + t.Run("last 24h", func(t *testing.T) { + from, to, err := ParseTimeRange("24h - now") + + assert.NoError(t, err) + assert.Equal(t, time.Now().Add(time.Hour*24*-1).Unix(), from.Unix()) + assert.Equal(t, time.Now().Unix(), to.Unix()) + }) + t.Run("next 7 days", func(t *testing.T) { + from, to, err := ParseTimeRange("now + 7d") + + assert.NoError(t, err) + assert.Equal(t, time.Now().Unix(), from.Unix()) + assert.Equal(t, time.Now().Add(time.Hour*24*7).Unix(), to.Unix()) + }) + t.Run("next 24h", func(t *testing.T) { + from, to, err := ParseTimeRange("now + 24h") + + assert.NoError(t, err) + assert.Equal(t, time.Now().Unix(), from.Unix()) + assert.Equal(t, time.Now().Add(time.Hour*24).Unix(), to.Unix()) + }) + t.Run("range with only now", func(t *testing.T) { + _, _, err := ParseTimeRange("now") + assert.Error(t, err) + assert.True(t, IsErrInvalidTimeRange(err)) + }) + t.Run("range with only one duration part", func(t *testing.T) { + _, _, err := ParseTimeRange("7d") + assert.Error(t, err) + assert.True(t, IsErrInvalidTimeRange(err)) + }) + t.Run("invalid date range", func(t *testing.T) { + _, _, err := ParseTimeRange("now-7y") + assert.Error(t, err) + }) +} -- 2.45.1 From 81e28c0856d5b2b54577d1fb64c7f5fe51a908bc Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 8 Jan 2022 22:10:14 +0100 Subject: [PATCH 2/7] feat: add relative dates for filters --- go.mod | 1 + go.sum | 2 ++ pkg/integrations/task_collection_test.go | 34 ++++++++++++++++++++---- pkg/models/task_collection_filter.go | 11 ++++++-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 7f029c5b7..449ccebb6 100644 --- a/go.mod +++ b/go.mod @@ -59,6 +59,7 @@ require ( github.com/swaggo/swag v1.8.0 github.com/tkuchiki/go-timezone v0.2.2 github.com/ulule/limiter/v3 v3.9.0 + github.com/vectordotdev/go-datemath v0.1.1-0.20211214182920-0a4ac8742b93 // indirect github.com/yuin/goldmark v1.4.8 golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 golang.org/x/image v0.0.0-20220302094943-723b81ca9867 diff --git a/go.sum b/go.sum index 6d4d9a8b8..3d290f8b1 100644 --- a/go.sum +++ b/go.sum @@ -790,6 +790,8 @@ github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52 github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vectordotdev/go-datemath v0.1.1-0.20211214182920-0a4ac8742b93 h1:bT0ZMfsMi2Xh8dopgxhFT+OJH88QITHpdppdkG1rXJQ= +github.com/vectordotdev/go-datemath v0.1.1-0.20211214182920-0a4ac8742b93/go.mod h1:PnwzbSst7KD3vpBzzlntZU5gjVa455Uqa5QPiKSYJzQ= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/pkg/integrations/task_collection_test.go b/pkg/integrations/task_collection_test.go index bbd64c255..e1e11e811 100644 --- a/pkg/integrations/task_collection_test.go +++ b/pkg/integrations/task_collection_test.go @@ -17,12 +17,11 @@ package integrations import ( - "net/url" - "testing" - "code.vikunja.io/api/pkg/models" "code.vikunja.io/web/handler" "github.com/stretchr/testify/assert" + "net/url" + "testing" ) func TestTaskCollection(t *testing.T) { @@ -244,12 +243,37 @@ func TestTaskCollection(t *testing.T) { // the current date. assert.Equal(t, "[]\n", rec.Body.String()) }) + t.Run("unix timestamps", func(t *testing.T) { + rec, err := testHandler.testReadAllWithUser( + url.Values{ + "filter_by": []string{"start_date", "end_date", "due_date"}, + "filter_value": []string{"1544500000", "1513164001", "1543500000"}, + "filter_comparator": []string{"greater", "less", "greater"}, + }, + urlParams, + ) + assert.NoError(t, err) + assert.NotContains(t, rec.Body.String(), `task #1`) + assert.NotContains(t, rec.Body.String(), `task #2`) + assert.NotContains(t, rec.Body.String(), `task #3`) + assert.NotContains(t, rec.Body.String(), `task #4`) + assert.Contains(t, rec.Body.String(), `task #5`) + assert.Contains(t, rec.Body.String(), `task #6`) + assert.Contains(t, rec.Body.String(), `task #7`) + assert.NotContains(t, rec.Body.String(), `task #8`) + assert.Contains(t, rec.Body.String(), `task #9`) + assert.NotContains(t, rec.Body.String(), `task #10`) + assert.NotContains(t, rec.Body.String(), `task #11`) + assert.NotContains(t, rec.Body.String(), `task #12`) + assert.NotContains(t, rec.Body.String(), `task #13`) + assert.NotContains(t, rec.Body.String(), `task #14`) + }) }) t.Run("invalid date", func(t *testing.T) { _, err := testHandler.testReadAllWithUser( url.Values{ "filter_by": []string{"due_date"}, - "filter_value": []string{"1540000000"}, + "filter_value": []string{"invalid"}, "filter_comparator": []string{"greater"}, }, nil, @@ -451,7 +475,7 @@ func TestTaskCollection(t *testing.T) { _, err := testHandler.testReadAllWithUser( url.Values{ "filter_by": []string{"due_date"}, - "filter_value": []string{"1540000000"}, + "filter_value": []string{"invalid"}, "filter_comparator": []string{"greater"}, }, nil, diff --git a/pkg/models/task_collection_filter.go b/pkg/models/task_collection_filter.go index 4b8ed1421..0e86a683b 100644 --- a/pkg/models/task_collection_filter.go +++ b/pkg/models/task_collection_filter.go @@ -25,6 +25,7 @@ import ( "code.vikunja.io/api/pkg/config" "github.com/iancoleman/strcase" + "github.com/vectordotdev/go-datemath" "xorm.io/xorm/schemas" ) @@ -159,8 +160,14 @@ func getValueForField(field reflect.StructField, rawValue string) (value interfa value, err = strconv.ParseBool(rawValue) case reflect.Struct: if field.Type == schemas.TimeType { - value, err = time.Parse(time.RFC3339, rawValue) - value = value.(time.Time).In(config.GetTimeZone()) + var t datemath.Expression + t, err = datemath.Parse(rawValue) + if err == nil { + value = t.Time(datemath.WithLocation(config.GetTimeZone())) + } else { + value, err = time.Parse(time.RFC3339, rawValue) + value = value.(time.Time).In(config.GetTimeZone()) + } } case reflect.Slice: // If this is a slice of pointers we're dealing with some property which is a relation -- 2.45.1 From b7df3d7e75fc14155d1ed57a8e62bfd46fa4a1a4 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 8 Jan 2022 22:10:55 +0100 Subject: [PATCH 3/7] Revert "feat: add time range parser" This reverts commit b9cd2d1a77c7525bf17bfcdad32eeade484a5488. --- docs/content/doc/usage/errors.md | 214 +++++++++++++-------------- pkg/modules/parse-time/errors.go | 51 ------- pkg/modules/parse-time/parse.go | 79 ---------- pkg/modules/parse-time/parse_test.go | 76 ---------- 4 files changed, 104 insertions(+), 316 deletions(-) delete mode 100644 pkg/modules/parse-time/errors.go delete mode 100644 pkg/modules/parse-time/parse.go delete mode 100644 pkg/modules/parse-time/parse_test.go diff --git a/docs/content/doc/usage/errors.md b/docs/content/doc/usage/errors.md index 54d3f152f..f5325ddd7 100644 --- a/docs/content/doc/usage/errors.md +++ b/docs/content/doc/usage/errors.md @@ -16,152 +16,146 @@ This document describes the different errors Vikunja can return. ## Generic -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|--------------------------| -| 0001 | 403 | Generic forbidden error. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 0001 | 403 | Generic forbidden error. | ## User -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|------------------------------------------------------------| -| 1001 | 400 | A user with this username already exists. | -| 1002 | 400 | A user with this email address already exists. | -| 1004 | 400 | No username and password specified. | -| 1005 | 404 | The user does not exist. | -| 1006 | 400 | Could not get the user id. | -| 1008 | 412 | No password reset token provided. | -| 1009 | 412 | Invalid password reset token. | -| 1010 | 412 | Invalid email confirm token. | -| 1011 | 412 | Wrong username or password. | -| 1012 | 412 | Email address of the user not confirmed. | -| 1013 | 412 | New password is empty. | -| 1014 | 412 | Old password is empty. | -| 1015 | 412 | Totp is already enabled for this user. | -| 1016 | 412 | Totp is not enabled for this user. | -| 1017 | 412 | The provided Totp passcode is invalid. | -| 1018 | 412 | The provided user avatar provider type setting is invalid. | -| 1019 | 412 | No openid email address was provided. | -| 1020 | 412 | This user account is disabled. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 1001 | 400 | A user with this username already exists. | +| 1002 | 400 | A user with this email address already exists. | +| 1004 | 400 | No username and password specified. | +| 1005 | 404 | The user does not exist. | +| 1006 | 400 | Could not get the user id. | +| 1008 | 412 | No password reset token provided. | +| 1009 | 412 | Invalid password reset token. | +| 1010 | 412 | Invalid email confirm token. | +| 1011 | 412 | Wrong username or password. | +| 1012 | 412 | Email address of the user not confirmed. | +| 1013 | 412 | New password is empty. | +| 1014 | 412 | Old password is empty. | +| 1015 | 412 | Totp is already enabled for this user. | +| 1016 | 412 | Totp is not enabled for this user. | +| 1017 | 412 | The provided Totp passcode is invalid. | +| 1018 | 412 | The provided user avatar provider type setting is invalid. | +| 1019 | 412 | No openid email address was provided. | +| 1020 | 412 | This user account is disabled. | ## Validation -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|---------------------------------------------------------------------------------------------------------| -| 2001 | 400 | ID cannot be empty or 0. | -| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 2001 | 400 | ID cannot be empty or 0. | +| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. | ## List -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------------------------------------------------------------------------------------------------------------------------| -| 3001 | 404 | The list does not exist. | -| 3004 | 403 | The user needs to have read permissions on that list to perform that action. | -| 3005 | 400 | The list title cannot be empty. | -| 3006 | 404 | The list share does not exist. | -| 3007 | 400 | A list with this identifier already exists. | -| 3008 | 412 | The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 3001 | 404 | The list does not exist. | +| 3004 | 403 | The user needs to have read permissions on that list to perform that action. | +| 3005 | 400 | The list title cannot be empty. | +| 3006 | 404 | The list share does not exist. | +| 3007 | 400 | A list with this identifier already exists. | +| 3008 | 412 | The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list. | ## Task -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|----------------------------------------------------------------------------| -| 4001 | 400 | The list task text cannot be empty. | -| 4002 | 404 | The list task does not exist. | -| 4003 | 403 | All bulk editing tasks must belong to the same list. | -| 4004 | 403 | Need at least one task when bulk editing tasks. | -| 4005 | 403 | The user does not have the right to see the task. | -| 4006 | 403 | The user tried to set a parent task as the task itself. | -| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. | -| 4008 | 409 | The user tried to create a task relation which already exists. | -| 4009 | 404 | The task relation does not exist. | -| 4010 | 400 | Cannot relate a task with itself. | -| 4011 | 404 | The task attachment does not exist. | -| 4012 | 400 | The task attachment is too large. | -| 4013 | 400 | The task sort param is invalid. | -| 4014 | 400 | The task sort order is invalid. | -| 4015 | 404 | The task comment does not exist. | -| 4016 | 403 | Invalid task field. | -| 4017 | 403 | Invalid task filter comparator. | -| 4018 | 403 | Invalid task filter concatinator. | -| 4019 | 403 | Invalid task filter value. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 4001 | 400 | The list task text cannot be empty. | +| 4002 | 404 | The list task does not exist. | +| 4003 | 403 | All bulk editing tasks must belong to the same list. | +| 4004 | 403 | Need at least one task when bulk editing tasks. | +| 4005 | 403 | The user does not have the right to see the task. | +| 4006 | 403 | The user tried to set a parent task as the task itself. | +| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. | +| 4008 | 409 | The user tried to create a task relation which already exists. | +| 4009 | 404 | The task relation does not exist. | +| 4010 | 400 | Cannot relate a task with itself. | +| 4011 | 404 | The task attachment does not exist. | +| 4012 | 400 | The task attachment is too large. | +| 4013 | 400 | The task sort param is invalid. | +| 4014 | 400 | The task sort order is invalid. | +| 4015 | 404 | The task comment does not exist. | +| 4016 | 403 | Invalid task field. | +| 4017 | 403 | Invalid task filter comparator. | +| 4018 | 403 | Invalid task filter concatinator. | +| 4019 | 403 | Invalid task filter value. | ## Namespace -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------------------------------------------------------------------| -| 5001 | 404 | The namspace does not exist. | -| 5003 | 403 | The user does not have access to the specified namespace. | -| 5006 | 400 | The namespace name cannot be empty. | -| 5009 | 403 | The user needs to have namespace read access to perform that action. | -| 5010 | 403 | This team does not have access to that namespace. | -| 5011 | 409 | This user has already access to that namespace. | -| 5012 | 412 | The namespace is archived and can therefore only be accessed read only. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 5001 | 404 | The namspace does not exist. | +| 5003 | 403 | The user does not have access to the specified namespace. | +| 5006 | 400 | The namespace name cannot be empty. | +| 5009 | 403 | The user needs to have namespace read access to perform that action. | +| 5010 | 403 | This team does not have access to that namespace. | +| 5011 | 409 | This user has already access to that namespace. | +| 5012 | 412 | The namespace is archived and can therefore only be accessed read only. | ## Team -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------------------------------------------------------------| -| 6001 | 400 | The team name cannot be emtpy. | -| 6002 | 404 | The team does not exist. | -| 6004 | 409 | The team already has access to that namespace or list. | -| 6005 | 409 | The user is already a member of that team. | -| 6006 | 400 | Cannot delete the last team member. | -| 6007 | 403 | The team does not have access to the list to perform that action. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 6001 | 400 | The team name cannot be emtpy. | +| 6002 | 404 | The team does not exist. | +| 6004 | 409 | The team already has access to that namespace or list. | +| 6005 | 409 | The user is already a member of that team. | +| 6006 | 400 | Cannot delete the last team member. | +| 6007 | 403 | The team does not have access to the list to perform that action. | ## User List Access -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|---------------------------------------------| -| 7002 | 409 | The user already has access to that list. | -| 7003 | 403 | The user does not have access to that list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 7002 | 409 | The user already has access to that list. | +| 7003 | 403 | The user does not have access to that list. | ## Label -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|----------------------------------------------| -| 8001 | 403 | This label already exists on that task. | -| 8002 | 404 | The label does not exist. | -| 8003 | 403 | The user does not have access to this label. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 8001 | 403 | This label already exists on that task. | +| 8002 | 404 | The label does not exist. | +| 8003 | 403 | The user does not have access to this label. | ## Right -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-----------------------| -| 9001 | 403 | The right is invalid. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 9001 | 403 | The right is invalid. | ## Kanban -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-----------------------------------------------------------------------------------------------| -| 10001 | 404 | The bucket does not exist. | -| 10002 | 400 | The bucket does not belong to that list. | -| 10003 | 412 | You cannot remove the last bucket on a list. | -| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. | -| 10005 | 412 | There can be only one done bucket per list. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 10001 | 404 | The bucket does not exist. | +| 10002 | 400 | The bucket does not belong to that list. | +| 10003 | 412 | You cannot remove the last bucket on a list. | +| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. | +| 10005 | 412 | There can be only one done bucket per list. | ## Saved Filters -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|--------------------------------------------------| -| 11001 | 404 | The saved filter does not exist. | -| 11002 | 412 | Saved filters are not available for link shares. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 11001 | 404 | The saved filter does not exist. | +| 11002 | 412 | Saved filters are not available for link shares. | ## Subscriptions -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------------------------------------------------------------------| -| 12001 | 412 | The subscription entity type is invalid. | -| 12002 | 412 | The user is already subscribed to the entity itself or a parent entity. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 12001 | 412 | The subscription entity type is invalid. | +| 12002 | 412 | The user is already subscribed to the entity itself or a parent entity. | ## Link Shares -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|--------------------------------------------------------------------------------| -| 13001 | 412 | This link share requires a password for authentication, but none was provided. | -| 13002 | 403 | The provided link share password was invalid. | - -## Time Ranges - -| ErrorCode | HTTP Status Code | Description | -|-----------|------------------|-------------------------------------| -| 14001 | 412 | The provided time range is invalid. | +| ErrorCode | HTTP Status Code | Description | +|-----------|------------------|-------------| +| 13001 | 412 | This link share requires a password for authentication, but none was provided. | +| 13002 | 403 | The provided link share password was invalid. | diff --git a/pkg/modules/parse-time/errors.go b/pkg/modules/parse-time/errors.go deleted file mode 100644 index 197648411..000000000 --- a/pkg/modules/parse-time/errors.go +++ /dev/null @@ -1,51 +0,0 @@ -// Vikunja is a to-do list application to facilitate your life. -// Copyright 2018-2022 Vikunja and contributors. All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public Licensee as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public Licensee for more details. -// -// You should have received a copy of the GNU Affero General Public Licensee -// along with this program. If not, see . - -package parse_time - -import ( - "fmt" - "net/http" - - "code.vikunja.io/web" -) - -// ErrInvalidTimeRange represents a "InvalidTimeRange" kind of error. Used if the provided time range is invalid. -type ErrInvalidTimeRange struct { - Range string -} - -// IsErrInvalidTimeRange checks if an error is a ErrInvalidTimeRange. -func IsErrInvalidTimeRange(err error) bool { - _, ok := err.(*ErrInvalidTimeRange) - return ok -} - -func (err *ErrInvalidTimeRange) Error() string { - return fmt.Sprintf("Time range '%s' is invalid", err.Range) -} - -// ErrCodeInvalidTimeRange holds the unique world-error code of this error -const ErrCodeInvalidTimeRange = 14001 - -// HTTPError holds the http error description -func (err *ErrInvalidTimeRange) HTTPError() web.HTTPError { - return web.HTTPError{ - HTTPCode: http.StatusPreconditionFailed, - Code: ErrCodeInvalidTimeRange, - Message: "The time range is invalid.", - } -} diff --git a/pkg/modules/parse-time/parse.go b/pkg/modules/parse-time/parse.go deleted file mode 100644 index 2efbd167a..000000000 --- a/pkg/modules/parse-time/parse.go +++ /dev/null @@ -1,79 +0,0 @@ -// Vikunja is a to-do list application to facilitate your life. -// Copyright 2018-2022 Vikunja and contributors. All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public Licensee as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public Licensee for more details. -// -// You should have received a copy of the GNU Affero General Public Licensee -// along with this program. If not, see . - -package parse_time - -import ( - "strconv" - "strings" - "time" -) - -func ParseTimeRange(timeRange string) (from time.Time, to time.Time, err error) { - timeRange = strings.ReplaceAll(timeRange, " ", "") - - var parts []string - var factor int - if strings.Index(timeRange, "-") > 0 { - parts = strings.Split(timeRange, "-") - factor = -1 - } else { - parts = strings.Split(timeRange, "+") - factor = 1 - } - - if len(parts) != 2 { - return from, to, &ErrInvalidTimeRange{Range: timeRange} - } - - // Find the duration that is not "now" - var dur string - dur = parts[0] - if dur == "now" { - dur = parts[1] - } - - to = time.Now() - - var diff time.Duration - diff, err = parseTimeDuration(dur) - if err != nil { - return - } - - from = time.Now().Add(diff * time.Duration(factor)) - - // Make sure from is always before to - if to.Unix() < from.Unix() { - return to, from, nil - } - - return -} - -func parseTimeDuration(timeAmount string) (amount time.Duration, err error) { - if strings.Index(timeAmount, "d") > -1 { - var a int - a, err = strconv.Atoi(strings.ReplaceAll(timeAmount, "d", "")) - if err != nil { - return - } - - return time.Duration(a) * 24 * time.Hour, nil - } - - return time.ParseDuration(timeAmount) -} diff --git a/pkg/modules/parse-time/parse_test.go b/pkg/modules/parse-time/parse_test.go deleted file mode 100644 index 9ab3ca8c4..000000000 --- a/pkg/modules/parse-time/parse_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Vikunja is a to-do list application to facilitate your life. -// Copyright 2018-2022 Vikunja and contributors. All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public Licensee as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public Licensee for more details. -// -// You should have received a copy of the GNU Affero General Public Licensee -// along with this program. If not, see . - -package parse_time - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestParseTimeRange(t *testing.T) { - t.Run("last 7 days", func(t *testing.T) { - from, to, err := ParseTimeRange("now - 7d") - - assert.NoError(t, err) - assert.Equal(t, time.Now().Add(time.Hour*24*7*-1).Unix(), from.Unix()) - assert.Equal(t, time.Now().Unix(), to.Unix()) - }) - t.Run("last 7 days, but different", func(t *testing.T) { - from, to, err := ParseTimeRange("7d - now") - - assert.NoError(t, err) - assert.Equal(t, time.Now().Add(time.Hour*24*7*-1).Unix(), from.Unix()) - assert.Equal(t, time.Now().Unix(), to.Unix()) - }) - t.Run("last 24h", func(t *testing.T) { - from, to, err := ParseTimeRange("24h - now") - - assert.NoError(t, err) - assert.Equal(t, time.Now().Add(time.Hour*24*-1).Unix(), from.Unix()) - assert.Equal(t, time.Now().Unix(), to.Unix()) - }) - t.Run("next 7 days", func(t *testing.T) { - from, to, err := ParseTimeRange("now + 7d") - - assert.NoError(t, err) - assert.Equal(t, time.Now().Unix(), from.Unix()) - assert.Equal(t, time.Now().Add(time.Hour*24*7).Unix(), to.Unix()) - }) - t.Run("next 24h", func(t *testing.T) { - from, to, err := ParseTimeRange("now + 24h") - - assert.NoError(t, err) - assert.Equal(t, time.Now().Unix(), from.Unix()) - assert.Equal(t, time.Now().Add(time.Hour*24).Unix(), to.Unix()) - }) - t.Run("range with only now", func(t *testing.T) { - _, _, err := ParseTimeRange("now") - assert.Error(t, err) - assert.True(t, IsErrInvalidTimeRange(err)) - }) - t.Run("range with only one duration part", func(t *testing.T) { - _, _, err := ParseTimeRange("7d") - assert.Error(t, err) - assert.True(t, IsErrInvalidTimeRange(err)) - }) - t.Run("invalid date range", func(t *testing.T) { - _, _, err := ParseTimeRange("now-7y") - assert.Error(t, err) - }) -} -- 2.45.1 From 389a1f89602ef19bc9d014db1a18572287c3df74 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 8 Jan 2022 22:18:33 +0100 Subject: [PATCH 4/7] chore: update swagger docs --- pkg/models/task_collection.go | 2 +- pkg/swagger/docs.go | 2 +- pkg/swagger/swagger.json | 2 +- pkg/swagger/swagger.yaml | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/models/task_collection.go b/pkg/models/task_collection.go index 70be8d744..f6a22a121 100644 --- a/pkg/models/task_collection.go +++ b/pkg/models/task_collection.go @@ -131,7 +131,7 @@ func getTaskFilterOptsFromCollection(tf *TaskCollection) (opts *taskOptions, err // @Param sort_by query string false "The sorting parameter. You can pass this multiple times to get the tasks ordered by multiple different parametes, along with `order_by`. Possible values to sort by are `id`, `title`, `description`, `done`, `done_at`, `due_date`, `created_by_id`, `list_id`, `repeat_after`, `priority`, `start_date`, `end_date`, `hex_color`, `percent_done`, `uid`, `created`, `updated`. Default is `id`." // @Param order_by query string false "The ordering parameter. Possible values to order by are `asc` or `desc`. Default is `asc`." // @Param filter_by query string false "The name of the field to filter by. Allowed values are all task properties. Task properties which are their own object require passing in the id of that entity. Accepts an array for multiple filters which will be chanied together, all supplied filter must match." -// @Param filter_value query string false "The value to filter for." +// @Param filter_value query string false "The value to filter for. You can use [grafana](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls)- or [elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/common-options.html#date-math)-style relative dates for all date fields like `due_date`, `start_date`, `end_date`, etc." // @Param filter_comparator query string false "The comparator to use for a filter. Available values are `equals`, `greater`, `greater_equals`, `less`, `less_equals`, `like` and `in`. `in` expects comma-separated values in `filter_value`. Defaults to `equals`" // @Param filter_concat query string false "The concatinator to use for filters. Available values are `and` or `or`. Defaults to `or`." // @Param filter_include_nulls query string false "If set to true the result will include filtered fields whose value is set to `null`. Available values are `true` or `false`. Defaults to `false`." diff --git a/pkg/swagger/docs.go b/pkg/swagger/docs.go index ca64c34a2..ab411d3ff 100644 --- a/pkg/swagger/docs.go +++ b/pkg/swagger/docs.go @@ -1995,7 +1995,7 @@ var doc = `{ }, { "type": "string", - "description": "The value to filter for.", + "description": "The value to filter for. You can use [grafana](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls)- or [elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/common-options.html#date-math)-style relative dates for all date fields like ` + "`" + `due_date` + "`" + `, ` + "`" + `start_date` + "`" + `, ` + "`" + `end_date` + "`" + `, etc.", "name": "filter_value", "in": "query" }, diff --git a/pkg/swagger/swagger.json b/pkg/swagger/swagger.json index 2e5d604a3..01a96a8a0 100644 --- a/pkg/swagger/swagger.json +++ b/pkg/swagger/swagger.json @@ -1979,7 +1979,7 @@ }, { "type": "string", - "description": "The value to filter for.", + "description": "The value to filter for. You can use [grafana](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls)- or [elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/common-options.html#date-math)-style relative dates for all date fields like `due_date`, `start_date`, `end_date`, etc.", "name": "filter_value", "in": "query" }, diff --git a/pkg/swagger/swagger.yaml b/pkg/swagger/swagger.yaml index 5f72c4ce6..b3e1849a5 100644 --- a/pkg/swagger/swagger.yaml +++ b/pkg/swagger/swagger.yaml @@ -2898,7 +2898,10 @@ paths: in: query name: filter_by type: string - - description: The value to filter for. + - description: The value to filter for. You can use [grafana](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls)- + or [elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/common-options.html#date-math)-style + relative dates for all date fields like `due_date`, `start_date`, `end_date`, + etc. in: query name: filter_value type: string -- 2.45.1 From df7e3b13bcdc2bb2ba7734fa89170fcb355ff3e8 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 8 Jan 2022 22:19:14 +0100 Subject: [PATCH 5/7] fix: lint --- pkg/integrations/task_collection_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/integrations/task_collection_test.go b/pkg/integrations/task_collection_test.go index e1e11e811..28eaef004 100644 --- a/pkg/integrations/task_collection_test.go +++ b/pkg/integrations/task_collection_test.go @@ -17,11 +17,12 @@ package integrations import ( + "net/url" + "testing" + "code.vikunja.io/api/pkg/models" "code.vikunja.io/web/handler" "github.com/stretchr/testify/assert" - "net/url" - "testing" ) func TestTaskCollection(t *testing.T) { -- 2.45.1 From fbc856eb6c633a04ac84f14a6d3c5710611e1efa Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 27 Mar 2022 17:57:02 +0200 Subject: [PATCH 6/7] chore: go mod tidy --- go.mod | 2 +- go.sum | 82 ---------------------------------------------------------- 2 files changed, 1 insertion(+), 83 deletions(-) diff --git a/go.mod b/go.mod index 449ccebb6..9c8729e8e 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/swaggo/swag v1.8.0 github.com/tkuchiki/go-timezone v0.2.2 github.com/ulule/limiter/v3 v3.9.0 - github.com/vectordotdev/go-datemath v0.1.1-0.20211214182920-0a4ac8742b93 // indirect + github.com/vectordotdev/go-datemath v0.1.1-0.20211214182920-0a4ac8742b93 github.com/yuin/goldmark v1.4.8 golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 golang.org/x/image v0.0.0-20220302094943-723b81ca9867 diff --git a/go.sum b/go.sum index 3d290f8b1..008a8ca01 100644 --- a/go.sum +++ b/go.sum @@ -268,8 +268,6 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= @@ -507,10 +505,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/echo/v4 v4.6.3 h1:VhPuIZYxsbPmo4m9KAkMU/el2442eB7EBFFhNTTT9ac= -github.com/labstack/echo/v4 v4.6.3/go.mod h1:Hk5OiHj0kDqmFq7aHe7eDqI7CUhuCrfpupQtLGGLm7A= -github.com/labstack/echo/v4 v4.7.0 h1:8wHgZhoE9OT1NSLw6sfrX7ZGpWMtO5Zlfr68+BIo180= -github.com/labstack/echo/v4 v4.7.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/echo/v4 v4.7.1 h1:7Z5z97gRAiTVimeA5Kt2maIudKB52XJNGoYm7bK4cUk= github.com/labstack/echo/v4 v4.7.1/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -568,10 +562,6 @@ github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71 github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk= -github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.11 h1:gt+cp9c0XGqe9S/wAHTL3n/7MqY+siPWgWJgqdsFrzQ= -github.com/mattn/go-sqlite3 v1.14.11/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= @@ -659,10 +649,7 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -675,7 +662,6 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= @@ -684,7 +670,6 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -725,8 +710,6 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= -github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.8.1 h1:izYHOT71f9iZ7iq37Uqjael60/vYC6vMtzedudZ0zEk= github.com/spf13/afero v1.8.1/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -753,16 +736,11 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/swaggo/swag v1.7.8 h1:w249t0l/kc/DKMGlS0fppNJQxKyJ8heNaUWB6nsH3zc= -github.com/swaggo/swag v1.7.8/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU= -github.com/swaggo/swag v1.7.9 h1:6vCG5mm43ebDzGlZPMGYrYI4zKFfOr5kicQX8qjeDwc= -github.com/swaggo/swag v1.7.9/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU= github.com/swaggo/swag v1.8.0 h1:80NNhvpJcuItNpBDqgJwDuKlMmaZ/OATOzhG3bhcM3w= github.com/swaggo/swag v1.8.0/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= @@ -806,14 +784,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs= -github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= -github.com/yuin/goldmark v1.4.5 h1:4OEQwtW2uLXjEdgnGM3Vg652Pq37X7NOIRzFWb3BzIc= -github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= -github.com/yuin/goldmark v1.4.6 h1:EQ1OkiNq/eMbQxs/2O/A8VDIHERXGH14s19ednd4XIw= -github.com/yuin/goldmark v1.4.6/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= -github.com/yuin/goldmark v1.4.7 h1:KHHlQL4EKBZ43vpA1KBEQHfodk4JeIgeb0xJLg7rvDI= -github.com/yuin/goldmark v1.4.7/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark v1.4.8 h1:zHPiabbIRssZOI0MAzJDHsyvG4MXCGqVaMOwR+HeoQQ= github.com/yuin/goldmark v1.4.8/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= @@ -861,28 +831,6 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220126173729-e04a8579fee6 h1:8ZK1PPFZfmuQq6F/bjLKoKOODiEqGvMCh63FG6V8IbY= -golang.org/x/crypto v0.0.0-20220126173729-e04a8579fee6/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8 h1:kACShD3qhmr/3rLmg1yXyt+N4HcwutKyPRB93s54TIU= -golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed h1:YoWVYYAfvQ4ddHv3OKmIvX7NCAhFGTj62VP2l2kfBbA= -golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE= -golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab h1:lnZ4LoV0UMdibeCUfIB2a4uFwRu491WX/VB2reB8xNc= -golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220208233918-bba287dce954 h1:BkypuErRT9A9I/iljuaG3/zdMjd/J6m8tKKJQtGfSdA= -golang.org/x/crypto v0.0.0-20220208233918-bba287dce954/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220209155544-dad33157f4bf h1:gdgmgieTI2lLaGI2N+xEiaCMUgo2XFmAS0rlF8HZoso= -golang.org/x/crypto v0.0.0-20220209155544-dad33157f4bf/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220209195652-db638375bc3a h1:atOEWVSedO4ksXBe/UrlbSLVxQQ9RxM/tT2Jy10IaHo= -golang.org/x/crypto v0.0.0-20220209195652-db638375bc3a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220210151621-f4118a5b28e2 h1:XdAboW3BNMv9ocSCOk/u1MFioZGzCNkiJZ19v9Oe3Ig= -golang.org/x/crypto v0.0.0-20220210151621-f4118a5b28e2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -898,8 +846,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -984,10 +930,8 @@ golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1007,10 +951,7 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1115,30 +1056,7 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a h1:ppl5mZgokTT8uPkmYOyEUmPTr3ypaKkg5eFOGrAmxxE= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220207234003-57398862261d h1:Bm7BNOQt2Qv7ZqysjeLjgCBanX+88Z/OtdvsrEv1Djc= -golang.org/x/sys v0.0.0-20220207234003-57398862261d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220222172238-00053529121e h1:AGLQ2aegkB2Y9RY8YdQk+7MDCW9da7YmizIwNIt8NtQ= -golang.org/x/sys v0.0.0-20220222172238-00053529121e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= -golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220224003255-dbe011f71a99 h1:Us899Z5PCfOrSgeCYWobI1/bSigAz9Rhf8+fz5Grkzc= -golang.org/x/sys v0.0.0-20220224003255-dbe011f71a99/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 h1:BXxu8t6QN0G1uff4bzZzSkpsax8+ALqTGUtz08QrV00= -golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220307203707-22a9840ba4d7 h1:8IVLkfbr2cLhv0a/vKq4UFUcJym8RmDoDboxCFWEjYE= -golang.org/x/sys v0.0.0-20220307203707-22a9840ba4d7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -- 2.45.1 From c19158f964141ad1e6d7eee000a3699c72f9b5fc Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 27 Mar 2022 21:22:36 +0200 Subject: [PATCH 7/7] chore: go mod tidy --- go.sum | 60 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/go.sum b/go.sum index 008a8ca01..0d53dc01a 100644 --- a/go.sum +++ b/go.sum @@ -86,7 +86,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -193,7 +193,6 @@ github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPO github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -207,14 +206,12 @@ github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmx github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.13.0 h1:20dgTiUSfxRB/EhMPtxcL9ZEbM1ZdR+W/7f7NWD+xWo= +github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= @@ -245,8 +242,9 @@ github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvSc github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= @@ -268,8 +266,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -345,6 +343,7 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -471,7 +470,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= @@ -484,7 +482,7 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/kolaente/caldav-go v3.0.1-0.20190524174923-9e5cd1688227+incompatible h1:PkEEpmbrFXlMul8cOplR8nkcIM/NDbx+H6fq2+vaKAA= github.com/kolaente/caldav-go v3.0.1-0.20190524174923-9e5cd1688227+incompatible/go.mod h1:y1UhTNI4g0hVymJrI6yJ5/ohy09hNBeU8iJEZjgdDOw= @@ -505,8 +503,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/echo/v4 v4.7.1 h1:7Z5z97gRAiTVimeA5Kt2maIudKB52XJNGoYm7bK4cUk= -github.com/labstack/echo/v4 v4.7.1/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= +github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI= +github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= @@ -524,8 +522,8 @@ github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/shortuuid/v3 v3.0.4 h1:uj4xhotfY92Y1Oa6n6HUiFn87CdoEHYUlTy0+IgbLrs= github.com/lithammer/shortuuid/v3 v3.0.4/go.mod h1:RviRjexKqIzx/7r1peoAITm6m7gnif/h+0zmolKJjzw= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magefile/mage v1.12.1 h1:oGdAbhIUd6iKamKlDGVtU6XGdy5SgNuCWn7gCTgHDtU= -github.com/magefile/mage v1.12.1/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.13.0 h1:XtLJl8bcCM7EFoO8FyH8XK3t7G5hQAeK+i4tq+veT9M= +github.com/magefile/mage v1.13.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -604,15 +602,19 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= @@ -710,8 +712,8 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.1 h1:izYHOT71f9iZ7iq37Uqjael60/vYC6vMtzedudZ0zEk= -github.com/spf13/afero v1.8.1/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -748,19 +750,18 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/tkuchiki/go-timezone v0.2.2 h1:MdHR65KwgVTwWFQrota4SKzc4L5EfuH5SdZZGtk/P2Q= github.com/tkuchiki/go-timezone v0.2.2/go.mod h1:oFweWxYl35C/s7HMVZXiA19Jr9Y0qJHMaG/J2TES4LY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulule/limiter/v3 v3.9.0 h1:ebASTkd6QNNUGhuDrWqImMpsg9GtItgNgxF3nKao58Q= -github.com/ulule/limiter/v3 v3.9.0/go.mod h1:icWc7rrF3T07dj59AhU4+HqKh0uWeh1wKct31wmcoF0= +github.com/ulule/limiter/v3 v3.10.0 h1:C9mx3tgxYnt4pUYKWktZf7aEOVPbRYxR+onNFjQTEp0= +github.com/ulule/limiter/v3 v3.10.0/go.mod h1:NqPA/r8QfP7O11iC+95X6gcWJPtRWjKrtOUw07BTvoo= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -777,7 +778,6 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -831,6 +831,7 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -926,15 +927,15 @@ golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1057,6 +1058,7 @@ golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1316,8 +1318,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/d4l3k/messagediff.v1 v1.2.1 h1:70AthpjunwzUiarMHyED52mj9UwtAnE89l1Gmrt3EU0= gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -- 2.45.1