diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index c25245a9b4..25df0284b3 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -1933,41 +1933,65 @@ func (s SqlChannelStore) GetAllChannelMembersForUser(userId string, allowFromCac s.metrics.IncrementMemCacheMissCounter("All Channel Members for User") } - var deletedClause string - if !includeDeleted { - deletedClause = "Channels.DeleteAt = 0 AND" + failure := func(err error) *model.AppError { + // TODO: This error key would go away once this store method is migrated to return plain errors + return model.NewAppError( + "SqlChannelStore.GetAllChannelMembersForUser", + "app.channel.get_channels.get.app_error", + nil, + "userId="+userId+", err="+err.Error(), + http.StatusInternalServerError, + ) } - var data allChannelMembers - _, err := s.GetReplica().Select(&data, ` - SELECT - ChannelMembers.ChannelId, ChannelMembers.Roles, - ChannelMembers.SchemeGuest, ChannelMembers.SchemeUser, ChannelMembers.SchemeAdmin, + query := s.getQueryBuilder(). + Select(` + ChannelMembers.ChannelId, ChannelMembers.Roles, ChannelMembers.SchemeGuest, + ChannelMembers.SchemeUser, ChannelMembers.SchemeAdmin, TeamScheme.DefaultChannelGuestRole TeamSchemeDefaultGuestRole, TeamScheme.DefaultChannelUserRole TeamSchemeDefaultUserRole, TeamScheme.DefaultChannelAdminRole TeamSchemeDefaultAdminRole, ChannelScheme.DefaultChannelGuestRole ChannelSchemeDefaultGuestRole, ChannelScheme.DefaultChannelUserRole ChannelSchemeDefaultUserRole, ChannelScheme.DefaultChannelAdminRole ChannelSchemeDefaultAdminRole - FROM - ChannelMembers - INNER JOIN - Channels ON ChannelMembers.ChannelId = Channels.Id - LEFT JOIN - Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id - LEFT JOIN - Teams ON Channels.TeamId = Teams.Id - LEFT JOIN - Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id - WHERE - `+deletedClause+` - ChannelMembers.UserId = :UserId`, map[string]interface{}{"UserId": userId}) - + `). + From("ChannelMembers"). + Join("Channels ON ChannelMembers.ChannelId = Channels.Id"). + LeftJoin("Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id"). + LeftJoin("Teams ON Channels.TeamId = Teams.Id"). + LeftJoin("Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id"). + Where(sq.Eq{"ChannelMembers.UserId": userId}) + if !includeDeleted { + query = query.Where(sq.Eq{"Channels.DeleteAt": 0}) + } + queryString, args, err := query.ToSql() if err != nil { - // TODO: This error key would go away once this store method is migrated to return plain errors - return nil, model.NewAppError("SqlChannelStore.GetAllChannelMembersForUser", "app.channel.get_channels.get.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError) + return nil, failure(err) } + rows, err := s.GetReplica().Db.Query(queryString, args...) + if err != nil { + return nil, failure(err) + } + + var data allChannelMembers + defer rows.Close() + for rows.Next() { + var cm allChannelMember + err = rows.Scan( + &cm.ChannelId, &cm.Roles, &cm.SchemeGuest, &cm.SchemeUser, + &cm.SchemeAdmin, &cm.TeamSchemeDefaultGuestRole, &cm.TeamSchemeDefaultUserRole, + &cm.TeamSchemeDefaultAdminRole, &cm.ChannelSchemeDefaultGuestRole, + &cm.ChannelSchemeDefaultUserRole, &cm.ChannelSchemeDefaultAdminRole, + ) + if err != nil { + return nil, failure(err) + } + data = append(data, cm) + } + if err = rows.Err(); err != nil { + return nil, failure(err) + } ids := data.ToMapStringString() if allowFromCache { diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index 1542d7a333..c94c15e0cb 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -3152,17 +3152,26 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) { require.Nil(t, nErr) require.Equal(t, o1.Id, (*list)[0].Id, "missing channel") - ids, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false) + ids, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false) + require.Nil(t, err) _, ok := ids[o1.Id] require.True(t, ok, "missing channel") - ids2, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false) + ids2, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false) + require.Nil(t, err) _, ok = ids2[o1.Id] require.True(t, ok, "missing channel") - ids3, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false) + ids3, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false) + require.Nil(t, err) _, ok = ids3[o1.Id] require.True(t, ok, "missing channel") + + ids4, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, true) + require.Nil(t, err) + _, ok = ids4[o1.Id] + require.True(t, ok, "missing channel") + require.True( t, ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id),