From 8aadd5bba0a58cd926fa2d03fabe5bfa2039d260 Mon Sep 17 00:00:00 2001 From: Rohil Surana Date: Wed, 27 May 2026 15:00:02 +0530 Subject: [PATCH 1/3] fix: handle in/notin operators in token search filters --- internal/store/postgres/org_tokens_repository.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/store/postgres/org_tokens_repository.go b/internal/store/postgres/org_tokens_repository.go index 88111b1d8..5c474c59a 100644 --- a/internal/store/postgres/org_tokens_repository.go +++ b/internal/store/postgres/org_tokens_repository.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "fmt" + "strings" "github.com/doug-martin/goqu/v9" "github.com/jmoiron/sqlx" @@ -166,6 +167,10 @@ func (r OrgTokensRepository) addFilter(query *goqu.SelectDataset, filter rql.Fil case "like", "notlike": value := "%" + filter.Value.(string) + "%" return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: value}}), nil + case "in": + return query.Where(goqu.Cast(goqu.I(field), "TEXT").In(strings.Split(filter.Value.(string), ","))), nil + case "notin": + return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotIn(strings.Split(filter.Value.(string), ","))), nil default: return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: filter.Value}}), nil } From 3aba0ed145f0de0900335e16ffc38b761c9e3a13 Mon Sep 17 00:00:00 2001 From: Rohil Surana Date: Wed, 27 May 2026 15:39:34 +0530 Subject: [PATCH 2/3] fix: trim and sanitize in/notin filter values --- internal/store/postgres/org_tokens_repository.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/store/postgres/org_tokens_repository.go b/internal/store/postgres/org_tokens_repository.go index 5c474c59a..648ec0dbb 100644 --- a/internal/store/postgres/org_tokens_repository.go +++ b/internal/store/postgres/org_tokens_repository.go @@ -168,9 +168,21 @@ func (r OrgTokensRepository) addFilter(query *goqu.SelectDataset, filter rql.Fil value := "%" + filter.Value.(string) + "%" return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: value}}), nil case "in": - return query.Where(goqu.Cast(goqu.I(field), "TEXT").In(strings.Split(filter.Value.(string), ","))), nil + values := make([]string, 0) + for _, v := range strings.Split(filter.Value.(string), ",") { + if trimmed := strings.TrimSpace(v); trimmed != "" { + values = append(values, trimmed) + } + } + return query.Where(goqu.Cast(goqu.I(field), "TEXT").In(values)), nil case "notin": - return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotIn(strings.Split(filter.Value.(string), ","))), nil + values := make([]string, 0) + for _, v := range strings.Split(filter.Value.(string), ",") { + if trimmed := strings.TrimSpace(v); trimmed != "" { + values = append(values, trimmed) + } + } + return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotIn(values)), nil default: return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: filter.Value}}), nil } From a26e49761defb7e37f08fa1117c61165018da938 Mon Sep 17 00:00:00 2001 From: Rohil Surana Date: Fri, 29 May 2026 12:57:29 +0530 Subject: [PATCH 3/3] refactor: fold in/notin filter cases into single branch --- internal/store/postgres/org_tokens_repository.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/internal/store/postgres/org_tokens_repository.go b/internal/store/postgres/org_tokens_repository.go index 648ec0dbb..660b5abed 100644 --- a/internal/store/postgres/org_tokens_repository.go +++ b/internal/store/postgres/org_tokens_repository.go @@ -167,22 +167,14 @@ func (r OrgTokensRepository) addFilter(query *goqu.SelectDataset, filter rql.Fil case "like", "notlike": value := "%" + filter.Value.(string) + "%" return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: value}}), nil - case "in": + case "in", "notin": values := make([]string, 0) for _, v := range strings.Split(filter.Value.(string), ",") { if trimmed := strings.TrimSpace(v); trimmed != "" { values = append(values, trimmed) } } - return query.Where(goqu.Cast(goqu.I(field), "TEXT").In(values)), nil - case "notin": - values := make([]string, 0) - for _, v := range strings.Split(filter.Value.(string), ",") { - if trimmed := strings.TrimSpace(v); trimmed != "" { - values = append(values, trimmed) - } - } - return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotIn(values)), nil + return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: values}}), nil default: return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: filter.Value}}), nil }