From c076f73a87bc9b39b17389e25d0186ab71aa24bf Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Oct 2022 17:39:04 +0200 Subject: [PATCH] fix: make sure user searches are always case-insensitive See https://kolaente.dev/vikunja/frontend/issues/2196#issuecomment-33698 Resolves https://github.com/go-vikunja/frontend/issues/29 --- pkg/user/user_test.go | 10 ++++++++++ pkg/user/users_list.go | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pkg/user/user_test.go b/pkg/user/user_test.go index 785e94544b6..8f3a9ac5b42 100644 --- a/pkg/user/user_test.go +++ b/pkg/user/user_test.go @@ -369,6 +369,16 @@ func TestListUsers(t *testing.T) { assert.True(t, len(all) > 0) assert.Equal(t, all[0].Username, "user1") }) + t.Run("case insensitive", func(t *testing.T) { + db.LoadAndAssertFixtures(t) + s := db.NewSession() + defer s.Close() + + all, err := ListUsers(s, "uSEr1", nil) + assert.NoError(t, err) + assert.True(t, len(all) > 0) + assert.Equal(t, all[0].Username, "user1") + }) t.Run("all users", func(t *testing.T) { db.LoadAndAssertFixtures(t) s := db.NewSession() diff --git a/pkg/user/users_list.go b/pkg/user/users_list.go index b2dac2c9323..296e490244d 100644 --- a/pkg/user/users_list.go +++ b/pkg/user/users_list.go @@ -19,8 +19,11 @@ package user import ( "strings" + "code.vikunja.io/api/pkg/db" + "xorm.io/builder" "xorm.io/xorm" + "xorm.io/xorm/schemas" ) type ListUserOpts struct { @@ -45,14 +48,22 @@ func ListUsers(s *xorm.Session, search string, opts *ListUserOpts) (users []*Use if search != "" { for _, queryPart := range strings.Split(search, ",") { + var usernameCond builder.Cond = builder.Eq{"username": queryPart} + if db.Type() == schemas.POSTGRES { + usernameCond = builder.Expr("username ILIKE ?", queryPart) + } + if db.Type() == schemas.SQLITE { + usernameCond = builder.Expr("username = ? COLLATE NOCASE", queryPart) + } + conds = append(conds, - builder.Eq{"username": queryPart}, + usernameCond, builder.And( builder.Eq{"email": queryPart}, builder.Eq{"discoverable_by_email": true}, ), builder.And( - builder.Like{"name", "%" + queryPart + "%"}, + db.ILIKE("name", queryPart), builder.Eq{"discoverable_by_name": true}, ), )