From 3896c680d35382be891f48b64ce0451411336f4e Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 11 Mar 2024 14:36:59 +0100 Subject: [PATCH] fix(filters): do not require string for in comparator --- frontend/src/views/project/settings/delete.vue | 2 +- pkg/models/task_collection_filter.go | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/project/settings/delete.vue b/frontend/src/views/project/settings/delete.vue index 059099bdb..86980a942 100644 --- a/frontend/src/views/project/settings/delete.vue +++ b/frontend/src/views/project/settings/delete.vue @@ -63,7 +63,7 @@ watchEffect( } const taskService = new TaskService() - taskService.getAll({}, {filter: `project in '${childProjectIds.value.join(',')}'`}).then(() => { + taskService.getAll({}, {filter: `project in ${childProjectIds.value.join(',')}`}).then(() => { totalTasks.value = taskService.totalPages * taskService.resultCount }) }, diff --git a/pkg/models/task_collection_filter.go b/pkg/models/task_collection_filter.go index 0e69fb2f9..3195fa4df 100644 --- a/pkg/models/task_collection_filter.go +++ b/pkg/models/task_collection_filter.go @@ -19,6 +19,7 @@ package models import ( "fmt" "reflect" + "regexp" "strconv" "strings" "time" @@ -153,6 +154,18 @@ func getTaskFiltersFromFilterString(filter string) (filters []*taskFilter, err e filter = strings.ReplaceAll(filter, " in ", " ?= ") + // Replaces all occurences with in with a string so that it passes the filter + pattern := `\?=\s+([^&|]+)` + re := regexp.MustCompile(pattern) + + filter = re.ReplaceAllStringFunc(filter, func(match string) string { + value := strings.TrimSpace(strings.TrimPrefix(match, "?=")) + value = strings.ReplaceAll(value, "'", `\'`) + enclosedValue := "'" + value + "'" + + return "?= " + enclosedValue + }) + parsedFilter, err := fexpr.Parse(filter) if err != nil { return nil, &ErrInvalidFilterExpression{ @@ -242,7 +255,7 @@ func getValueForField(field reflect.StructField, rawValue string) (value interfa // In that case we don't really care about what the actual type is, we just cast the value to an // int64 since we need the id - yes, this assumes we only ever have int64 IDs, but this is fine. if field.Type.Elem().Kind() == reflect.Ptr { - value, err = strconv.ParseInt(rawValue, 10, 64) + value, err = strconv.ParseInt(strings.TrimSpace(rawValue), 10, 64) return }