MM-44088: Add teamID filter to channelMembers (#20176)
We add 2 new params to channel members query. 1. Filter by teamId. 2. Negate that filter. We include some more optimizations like: - Moved the team role checks inside the dataloader. - Moved the channel pretty name computation inside the loader. Now that we load less data on initial load, we can reduce the concurrency requirement to be a bit on the safer side. ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
5ac3dbf058
Коммит
a6d8e45297
@@ -4438,6 +4438,14 @@ func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
_, err := ss.Team().Save(&t1)
|
||||
require.NoError(t, err)
|
||||
|
||||
t2 := model.Team{}
|
||||
t2.DisplayName = "Team2"
|
||||
t2.Name = NewTestId()
|
||||
t2.Email = MakeEmail()
|
||||
t2.Type = model.TeamOpen
|
||||
_, err = ss.Team().Save(&t2)
|
||||
require.NoError(t, err)
|
||||
|
||||
o1 := model.Channel{}
|
||||
o1.TeamId = t1.Id
|
||||
o1.DisplayName = "Channel1"
|
||||
@@ -4454,6 +4462,14 @@ func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
_, nErr = ss.Channel().Save(&o2, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
o3 := model.Channel{}
|
||||
o3.TeamId = t2.Id
|
||||
o3.DisplayName = "Channel3"
|
||||
o3.Name = NewTestId()
|
||||
o3.Type = model.ChannelTypeOpen
|
||||
_, nErr = ss.Channel().Save(&o3, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
m1 := model.ChannelMember{}
|
||||
m1.ChannelId = o1.Id
|
||||
m1.UserId = model.NewId()
|
||||
@@ -4468,15 +4484,29 @@ func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
_, err = ss.Channel().SaveMember(&m2)
|
||||
require.NoError(t, err)
|
||||
|
||||
m3 := model.ChannelMember{}
|
||||
m3.ChannelId = o3.Id
|
||||
m3.UserId = m1.UserId
|
||||
m3.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m3)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("with channels", func(t *testing.T) {
|
||||
var members model.ChannelMembers
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 1, 0)
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 1,
|
||||
}
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 1)
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 3, 0)
|
||||
opts.Limit = 3
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 2)
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[0].ChannelId, m1.UserId, 1, 0)
|
||||
assert.Len(t, members, 3)
|
||||
opts.AfterChannel = members[0].ChannelId
|
||||
opts.AfterUser = m1.UserId
|
||||
opts.Limit = 1
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 1)
|
||||
})
|
||||
@@ -4495,15 +4525,41 @@ func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
_, nErr = ss.Channel().CreateDirectChannel(&u3, &u4)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 10, 0)
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
}
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 4)
|
||||
assert.Len(t, members, 5)
|
||||
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 2, 0)
|
||||
opts.Limit = 2
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[1].ChannelId, m1.UserId, 2, 0)
|
||||
opts.AfterChannel = members[1].ChannelId
|
||||
opts.AfterUser = m1.UserId
|
||||
opts.Limit = 2
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
})
|
||||
|
||||
t.Run("for a specific team", func(t *testing.T) {
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
}
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, t2.Id, opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 3)
|
||||
})
|
||||
|
||||
t.Run("excluding a team", func(t *testing.T) {
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
ExcludeTeam: true,
|
||||
}
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, t2.Id, opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
})
|
||||
@@ -4529,17 +4585,24 @@ func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
_, err = ss.Channel().SaveMember(cm)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
members, err := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 10, 0)
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
}
|
||||
members, err := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 5)
|
||||
assert.Len(t, members, 6)
|
||||
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 2, 0)
|
||||
opts.Limit = 2
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[1].ChannelId, m1.UserId, 10, 0)
|
||||
opts.AfterChannel = members[1].ChannelId
|
||||
opts.AfterUser = m1.UserId
|
||||
opts.Limit = 10
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 3)
|
||||
assert.Len(t, members, 4)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1165,13 +1165,13 @@ func (_m *ChannelStore) GetMembersForUser(teamID string, userID string) (model.C
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMembersForUserWithCursor provides a mock function with given fields: userID, afterChannel, afterUser, limit, lastUpdateAt
|
||||
func (_m *ChannelStore) GetMembersForUserWithCursor(userID string, afterChannel string, afterUser string, limit int, lastUpdateAt int) (model.ChannelMembers, error) {
|
||||
ret := _m.Called(userID, afterChannel, afterUser, limit, lastUpdateAt)
|
||||
// GetMembersForUserWithCursor provides a mock function with given fields: userID, teamID, opts
|
||||
func (_m *ChannelStore) GetMembersForUserWithCursor(userID string, teamID string, opts *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error) {
|
||||
ret := _m.Called(userID, teamID, opts)
|
||||
|
||||
var r0 model.ChannelMembers
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, int, int) model.ChannelMembers); ok {
|
||||
r0 = rf(userID, afterChannel, afterUser, limit, lastUpdateAt)
|
||||
if rf, ok := ret.Get(0).(func(string, string, *store.ChannelMemberGraphQLSearchOpts) model.ChannelMembers); ok {
|
||||
r0 = rf(userID, teamID, opts)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(model.ChannelMembers)
|
||||
@@ -1179,8 +1179,8 @@ func (_m *ChannelStore) GetMembersForUserWithCursor(userID string, afterChannel
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string, string, string, int, int) error); ok {
|
||||
r1 = rf(userID, afterChannel, afterUser, limit, lastUpdateAt)
|
||||
if rf, ok := ret.Get(1).(func(string, string, *store.ChannelMemberGraphQLSearchOpts) error); ok {
|
||||
r1 = rf(userID, teamID, opts)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user