diff --git a/app/notification.go b/app/notification.go index a234542fb2..ab6ebb8a36 100644 --- a/app/notification.go +++ b/app/notification.go @@ -141,8 +141,8 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod } if len(m.OtherPotentialMentions) > 0 && !post.IsSystemMessage() { - if profilesResult := <-a.Srv.Store.User().GetProfilesByUsernames(m.OtherPotentialMentions, &model.ViewUsersRestrictions{Teams: []string{team.Id}}); profilesResult.Err == nil { - channelMentions := model.UserSlice(profilesResult.Data.([]*model.User)).FilterByActive(true) + if users, err := a.Srv.Store.User().GetProfilesByUsernames(m.OtherPotentialMentions, &model.ViewUsersRestrictions{Teams: []string{team.Id}}); err == nil { + channelMentions := model.UserSlice(users).FilterByActive(true) var outOfChannelMentions model.UserSlice var outOfGroupsMentions model.UserSlice diff --git a/app/user.go b/app/user.go index f43d49574f..fadb8819ee 100644 --- a/app/user.go +++ b/app/user.go @@ -625,11 +625,11 @@ func (a *App) GetUsersByGroupChannelIds(channelIds []string, asAdmin bool) (map[ } func (a *App) GetUsersByUsernames(usernames []string, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - result := <-a.Srv.Store.User().GetProfilesByUsernames(usernames, viewRestrictions) - if result.Err != nil { - return nil, result.Err + users, err := a.Srv.Store.User().GetProfilesByUsernames(usernames, viewRestrictions) + if err != nil { + return nil, err } - return a.sanitizeProfiles(result.Data.([]*model.User), asAdmin), nil + return a.sanitizeProfiles(users, asAdmin), nil } func (a *App) sanitizeProfiles(users []*model.User, asAdmin bool) []*model.User { diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index eb71f1b652..d53955afae 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -719,32 +719,28 @@ func (us SqlUserStore) GetProfilesWithoutTeam(offset int, limit int, viewRestric }) } -func (us SqlUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := us.usersQuery +func (us SqlUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { + query := us.usersQuery - query = applyViewRestrictionsFilter(query, viewRestrictions, true) + query = applyViewRestrictionsFilter(query, viewRestrictions, true) - query = query. - Where(map[string]interface{}{ - "Username": usernames, - }). - OrderBy("u.Username ASC") + query = query. + Where(map[string]interface{}{ + "Username": usernames, + }). + OrderBy("u.Username ASC") - queryString, args, err := query.ToSql() - if err != nil { - result.Err = model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } + queryString, args, err := query.ToSql() + if err != nil { + return nil, model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + } - var users []*model.User - if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - result.Err = model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } + var users []*model.User + if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { + return nil, model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } - result.Data = users - }) + return users, nil } type UserWithLastActivityAt struct { diff --git a/store/store.go b/store/store.go index df7e018465..8f50e71c79 100644 --- a/store/store.go +++ b/store/store.go @@ -268,7 +268,7 @@ type UserStore interface { GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) GetProfilesWithoutTeam(offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) StoreChannel - GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) StoreChannel + GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) GetProfileByIds(userIds []string, options *UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) diff --git a/store/storetest/mocks/UserStore.go b/store/storetest/mocks/UserStore.go index 051eb25cca..ea399aec69 100644 --- a/store/storetest/mocks/UserStore.go +++ b/store/storetest/mocks/UserStore.go @@ -560,19 +560,28 @@ func (_m *UserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, } // GetProfilesByUsernames provides a mock function with given fields: usernames, viewRestrictions -func (_m *UserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) store.StoreChannel { +func (_m *UserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { ret := _m.Called(usernames, viewRestrictions) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func([]string, *model.ViewUsersRestrictions) store.StoreChannel); ok { + var r0 []*model.User + if rf, ok := ret.Get(0).(func([]string, *model.ViewUsersRestrictions) []*model.User); ok { r0 = rf(usernames, viewRestrictions) } 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, *model.ViewUsersRestrictions) *model.AppError); ok { + r1 = rf(usernames, viewRestrictions) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // GetProfilesInChannel provides a mock function with given fields: channelId, offset, limit diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index f4e4b7e1dc..0dec6d2555 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -1372,33 +1372,33 @@ func testUserStoreGetProfilesByUsernames(t *testing.T, ss store.Store) { defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() t.Run("get by u1 and u2 usernames, team id 1", func(t *testing.T) { - result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) - require.Nil(t, result.Err) - assert.Equal(t, []*model.User{u1, u2}, result.Data.([]*model.User)) + users, err := ss.User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) + require.Nil(t, err) + assert.Equal(t, []*model.User{u1, u2}, users) }) t.Run("get by u1 username, team id 1", func(t *testing.T) { - result := <-ss.User().GetProfilesByUsernames([]string{u1.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) - require.Nil(t, result.Err) - assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User)) + users, err := ss.User().GetProfilesByUsernames([]string{u1.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) + require.Nil(t, err) + assert.Equal(t, []*model.User{u1}, users) }) t.Run("get by u1 and u3 usernames, no team id", func(t *testing.T) { - result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, nil) - require.Nil(t, result.Err) - assert.Equal(t, []*model.User{u1, u3}, result.Data.([]*model.User)) + users, err := ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, nil) + require.Nil(t, err) + assert.Equal(t, []*model.User{u1, u3}, users) }) t.Run("get by u1 and u3 usernames, team id 1", func(t *testing.T) { - result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) - require.Nil(t, result.Err) - assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User)) + users, err := ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) + require.Nil(t, err) + assert.Equal(t, []*model.User{u1}, users) }) t.Run("get by u1 and u3 usernames, team id 2", func(t *testing.T) { - result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{team2Id}}) - require.Nil(t, result.Err) - assert.Equal(t, []*model.User{u3}, result.Data.([]*model.User)) + users, err := ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{team2Id}}) + require.Nil(t, err) + assert.Equal(t, []*model.User{u3}, users) }) }