коммит произвёл
GitHub
родитель
d172ff1881
Коммит
3dd9e3715c
@@ -294,7 +294,7 @@ func generateLayer(name, templateFile string) ([]byte, error) {
|
||||
switch param.Type {
|
||||
case "ChannelSearchOpts", "UserGetByIdsOpts", "ThreadMembershipOpts":
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s store.%s", param.Name, param.Type))
|
||||
case "*UserGetByIdsOpts", "*ChannelMemberGraphQLSearchOpts", "*SidebarCategorySearchOpts":
|
||||
case "*UserGetByIdsOpts", "*SidebarCategorySearchOpts":
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s *store.%s", param.Name, strings.TrimPrefix(param.Type, "*")))
|
||||
default:
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s %s", param.Name, param.Type))
|
||||
@@ -308,7 +308,7 @@ func generateLayer(name, templateFile string) ([]byte, error) {
|
||||
switch param.Type {
|
||||
case "ChannelSearchOpts", "UserGetByIdsOpts", "ThreadMembershipOpts":
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s store.%s", param.Name, param.Type))
|
||||
case "*UserGetByIdsOpts", "*ChannelMemberGraphQLSearchOpts", "*SidebarCategorySearchOpts":
|
||||
case "*UserGetByIdsOpts", "*SidebarCategorySearchOpts":
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s *store.%s", param.Name, strings.TrimPrefix(param.Type, "*")))
|
||||
default:
|
||||
paramsWithType = append(paramsWithType, fmt.Sprintf("%s %s", param.Name, param.Type))
|
||||
|
||||
@@ -1333,24 +1333,6 @@ func (s *OpenTracingLayerChannelStore) GetChannelsMemberCount(channelIDs []strin
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerChannelStore) GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.GetChannelsWithCursor")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.ChannelStore.GetChannelsWithCursor(teamId, userId, opts, afterChannelID)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerChannelStore) GetChannelsWithTeamDataByIds(channelIds []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.GetChannelsWithTeamDataByIds")
|
||||
@@ -1652,24 +1634,6 @@ func (s *OpenTracingLayerChannelStore) GetMembersForUser(teamID string, userID s
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerChannelStore) GetMembersForUserWithCursor(userID string, teamID string, opts *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.GetMembersForUserWithCursor")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.ChannelStore.GetMembersForUserWithCursor(userID, teamID, opts)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerChannelStore) GetMembersForUserWithPagination(userID string, page int, perPage int) (model.ChannelMembersWithTeamData, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.GetMembersForUserWithPagination")
|
||||
|
||||
@@ -1480,27 +1480,6 @@ func (s *RetryLayerChannelStore) GetChannelsMemberCount(channelIDs []string) (ma
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerChannelStore) GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.ChannelStore.GetChannelsWithCursor(teamId, userId, opts, afterChannelID)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return result, err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return result, err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerChannelStore) GetChannelsWithTeamDataByIds(channelIds []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
||||
|
||||
tries := 0
|
||||
@@ -1843,27 +1822,6 @@ func (s *RetryLayerChannelStore) GetMembersForUser(teamID string, userID string)
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerChannelStore) GetMembersForUserWithCursor(userID string, teamID string, opts *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.ChannelStore.GetMembersForUserWithCursor(userID, teamID, opts)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return result, err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return result, err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerChannelStore) GetMembersForUserWithPagination(userID string, page int, perPage int) (model.ChannelMembersWithTeamData, error) {
|
||||
|
||||
tries := 0
|
||||
|
||||
@@ -1073,66 +1073,6 @@ func (s SqlChannelStore) GetChannels(teamId string, userId string, opts *model.C
|
||||
return channels, nil
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select("ch.*").
|
||||
From("Channels ch, ChannelMembers cm").
|
||||
Where(
|
||||
sq.And{
|
||||
sq.Expr("ch.Id = cm.ChannelId"),
|
||||
sq.Eq{"cm.UserId": userId},
|
||||
},
|
||||
).
|
||||
OrderBy("ch.Id")
|
||||
|
||||
if opts.PerPage != nil {
|
||||
// The limit is verified at the GraphQL layer.
|
||||
query = query.Limit(uint64(*opts.PerPage))
|
||||
}
|
||||
|
||||
if afterChannelID != "" {
|
||||
query = query.Where(sq.Gt{"ch.Id": afterChannelID})
|
||||
}
|
||||
|
||||
if teamId != "" {
|
||||
query = query.Where(sq.Or{
|
||||
sq.Eq{"ch.TeamId": teamId},
|
||||
sq.Eq{"ch.TeamId": ""},
|
||||
})
|
||||
}
|
||||
|
||||
if opts.IncludeDeleted {
|
||||
if opts.LastDeleteAt != 0 {
|
||||
// We filter by non-archived, and archived >= a timestamp.
|
||||
query = query.Where(sq.Or{
|
||||
sq.Eq{"ch.DeleteAt": 0},
|
||||
sq.GtOrEq{"ch.DeleteAt": opts.LastDeleteAt},
|
||||
})
|
||||
}
|
||||
// If opts.LastDeleteAt is not set, we include everything. That means no filter is needed.
|
||||
} else {
|
||||
// Don't include archived channels.
|
||||
query = query.Where(sq.Eq{"ch.DeleteAt": 0})
|
||||
}
|
||||
|
||||
if opts.LastUpdateAt > 0 {
|
||||
query = query.Where(sq.GtOrEq{"ch.UpdateAt": opts.LastUpdateAt})
|
||||
}
|
||||
|
||||
channels := model.ChannelList{}
|
||||
sql, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "getchannels_tosql")
|
||||
}
|
||||
|
||||
err = s.GetReplicaX().Select(&channels, sql, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to get channels with TeamId=%s and UserId=%s", teamId, userId)
|
||||
}
|
||||
|
||||
return channels, nil
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetChannelsByUser(userId string, includeDeleted bool, lastDeleteAt, pageSize int, fromChannelID string) (model.ChannelList, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select("Channels.*").
|
||||
@@ -3050,86 +2990,6 @@ func (s SqlChannelStore) GetMembersForUser(teamID string, userID string) (model.
|
||||
return dbMembers.ToModel(), nil
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetMembersForUserWithCursor(userID, teamID string, opts *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select(
|
||||
"ChannelMembers.ChannelId",
|
||||
"ChannelMembers.UserId",
|
||||
"ChannelMembers.Roles",
|
||||
"ChannelMembers.LastViewedAt",
|
||||
"ChannelMembers.MsgCount",
|
||||
"ChannelMembers.MentionCount",
|
||||
"ChannelMembers.MentionCountRoot",
|
||||
"COALESCE(ChannelMembers.UrgentMentionCount, 0) AS UrgentMentionCount",
|
||||
"ChannelMembers.MsgCountRoot",
|
||||
"ChannelMembers.NotifyProps",
|
||||
"ChannelMembers.LastUpdateAt",
|
||||
"ChannelMembers.SchemeUser",
|
||||
"ChannelMembers.SchemeAdmin",
|
||||
"ChannelMembers.SchemeGuest",
|
||||
"TeamScheme.DefaultChannelGuestRole TeamSchemeDefaultGuestRole",
|
||||
"TeamScheme.DefaultChannelUserRole TeamSchemeDefaultUserRole",
|
||||
"TeamScheme.DefaultChannelAdminRole TeamSchemeDefaultAdminRole",
|
||||
"ChannelScheme.DefaultChannelGuestRole ChannelSchemeDefaultGuestRole",
|
||||
"ChannelScheme.DefaultChannelUserRole ChannelSchemeDefaultUserRole",
|
||||
"ChannelScheme.DefaultChannelAdminRole ChannelSchemeDefaultAdminRole").
|
||||
From("ChannelMembers").
|
||||
InnerJoin("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,
|
||||
"Channels.DeleteAt": 0,
|
||||
}).
|
||||
OrderBy("ChannelId, UserId ASC").
|
||||
// The limit is verified at the GraphQL layer.
|
||||
Limit(uint64(opts.Limit))
|
||||
|
||||
if teamID != "" {
|
||||
if opts.ExcludeTeam {
|
||||
// Exclude this team and DM/GMs
|
||||
query = query.Where(sq.And{
|
||||
sq.NotEq{"Channels.TeamId": teamID},
|
||||
sq.NotEq{"Channels.TeamId": ""},
|
||||
})
|
||||
} else {
|
||||
// Include this team and DM/GMs
|
||||
query = query.Where(sq.Or{
|
||||
sq.Eq{"Channels.TeamId": teamID},
|
||||
sq.Eq{"Channels.TeamId": ""},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if opts.AfterChannel != "" && opts.AfterUser != "" {
|
||||
query = query.Where(sq.Or{
|
||||
sq.Gt{"ChannelMembers.ChannelId": opts.AfterChannel},
|
||||
sq.And{
|
||||
sq.Eq{"ChannelMembers.ChannelId": opts.AfterChannel},
|
||||
sq.Gt{"ChannelMembers.UserId": opts.AfterUser},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
if opts.LastUpdateAt != 0 {
|
||||
query = query.Where(sq.GtOrEq{"ChannelMembers.LastUpdateAt": opts.LastUpdateAt})
|
||||
}
|
||||
|
||||
queryString, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "getMembersForUserWithCursor_tosql")
|
||||
}
|
||||
|
||||
dbMembers := channelMemberWithSchemeRolesList{}
|
||||
err = s.GetReplicaX().Select(&dbMembers, queryString, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to find ChannelMembers data with userId=%s", userID)
|
||||
}
|
||||
|
||||
return dbMembers.ToModel(), nil
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetMembersForUserWithPagination(userId string, page, perPage int) (model.ChannelMembersWithTeamData, error) {
|
||||
dbMembers := channelMemberWithTeamWithSchemeRolesList{}
|
||||
offset := page * perPage
|
||||
|
||||
@@ -201,7 +201,6 @@ type ChannelStore interface {
|
||||
GetDeletedByName(team_id string, name string) (*model.Channel, error)
|
||||
GetDeleted(team_id string, offset int, limit int, userID string) (model.ChannelList, error)
|
||||
GetChannels(teamID, userID string, opts *model.ChannelSearchOpts) (model.ChannelList, error)
|
||||
GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error)
|
||||
GetChannelsByUser(userID string, includeDeleted bool, lastDeleteAt, pageSize int, fromChannelID string) (model.ChannelList, error)
|
||||
GetAllChannelMembersById(id string) ([]string, error)
|
||||
GetAllChannels(page, perPage int, opts ChannelSearchOpts) (model.ChannelListWithTeamData, error)
|
||||
@@ -256,7 +255,6 @@ type ChannelStore interface {
|
||||
GetMembersForUser(teamID string, userID string) (model.ChannelMembers, error)
|
||||
GetTeamMembersForChannel(channelID string) ([]string, error)
|
||||
GetMembersForUserWithPagination(userID string, page, perPage int) (model.ChannelMembersWithTeamData, error)
|
||||
GetMembersForUserWithCursor(userID, teamID string, opts *ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error)
|
||||
Autocomplete(userID, term string, includeDeleted, isGuest bool) (model.ChannelListWithTeamData, error)
|
||||
AutocompleteInTeam(teamID, userID, term string, includeDeleted, isGuest bool) (model.ChannelList, error)
|
||||
AutocompleteInTeamForSearch(teamID string, userID string, term string, includeDeleted bool) (model.ChannelList, error)
|
||||
@@ -1079,16 +1077,6 @@ type ThreadMembershipOpts struct {
|
||||
UpdateParticipants bool
|
||||
}
|
||||
|
||||
// ChannelMemberGraphQLSearchOpts contains the options for a graphQL query
|
||||
// to get the channel members.
|
||||
type ChannelMemberGraphQLSearchOpts struct {
|
||||
AfterChannel string
|
||||
AfterUser string
|
||||
Limit int
|
||||
LastUpdateAt int
|
||||
ExcludeTeam bool
|
||||
}
|
||||
|
||||
// PostReminderMetadata contains some info needed to send
|
||||
// the reminder message to the user.
|
||||
type PostReminderMetadata struct {
|
||||
|
||||
@@ -94,7 +94,6 @@ 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) })
|
||||
@@ -103,7 +102,6 @@ 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("CountUrgentPostsAfter", func(t *testing.T) { testCountUrgentPostsAfter(t, ss) })
|
||||
@@ -3607,163 +3605,6 @@ 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")
|
||||
|
||||
// all channels should be returned
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
}, "")
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 3)
|
||||
|
||||
// should return empty list
|
||||
list, nErr = ss.Channel().GetChannelsWithCursor(o1.TeamId, m1.UserId, &model.ChannelSearchOpts{
|
||||
IncludeDeleted: false,
|
||||
LastDeleteAt: 0,
|
||||
}, list[2].Id)
|
||||
require.NoError(t, nErr)
|
||||
require.Len(t, list, 0)
|
||||
|
||||
// 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()
|
||||
@@ -4562,183 +4403,6 @@ 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)
|
||||
|
||||
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"
|
||||
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)
|
||||
|
||||
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()
|
||||
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)
|
||||
|
||||
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
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 1,
|
||||
}
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 1)
|
||||
opts.Limit = 3
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
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)
|
||||
})
|
||||
|
||||
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)
|
||||
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
}
|
||||
members, err2 := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 5)
|
||||
|
||||
opts.Limit = 2
|
||||
members, err2 = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err2)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
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)
|
||||
}
|
||||
opts := &store.ChannelMemberGraphQLSearchOpts{
|
||||
Limit: 10,
|
||||
}
|
||||
members, err := ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 6)
|
||||
|
||||
opts.Limit = 2
|
||||
members, err = ss.Channel().GetMembersForUserWithCursor(m1.UserId, "", opts)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, members, 2)
|
||||
|
||||
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, 4)
|
||||
})
|
||||
}
|
||||
|
||||
func testChannelStoreGetMembersForUserWithPagination(t *testing.T, ss store.Store) {
|
||||
t1 := model.Team{
|
||||
DisplayName: "team1",
|
||||
|
||||
@@ -435,50 +435,6 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, nErr)
|
||||
require.Equal(t, categories, categories2)
|
||||
})
|
||||
|
||||
t.Run("graphQL path to create initial favorites/channels/DMs categories on different teams", func(t *testing.T) {
|
||||
userId := model.NewId()
|
||||
|
||||
t1 := &model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: NewTestId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
InviteId: model.NewId(),
|
||||
}
|
||||
t1, err := ss.Team().Save(t1)
|
||||
require.NoError(t, err)
|
||||
|
||||
m1 := &model.TeamMember{TeamId: t1.Id, UserId: userId}
|
||||
_, nErr := ss.Team().SaveMember(m1, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
t2 := &model.Team{
|
||||
DisplayName: "DisplayName2",
|
||||
Name: NewTestId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
InviteId: model.NewId(),
|
||||
}
|
||||
t2, err = ss.Team().Save(t2)
|
||||
require.NoError(t, err)
|
||||
|
||||
m2 := &model.TeamMember{TeamId: t2.Id, UserId: userId}
|
||||
_, nErr = ss.Team().SaveMember(m2, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
opts := &store.SidebarCategorySearchOpts{
|
||||
TeamID: t1.Id,
|
||||
ExcludeTeam: true,
|
||||
}
|
||||
res, nErr := ss.Channel().CreateInitialSidebarCategories(c, userId, opts)
|
||||
require.NoError(t, nErr)
|
||||
require.NotEmpty(t, res)
|
||||
|
||||
for _, cat := range res.Categories {
|
||||
assert.Equal(t, t2.Id, cat.TeamId)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func testCreateSidebarCategory(t *testing.T, ss store.Store) {
|
||||
|
||||
@@ -976,32 +976,6 @@ func (_m *ChannelStore) GetChannelsMemberCount(channelIDs []string) (map[string]
|
||||
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
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, *model.ChannelSearchOpts, string) (model.ChannelList, error)); ok {
|
||||
return rf(teamId, userId, opts, afterChannelID)
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
@@ -1444,32 +1418,6 @@ func (_m *ChannelStore) GetMembersForUser(teamID string, userID string) (model.C
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// 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
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error)); ok {
|
||||
return rf(userID, teamID, opts)
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, *store.ChannelMemberGraphQLSearchOpts) error); ok {
|
||||
r1 = rf(userID, teamID, opts)
|
||||
} 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)
|
||||
|
||||
@@ -1243,22 +1243,6 @@ func (s *TimerLayerChannelStore) GetChannelsMemberCount(channelIDs []string) (ma
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerChannelStore) GetChannelsWithCursor(teamId string, userId string, opts *model.ChannelSearchOpts, afterChannelID string) (model.ChannelList, error) {
|
||||
start := time.Now()
|
||||
|
||||
result, err := s.ChannelStore.GetChannelsWithCursor(teamId, userId, opts, afterChannelID)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("ChannelStore.GetChannelsWithCursor", success, elapsed)
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerChannelStore) GetChannelsWithTeamDataByIds(channelIds []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
||||
start := time.Now()
|
||||
|
||||
@@ -1531,22 +1515,6 @@ func (s *TimerLayerChannelStore) GetMembersForUser(teamID string, userID string)
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerChannelStore) GetMembersForUserWithCursor(userID string, teamID string, opts *store.ChannelMemberGraphQLSearchOpts) (model.ChannelMembers, error) {
|
||||
start := time.Now()
|
||||
|
||||
result, err := s.ChannelStore.GetMembersForUserWithCursor(userID, teamID, opts)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("ChannelStore.GetMembersForUserWithCursor", success, elapsed)
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerChannelStore) GetMembersForUserWithPagination(userID string, page int, perPage int) (model.ChannelMembersWithTeamData, error) {
|
||||
start := time.Now()
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user