diff --git a/app/user.go b/app/user.go index c10d825df7..b825340320 100644 --- a/app/user.go +++ b/app/user.go @@ -1685,11 +1685,10 @@ func (a *App) SearchUsersInChannel(channelId string, term string, options *model func (a *App) SearchUsersNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { term = strings.TrimSpace(term) - result := <-a.Srv.Store.User().SearchNotInChannel(teamId, channelId, term, options) - if result.Err != nil { - return nil, result.Err + users, err := a.Srv.Store.User().SearchNotInChannel(teamId, channelId, term, options) + if err != nil { + return nil, err } - users := result.Data.([]*model.User) for _, user := range users { a.SanitizeProfile(user, options.IsAdmin) @@ -1851,7 +1850,12 @@ func (a *App) AutocompleteUsersInChannel(teamId string, channelId string, term s close(uchan) }() - nuchan := a.Srv.Store.User().SearchNotInChannel(teamId, channelId, term, options) + nuchan := make(chan store.StoreResult, 1) + go func() { + users, err := a.Srv.Store.User().SearchNotInChannel(teamId, channelId, term, options) + nuchan <- store.StoreResult{Data: users, Err: err} + close(nuchan) + }() result := <-uchan if result.Err != nil { diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index df044c3a47..51c1edd5a0 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -1273,24 +1273,26 @@ func (us SqlUserStore) SearchNotInTeam(notInTeamId string, term string, options return result.Data.([]*model.User), nil } -func (us SqlUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := us.usersQuery. - LeftJoin("ChannelMembers cm ON ( cm.UserId = u.Id AND cm.ChannelId = ? )", channelId). - Where("cm.UserId IS NULL"). - OrderBy("Username ASC"). - Limit(uint64(options.Limit)) +func (us SqlUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { + query := us.usersQuery. + LeftJoin("ChannelMembers cm ON ( cm.UserId = u.Id AND cm.ChannelId = ? )", channelId). + Where("cm.UserId IS NULL"). + OrderBy("Username ASC"). + Limit(uint64(options.Limit)) - if teamId != "" { - query = query.Join("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 AND tm.TeamId = ? )", teamId) - } + if teamId != "" { + query = query.Join("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 AND tm.TeamId = ? )", teamId) + } - if options.GroupConstrained { - query = applyChannelGroupConstrainedFilter(query, channelId) - } + if options.GroupConstrained { + query = applyChannelGroupConstrainedFilter(query, channelId) + } - *result = us.performSearch(query, term, options) - }) + result := us.performSearch(query, term, options) + if result.Err != nil { + return nil, result.Err + } + return result.Data.([]*model.User), nil } func (us SqlUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { diff --git a/store/store.go b/store/store.go index c21ce251c4..5d97dbc852 100644 --- a/store/store.go +++ b/store/store.go @@ -291,7 +291,7 @@ type UserStore interface { Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) StoreChannel + SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) AnalyticsGetSystemAdminCount() (int64, *model.AppError) diff --git a/store/storetest/mocks/UserStore.go b/store/storetest/mocks/UserStore.go index 26c5e93aa2..ba2cedc077 100644 --- a/store/storetest/mocks/UserStore.go +++ b/store/storetest/mocks/UserStore.go @@ -881,19 +881,28 @@ func (_m *UserStore) SearchInChannel(channelId string, term string, options *mod } // SearchNotInChannel provides a mock function with given fields: teamId, channelId, term, options -func (_m *UserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) store.StoreChannel { +func (_m *UserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { ret := _m.Called(teamId, channelId, term, options) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string, string, string, *model.UserSearchOptions) store.StoreChannel); ok { + var r0 []*model.User + if rf, ok := ret.Get(0).(func(string, string, string, *model.UserSearchOptions) []*model.User); ok { r0 = rf(teamId, channelId, term, options) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).([]*model.User) } } - return r0 + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string, string, string, *model.UserSearchOptions) *model.AppError); ok { + r1 = rf(teamId, channelId, term, options) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // SearchNotInTeam provides a mock function with given fields: notInTeamId, term, options diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index 306934e6a9..77d7680295 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -2669,14 +2669,14 @@ func testUserStoreSearchNotInChannel(t *testing.T, ss store.Store) { for _, testCase := range testCases { t.Run(testCase.Description, func(t *testing.T) { - result := <-ss.User().SearchNotInChannel( + users, err := ss.User().SearchNotInChannel( testCase.TeamId, testCase.ChannelId, testCase.Term, testCase.Options, ) - require.Nil(t, result.Err) - assertUsers(t, testCase.Expected, result.Data.([]*model.User)) + require.Nil(t, err) + assertUsers(t, testCase.Expected, users) }) } }