From e006ff589854ab3d3eebeb2a1778477fd315905e Mon Sep 17 00:00:00 2001 From: Reza Mobaraki Date: Tue, 24 Sep 2024 14:30:22 +0330 Subject: [PATCH 1/2] fix: date, date-time filter Signed-off-by: Reza Mobaraki --- pkg/query_builder/mysql/filter.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pkg/query_builder/mysql/filter.go b/pkg/query_builder/mysql/filter.go index a6457a9a..adaea097 100644 --- a/pkg/query_builder/mysql/filter.go +++ b/pkg/query_builder/mysql/filter.go @@ -1,11 +1,28 @@ package mysqlquerybuilder -import "fmt" +import ( + "fmt" + "reflect" + "time" +) +const DateFormat = "2006-01-02" + +func isTimeType(value interface{}) bool { + return reflect.TypeOf(value) == reflect.TypeOf(time.Time{}) +} + +// BuildFilterQuery constructs the query and handles datetime fields func BuildFilterQuery(filter map[string]interface{}) (filterQuery string, args []any) { for key, value := range filter { - filterQuery += fmt.Sprintf("AND %s = ? ", key) - args = append(args, value) + if isTimeType(value) { + filterQuery += fmt.Sprintf("AND DATE(%s) = ? ", key) + dateValue := value.(time.Time).Format(DateFormat) + args = append(args, dateValue) + } else { + filterQuery += fmt.Sprintf("AND %s = ? ", key) + args = append(args, value) + } } return filterQuery, args From cc53a7ddc8c3ddf04fd5f701f70c3569436b4f1d Mon Sep 17 00:00:00 2001 From: Reza Mobaraki Date: Tue, 24 Sep 2024 15:32:55 +0330 Subject: [PATCH 2/2] fix(BuildFilterQuery): use regex to validate date and date time Signed-off-by: Reza Mobaraki --- pkg/query_builder/mysql/filter.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/query_builder/mysql/filter.go b/pkg/query_builder/mysql/filter.go index adaea097..4e2ff088 100644 --- a/pkg/query_builder/mysql/filter.go +++ b/pkg/query_builder/mysql/filter.go @@ -2,23 +2,20 @@ package mysqlquerybuilder import ( "fmt" - "reflect" - "time" + "regexp" ) -const DateFormat = "2006-01-02" +var datePattern = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}Z)?$`) -func isTimeType(value interface{}) bool { - return reflect.TypeOf(value) == reflect.TypeOf(time.Time{}) +func isValidDateOrDateTime(value string) bool { + return datePattern.MatchString(value) } -// BuildFilterQuery constructs the query and handles datetime fields func BuildFilterQuery(filter map[string]interface{}) (filterQuery string, args []any) { for key, value := range filter { - if isTimeType(value) { + if strVal, ok := value.(string); ok && isValidDateOrDateTime(strVal) { filterQuery += fmt.Sprintf("AND DATE(%s) = ? ", key) - dateValue := value.(time.Time).Format(DateFormat) - args = append(args, dateValue) + args = append(args, strVal) } else { filterQuery += fmt.Sprintf("AND %s = ? ", key) args = append(args, value)