GraphQL (part 1): Store layer (#19465)
We add the necessary store methods to use GraphQL ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e9a777f4e2
Коммит
a733fb840d
@@ -22,6 +22,7 @@ func TestChannelMemberHistoryStore(t *testing.T, ss store.Store) {
|
||||
t.Run("TestGetUsersInChannelAtChannelMembers", func(t *testing.T) { testGetUsersInChannelAtChannelMembers(t, ss) })
|
||||
t.Run("TestPermanentDeleteBatch", func(t *testing.T) { testPermanentDeleteBatch(t, ss) })
|
||||
t.Run("TestPermanentDeleteBatchForRetentionPolicies", func(t *testing.T) { testPermanentDeleteBatchForRetentionPolicies(t, ss) })
|
||||
t.Run("TestGetChannelsLeftSince", func(t *testing.T) { testGetChannelsLeftSince(t, ss) })
|
||||
}
|
||||
|
||||
func testLogJoinEvent(t *testing.T, ss store.Store) {
|
||||
@@ -29,7 +30,7 @@ func testLogJoinEvent(t *testing.T, ss store.Store) {
|
||||
ch := model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: "Display " + model.NewId(),
|
||||
Name: "zz" + model.NewId() + "b",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channel, err := ss.Channel().Save(&ch, -1)
|
||||
@@ -55,7 +56,7 @@ func testLogLeaveEvent(t *testing.T, ss store.Store) {
|
||||
ch := model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: "Display " + model.NewId(),
|
||||
Name: "zz" + model.NewId() + "b",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channel, err := ss.Channel().Save(&ch, -1)
|
||||
@@ -84,7 +85,7 @@ func testGetUsersInChannelAtChannelMemberHistory(t *testing.T, ss store.Store) {
|
||||
ch := &model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: "Display " + model.NewId(),
|
||||
Name: "zz" + model.NewId() + "b",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channel, err := ss.Channel().Save(ch, -1)
|
||||
@@ -180,7 +181,7 @@ func testGetUsersInChannelAtChannelMembers(t *testing.T, ss store.Store) {
|
||||
channel := &model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: "Display " + model.NewId(),
|
||||
Name: "zz" + model.NewId() + "b",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channel, err := ss.Channel().Save(channel, -1)
|
||||
@@ -292,7 +293,7 @@ func testPermanentDeleteBatch(t *testing.T, ss store.Store) {
|
||||
channel := &model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: "Display " + model.NewId(),
|
||||
Name: "zz" + model.NewId() + "b",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channel, err := ss.Channel().Save(channel, -1)
|
||||
@@ -389,3 +390,54 @@ func testPermanentDeleteBatchForRetentionPolicies(t *testing.T, ss store.Store)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, result, "history should have been deleted by channel policy")
|
||||
}
|
||||
|
||||
func testGetChannelsLeftSince(t *testing.T, ss store.Store) {
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
userID := model.NewId()
|
||||
|
||||
joinTime := int64(1000)
|
||||
err = ss.ChannelMemberHistory().LogJoinEvent(userID, channel.Id, joinTime)
|
||||
require.NoError(t, err)
|
||||
|
||||
// has not left
|
||||
ids, err := ss.ChannelMemberHistory().GetChannelsLeftSince(userID, joinTime)
|
||||
require.NoError(t, err)
|
||||
assert.Empty(t, ids)
|
||||
|
||||
// left
|
||||
err = ss.ChannelMemberHistory().LogLeaveEvent(userID, channel.Id, joinTime+100)
|
||||
require.NoError(t, err)
|
||||
ids, err = ss.ChannelMemberHistory().GetChannelsLeftSince(userID, joinTime+100)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []string{channel.Id}, ids)
|
||||
ids, err = ss.ChannelMemberHistory().GetChannelsLeftSince(userID, joinTime+200)
|
||||
require.NoError(t, err)
|
||||
assert.Empty(t, ids)
|
||||
|
||||
// joined and left again.
|
||||
err = ss.ChannelMemberHistory().LogJoinEvent(userID, channel.Id, joinTime+200)
|
||||
require.NoError(t, err)
|
||||
err = ss.ChannelMemberHistory().LogLeaveEvent(userID, channel.Id, joinTime+300)
|
||||
require.NoError(t, err)
|
||||
// should be same for both time stamps
|
||||
ids, err = ss.ChannelMemberHistory().GetChannelsLeftSince(userID, joinTime+100)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []string{channel.Id}, ids)
|
||||
ids, err = ss.ChannelMemberHistory().GetChannelsLeftSince(userID, joinTime+300)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []string{channel.Id}, ids)
|
||||
}
|
||||
|
||||
@@ -79,6 +79,7 @@ func TestChannelStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("RemoveMembers", func(t *testing.T) { testChannelRemoveMembers(t, ss) })
|
||||
t.Run("ChannelDeleteMemberStore", func(t *testing.T) { testChannelDeleteMemberStore(t, ss) })
|
||||
t.Run("GetChannels", func(t *testing.T) { testChannelStoreGetChannels(t, ss) })
|
||||
t.Run("GetChannelsWithCursor", func(t *testing.T) { testChannelStoreGetChannelsWithCursor(t, ss) })
|
||||
t.Run("GetChannelsByUser", func(t *testing.T) { testChannelStoreGetChannelsByUser(t, ss) })
|
||||
t.Run("GetAllChannels", func(t *testing.T) { testChannelStoreGetAllChannels(t, ss, s) })
|
||||
t.Run("GetMoreChannels", func(t *testing.T) { testChannelStoreGetMoreChannels(t, ss) })
|
||||
@@ -87,6 +88,7 @@ func TestChannelStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("GetPublicChannelsByIdsForTeam", func(t *testing.T) { testChannelStoreGetPublicChannelsByIdsForTeam(t, ss) })
|
||||
t.Run("GetChannelCounts", func(t *testing.T) { testChannelStoreGetChannelCounts(t, ss) })
|
||||
t.Run("GetMembersForUser", func(t *testing.T) { testChannelStoreGetMembersForUser(t, ss) })
|
||||
t.Run("GetMembersForUserWithCursor", func(t *testing.T) { testChannelStoreGetMembersForUserWithCursor(t, ss) })
|
||||
t.Run("GetMembersForUserWithPagination", func(t *testing.T) { testChannelStoreGetMembersForUserWithPagination(t, ss) })
|
||||
t.Run("CountPostsAfter", func(t *testing.T) { testCountPostsAfter(t, ss) })
|
||||
t.Run("UpdateLastViewedAt", func(t *testing.T) { testChannelStoreUpdateLastViewedAt(t, ss) })
|
||||
@@ -105,6 +107,7 @@ func TestChannelStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("SearchAllChannels", func(t *testing.T) { testChannelStoreSearchAllChannels(t, ss) })
|
||||
t.Run("GetMembersByIds", func(t *testing.T) { testChannelStoreGetMembersByIds(t, ss) })
|
||||
t.Run("GetMembersByChannelIds", func(t *testing.T) { testChannelStoreGetMembersByChannelIds(t, ss) })
|
||||
t.Run("GetMembersInfoByChannelIds", func(t *testing.T) { testChannelStoreGetMembersInfoByChannelIds(t, ss) })
|
||||
t.Run("SearchGroupChannels", func(t *testing.T) { testChannelStoreSearchGroupChannels(t, ss) })
|
||||
t.Run("AnalyticsDeletedTypeCount", func(t *testing.T) { testChannelStoreAnalyticsDeletedTypeCount(t, ss) })
|
||||
t.Run("GetPinnedPosts", func(t *testing.T) { testChannelStoreGetPinnedPosts(t, ss) })
|
||||
@@ -719,7 +722,10 @@ func testChannelStoreDelete(t *testing.T, ss store.Store) {
|
||||
nErr = ss.Channel().Delete(o3.Id, model.GetMillis())
|
||||
require.NoError(t, nErr, nErr)
|
||||
|
||||
list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
|
||||
list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 1, "invalid number of channels")
|
||||
|
||||
@@ -730,7 +736,10 @@ func testChannelStoreDelete(t *testing.T, ss store.Store) {
|
||||
cresult := ss.Channel().PermanentDelete(o2.Id)
|
||||
require.NoError(t, cresult)
|
||||
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
})
|
||||
if assert.Error(t, nErr) {
|
||||
var nfErr *store.ErrNotFound
|
||||
require.True(t, errors.As(nErr, &nfErr))
|
||||
@@ -3263,12 +3272,13 @@ func testChannelDeleteMemberStore(t *testing.T, ss store.Store) {
|
||||
|
||||
func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
team := model.NewId()
|
||||
o1 := model.Channel{}
|
||||
o1 := &model.Channel{}
|
||||
o1.TeamId = team
|
||||
o1.DisplayName = "Channel1"
|
||||
o1.Name = NewTestId()
|
||||
o1.Type = model.ChannelTypeOpen
|
||||
_, nErr := ss.Channel().Save(&o1, -1)
|
||||
var nErr error
|
||||
o1, nErr = ss.Channel().Save(o1, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
o2 := model.Channel{}
|
||||
@@ -3315,7 +3325,10 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
_, err = ss.Channel().SaveMember(&m4)
|
||||
require.NoError(t, err)
|
||||
|
||||
list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
|
||||
list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 3)
|
||||
require.Equal(t, o1.Id, list[0].Id, "missing channel")
|
||||
@@ -3342,6 +3355,25 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
_, ok = ids4[o1.Id]
|
||||
require.True(t, ok, "missing channel")
|
||||
|
||||
// Sleeping to guarantee that the
|
||||
// UpdateAt is different.
|
||||
// The proper way would be to set UpdateAt during channel creation itself,
|
||||
// but the *Channel.PreSave method ignores any existing CreateAt value.
|
||||
// TODO: check if using an existing CreateAt breaks anything.
|
||||
time.Sleep(time.Millisecond)
|
||||
|
||||
now := model.GetMillis()
|
||||
_, nErr = ss.Channel().Update(o1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastUpdateAt: int(now),
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
// should return 1
|
||||
require.Len(t, list, 1)
|
||||
|
||||
nErr = ss.Channel().Delete(o2.Id, 10)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
@@ -3349,13 +3381,19 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// should return 1
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 1)
|
||||
require.Equal(t, o1.Id, list[0].Id, "missing channel")
|
||||
|
||||
// Should return all
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 0)
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 0,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 3)
|
||||
require.Equal(t, o1.Id, list[0].Id, "missing channel")
|
||||
@@ -3363,7 +3401,10 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
require.Equal(t, o3.Id, list[2].Id, "missing channel")
|
||||
|
||||
// Should still return all
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 10)
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 10,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 3)
|
||||
require.Equal(t, o1.Id, list[0].Id, "missing channel")
|
||||
@@ -3371,7 +3412,10 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
require.Equal(t, o3.Id, list[2].Id, "missing channel")
|
||||
|
||||
// Should return 2
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 20)
|
||||
list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 20,
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 2)
|
||||
require.Equal(t, o1.Id, list[0].Id, "missing channel")
|
||||
@@ -3399,6 +3443,147 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
|
||||
ss.Channel().InvalidateAllChannelMembersForUser(m1.UserId)
|
||||
}
|
||||
|
||||
func testChannelStoreGetChannelsWithCursor(t *testing.T, ss store.Store) {
|
||||
teamID := model.NewId()
|
||||
o1 := &model.Channel{}
|
||||
o1.TeamId = teamID
|
||||
o1.DisplayName = "Channel1"
|
||||
o1.Name = NewTestId()
|
||||
o1.Type = model.ChannelTypeOpen
|
||||
var nErr error
|
||||
o1, nErr = ss.Channel().Save(o1, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
o2 := model.Channel{}
|
||||
o2.TeamId = teamID
|
||||
o2.DisplayName = "Channel2"
|
||||
o2.Name = NewTestId()
|
||||
o2.Type = model.ChannelTypeOpen
|
||||
_, nErr = ss.Channel().Save(&o2, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
o3 := model.Channel{}
|
||||
o3.TeamId = teamID
|
||||
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()
|
||||
m1.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err := ss.Channel().SaveMember(&m1)
|
||||
require.NoError(t, err)
|
||||
|
||||
m2 := model.ChannelMember{}
|
||||
m2.ChannelId = o1.Id
|
||||
m2.UserId = model.NewId()
|
||||
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m2)
|
||||
require.NoError(t, err)
|
||||
|
||||
m3 := model.ChannelMember{}
|
||||
m3.ChannelId = o2.Id
|
||||
m3.UserId = m1.UserId
|
||||
m3.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m3)
|
||||
require.NoError(t, err)
|
||||
|
||||
m4 := model.ChannelMember{}
|
||||
m4.ChannelId = o3.Id
|
||||
m4.UserId = m1.UserId
|
||||
m4.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m4)
|
||||
require.NoError(t, err)
|
||||
|
||||
list, nErr := ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
PerPage: model.NewInt(2),
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 2)
|
||||
require.Equal(t, teamID, list[0].TeamId, "incorrect teamID")
|
||||
require.Equal(t, teamID, list[1].TeamId, "incorrect teamID")
|
||||
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
PerPage: model.NewInt(2),
|
||||
}, list[1].Id)
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 1)
|
||||
require.Equal(t, teamID, list[0].TeamId, "incorrect teamID")
|
||||
|
||||
// Sleeping to guarantee that the
|
||||
// UpdateAt is different.
|
||||
// The proper way would be to set UpdateAt during channel creation itself,
|
||||
// but the *Channel.PreSave method ignores any existing CreateAt value.
|
||||
// TODO: check if using an existing CreateAt breaks anything.
|
||||
time.Sleep(time.Millisecond)
|
||||
|
||||
now := model.GetMillis()
|
||||
_, nErr = ss.Channel().Update(o1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastUpdateAt: int(now),
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
// should return 1
|
||||
require.Len(t, list, 1)
|
||||
|
||||
nErr = ss.Channel().Delete(o2.Id, 10)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
nErr = ss.Channel().Delete(o3.Id, 20)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// should return 1
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 1)
|
||||
|
||||
// Should return all
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 0,
|
||||
PerPage: model.NewInt(2),
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 2)
|
||||
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 0,
|
||||
PerPage: model.NewInt(2),
|
||||
}, list[1].Id)
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 1)
|
||||
|
||||
// Should still return all
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 10,
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 3)
|
||||
|
||||
// Should return 2
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: true,
|
||||
LastDeleteAt: 20,
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 2)
|
||||
}
|
||||
|
||||
func testChannelStoreGetChannelsByUser(t *testing.T, ss store.Store) {
|
||||
team := model.NewId()
|
||||
team2 := model.NewId()
|
||||
@@ -4191,6 +4376,120 @@ func testChannelStoreGetMembersForUser(t *testing.T, ss store.Store) {
|
||||
})
|
||||
}
|
||||
|
||||
func testChannelStoreGetMembersForUserWithCursor(t *testing.T, ss store.Store) {
|
||||
t1 := model.Team{}
|
||||
t1.DisplayName = "Team1"
|
||||
t1.Name = NewTestId()
|
||||
t1.Email = MakeEmail()
|
||||
t1.Type = model.TeamOpen
|
||||
_, err := ss.Team().Save(&t1)
|
||||
require.NoError(t, err)
|
||||
|
||||
o1 := model.Channel{}
|
||||
o1.TeamId = t1.Id
|
||||
o1.DisplayName = "Channel1"
|
||||
o1.Name = NewTestId()
|
||||
o1.Type = model.ChannelTypeOpen
|
||||
_, nErr := ss.Channel().Save(&o1, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
o2 := model.Channel{}
|
||||
o2.TeamId = o1.TeamId
|
||||
o2.DisplayName = "Channel2"
|
||||
o2.Name = NewTestId()
|
||||
o2.Type = model.ChannelTypeOpen
|
||||
_, nErr = ss.Channel().Save(&o2, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
m1 := model.ChannelMember{}
|
||||
m1.ChannelId = o1.Id
|
||||
m1.UserId = model.NewId()
|
||||
m1.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m1)
|
||||
require.NoError(t, err)
|
||||
|
||||
m2 := model.ChannelMember{}
|
||||
m2.ChannelId = o2.Id
|
||||
m2.UserId = m1.UserId
|
||||
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||
_, err = ss.Channel().SaveMember(&m2)
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 1)
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 3, 0)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 2)
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[0].ChannelId, m1.UserId, 1, 0)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 1)
|
||||
})
|
||||
|
||||
t.Run("with channels and direct messages", func(t *testing.T) {
|
||||
user := model.User{Id: m1.UserId}
|
||||
u1 := model.User{Id: model.NewId()}
|
||||
u2 := model.User{Id: model.NewId()}
|
||||
u3 := model.User{Id: model.NewId()}
|
||||
u4 := model.User{Id: model.NewId()}
|
||||
_, nErr = ss.Channel().CreateDirectChannel(&u1, &user)
|
||||
require.NoError(t, nErr)
|
||||
_, nErr = ss.Channel().CreateDirectChannel(&u2, &user)
|
||||
require.NoError(t, nErr)
|
||||
// other user direct message
|
||||
_, nErr = ss.Channel().CreateDirectChannel(&u3, &u4)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 10, 0)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 4)
|
||||
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 2, 0)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[1].ChannelId, m1.UserId, 2, 0)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
})
|
||||
|
||||
t.Run("with channels, direct channels and group messages", func(t *testing.T) {
|
||||
userIds := []string{model.NewId(), model.NewId(), model.NewId(), m1.UserId}
|
||||
group := &model.Channel{
|
||||
Name: model.GetGroupNameFromUserIds(userIds),
|
||||
DisplayName: "test",
|
||||
Type: model.ChannelTypeGroup,
|
||||
}
|
||||
var channel *model.Channel
|
||||
channel, nErr = ss.Channel().Save(group, 10000)
|
||||
require.NoError(t, nErr)
|
||||
for _, userId := range userIds {
|
||||
cm := &model.ChannelMember{
|
||||
UserId: userId,
|
||||
ChannelId: channel.Id,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
SchemeUser: true,
|
||||
}
|
||||
|
||||
_, err = ss.Channel().SaveMember(cm)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
members, err := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 10, 0)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 5)
|
||||
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", "", 2, 0)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, members[1].ChannelId, m1.UserId, 10, 0)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 3)
|
||||
})
|
||||
}
|
||||
|
||||
func testChannelStoreGetMembersForUserWithPagination(t *testing.T, ss store.Store) {
|
||||
t1 := model.Team{
|
||||
DisplayName: "team1",
|
||||
@@ -6072,6 +6371,62 @@ func testChannelStoreGetMembersByChannelIds(t *testing.T, ss store.Store) {
|
||||
})
|
||||
}
|
||||
|
||||
func testChannelStoreGetMembersInfoByChannelIds(t *testing.T, ss store.Store) {
|
||||
u, err := ss.User().Save(&model.User{
|
||||
Username: "user.test",
|
||||
Email: MakeEmail(),
|
||||
Nickname: model.NewId(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create a couple channels and add the user to them
|
||||
channel1, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: model.NewId(),
|
||||
Name: model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
channel2, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: model.NewId(),
|
||||
DisplayName: model.NewId(),
|
||||
Name: model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Channel().SaveMember(&model.ChannelMember{
|
||||
ChannelId: channel1.Id,
|
||||
UserId: u.Id,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Channel().SaveMember(&model.ChannelMember{
|
||||
ChannelId: channel2.Id,
|
||||
UserId: u.Id,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("should return the user's members for the given channels", func(t *testing.T) {
|
||||
result, nErr := ss.Channel().GetMembersInfoByChannelIds([]string{channel1.Id, channel2.Id})
|
||||
require.NoError(t, nErr)
|
||||
assert.Len(t, result, 2)
|
||||
for _, item := range result {
|
||||
assert.Len(t, item, 1)
|
||||
assert.Equal(t, u.Id, item[0].Id)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("should not error or return anything for invalid channel IDs", func(t *testing.T) {
|
||||
_, err := ss.Channel().GetMembersInfoByChannelIds([]string{model.NewId(), model.NewId()})
|
||||
var nfErr *store.ErrNotFound
|
||||
require.True(t, errors.As(err, &nfErr))
|
||||
})
|
||||
}
|
||||
|
||||
func testChannelStoreSearchGroupChannels(t *testing.T, ss store.Store) {
|
||||
// Users
|
||||
u1 := &model.User{}
|
||||
|
||||
@@ -35,6 +35,29 @@ func (_m *ChannelMemberHistoryStore) DeleteOrphanedRows(limit int) (int64, error
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetChannelsLeftSince provides a mock function with given fields: userID, since
|
||||
func (_m *ChannelMemberHistoryStore) GetChannelsLeftSince(userID string, since int64) ([]string, error) {
|
||||
ret := _m.Called(userID, since)
|
||||
|
||||
var r0 []string
|
||||
if rf, ok := ret.Get(0).(func(string, int64) []string); ok {
|
||||
r0 = rf(userID, since)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]string)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string, int64) error); ok {
|
||||
r1 = rf(userID, since)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetUsersInChannelDuring provides a mock function with given fields: startTime, endTime, channelID
|
||||
func (_m *ChannelMemberHistoryStore) GetUsersInChannelDuring(startTime int64, endTime int64, channelID string) ([]*model.ChannelMemberHistoryResult, error) {
|
||||
ret := _m.Called(startTime, endTime, channelID)
|
||||
|
||||
@@ -674,13 +674,13 @@ func (_m *ChannelStore) GetChannelUnread(channelID string, userID string) (*mode
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetChannels provides a mock function with given fields: teamID, userID, includeDeleted, lastDeleteAt
|
||||
func (_m *ChannelStore) GetChannels(teamID string, userID string, includeDeleted bool, lastDeleteAt int) (model.ChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, includeDeleted, lastDeleteAt)
|
||||
// GetChannels provides a mock function with given fields: teamID, userID, opts
|
||||
func (_m *ChannelStore) GetChannels(teamID string, userID string, opts *model.ChannelSearchOpts) (model.ChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, opts)
|
||||
|
||||
var r0 model.ChannelList
|
||||
if rf, ok := ret.Get(0).(func(string, string, bool, int) model.ChannelList); ok {
|
||||
r0 = rf(teamID, userID, includeDeleted, lastDeleteAt)
|
||||
if rf, ok := ret.Get(0).(func(string, string, *model.ChannelSearchOpts) model.ChannelList); ok {
|
||||
r0 = rf(teamID, userID, opts)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(model.ChannelList)
|
||||
@@ -688,8 +688,8 @@ func (_m *ChannelStore) GetChannels(teamID string, userID string, includeDeleted
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string, string, bool, int) error); ok {
|
||||
r1 = rf(teamID, userID, includeDeleted, lastDeleteAt)
|
||||
if rf, ok := ret.Get(1).(func(string, string, *model.ChannelSearchOpts) error); ok {
|
||||
r1 = rf(teamID, userID, opts)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
@@ -789,6 +789,29 @@ func (_m *ChannelStore) GetChannelsByUser(userID string, includeDeleted bool, la
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetChannelsWithCursor provides a mock function with given fields: teamId, userId, opts, afterChannelID
|
||||
func (_m *ChannelStore) GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error) {
|
||||
ret := _m.Called(teamId, userId, opts, afterChannelID)
|
||||
|
||||
var r0 model.ChannelList
|
||||
if rf, ok := ret.Get(0).(func(string, string, *model.ChannelSearchOpts, string) model.ChannelList); ok {
|
||||
r0 = rf(teamId, userId, opts, afterChannelID)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(model.ChannelList)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string, string, *model.ChannelSearchOpts, string) error); ok {
|
||||
r1 = rf(teamId, userId, opts, afterChannelID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetChannelsWithTeamDataByIds provides a mock function with given fields: channelIds, includeDeleted
|
||||
func (_m *ChannelStore) GetChannelsWithTeamDataByIds(channelIds []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
||||
ret := _m.Called(channelIds, includeDeleted)
|
||||
@@ -1121,6 +1144,29 @@ 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)
|
||||
|
||||
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)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(model.ChannelMembers)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string, string, string, int, int) error); ok {
|
||||
r1 = rf(userID, afterChannel, afterUser, limit, lastUpdateAt)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMembersForUserWithPagination provides a mock function with given fields: userID, page, perPage
|
||||
func (_m *ChannelStore) GetMembersForUserWithPagination(userID string, page int, perPage int) (model.ChannelMembersWithTeamData, error) {
|
||||
ret := _m.Called(userID, page, perPage)
|
||||
@@ -1144,6 +1190,29 @@ func (_m *ChannelStore) GetMembersForUserWithPagination(userID string, page int,
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMembersInfoByChannelIds provides a mock function with given fields: channelIDs
|
||||
func (_m *ChannelStore) GetMembersInfoByChannelIds(channelIDs []string) (map[string][]*model.User, error) {
|
||||
ret := _m.Called(channelIDs)
|
||||
|
||||
var r0 map[string][]*model.User
|
||||
if rf, ok := ret.Get(0).(func([]string) map[string][]*model.User); ok {
|
||||
r0 = rf(channelIDs)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(map[string][]*model.User)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func([]string) error); ok {
|
||||
r1 = rf(channelIDs)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMoreChannels provides a mock function with given fields: teamID, userID, offset, limit
|
||||
func (_m *ChannelStore) GetMoreChannels(teamID string, userID string, offset int, limit int) (model.ChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, offset, limit)
|
||||
|
||||
Ссылка в новой задаче
Block a user