Migrates Channel.GetAllDirectChannelsForExportAfter to sync by default (#11272)
Этот коммит содержится в:
коммит произвёл
Gabe Jackson
родитель
b1631026d8
Коммит
1e05d37290
@@ -507,12 +507,11 @@ func (a *App) copyEmojiImages(emojiId string, emojiImagePath string, pathToDir s
|
|||||||
func (a *App) ExportAllDirectChannels(writer io.Writer) *model.AppError {
|
func (a *App) ExportAllDirectChannels(writer io.Writer) *model.AppError {
|
||||||
afterId := strings.Repeat("0", 26)
|
afterId := strings.Repeat("0", 26)
|
||||||
for {
|
for {
|
||||||
result := <-a.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, afterId)
|
channels, err := a.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, afterId)
|
||||||
if result.Err != nil {
|
if err != nil {
|
||||||
return result.Err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
channels := result.Data.([]*model.DirectChannelForExport)
|
|
||||||
if len(channels) == 0 {
|
if len(channels) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -227,8 +227,8 @@ func TestExportDMChannel(t *testing.T) {
|
|||||||
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err := th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels := result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 1, len(channels))
|
assert.Equal(t, 1, len(channels))
|
||||||
|
|
||||||
th1.TearDown()
|
th1.TearDown()
|
||||||
@@ -236,8 +236,8 @@ func TestExportDMChannel(t *testing.T) {
|
|||||||
th2 := Setup(t)
|
th2 := Setup(t)
|
||||||
defer th2.TearDown()
|
defer th2.TearDown()
|
||||||
|
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(channels))
|
assert.Equal(t, 0, len(channels))
|
||||||
|
|
||||||
// import the exported channel
|
// import the exported channel
|
||||||
@@ -246,8 +246,8 @@ func TestExportDMChannel(t *testing.T) {
|
|||||||
assert.Equal(t, 0, i)
|
assert.Equal(t, 0, i)
|
||||||
|
|
||||||
// Ensure the Members of the imported DM channel is the same was from the exported
|
// Ensure the Members of the imported DM channel is the same was from the exported
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 1, len(channels))
|
assert.Equal(t, 1, len(channels))
|
||||||
assert.ElementsMatch(t, []string{th1.BasicUser.Username, th1.BasicUser2.Username}, *channels[0].Members)
|
assert.ElementsMatch(t, []string{th1.BasicUser.Username, th1.BasicUser2.Username}, *channels[0].Members)
|
||||||
}
|
}
|
||||||
@@ -263,15 +263,15 @@ func TestExportDMChannelToSelf(t *testing.T) {
|
|||||||
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err := th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels := result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 1, len(channels))
|
assert.Equal(t, 1, len(channels))
|
||||||
|
|
||||||
th2 := Setup(t)
|
th2 := Setup(t)
|
||||||
defer th2.TearDown()
|
defer th2.TearDown()
|
||||||
|
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(channels))
|
assert.Equal(t, 0, len(channels))
|
||||||
|
|
||||||
// import the exported channel
|
// import the exported channel
|
||||||
@@ -280,8 +280,8 @@ func TestExportDMChannelToSelf(t *testing.T) {
|
|||||||
assert.Equal(t, 0, i)
|
assert.Equal(t, 0, i)
|
||||||
|
|
||||||
// Ensure no channels were imported
|
// Ensure no channels were imported
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(channels))
|
assert.Equal(t, 0, len(channels))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,8 +300,8 @@ func TestExportGMChannel(t *testing.T) {
|
|||||||
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err := th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels := result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 1, len(channels))
|
assert.Equal(t, 1, len(channels))
|
||||||
|
|
||||||
th1.TearDown()
|
th1.TearDown()
|
||||||
@@ -309,8 +309,8 @@ func TestExportGMChannel(t *testing.T) {
|
|||||||
th2 := Setup(t)
|
th2 := Setup(t)
|
||||||
defer th2.TearDown()
|
defer th2.TearDown()
|
||||||
|
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(channels))
|
assert.Equal(t, 0, len(channels))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,8 +332,8 @@ func TestExportGMandDMChannels(t *testing.T) {
|
|||||||
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err := th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels := result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 2, len(channels))
|
assert.Equal(t, 2, len(channels))
|
||||||
|
|
||||||
th1.TearDown()
|
th1.TearDown()
|
||||||
@@ -341,8 +341,8 @@ func TestExportGMandDMChannels(t *testing.T) {
|
|||||||
th2 := Setup(t)
|
th2 := Setup(t)
|
||||||
defer th2.TearDown()
|
defer th2.TearDown()
|
||||||
|
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(channels))
|
assert.Equal(t, 0, len(channels))
|
||||||
|
|
||||||
// import the exported channel
|
// import the exported channel
|
||||||
@@ -351,8 +351,8 @@ func TestExportGMandDMChannels(t *testing.T) {
|
|||||||
assert.Equal(t, 0, i)
|
assert.Equal(t, 0, i)
|
||||||
|
|
||||||
// Ensure the Members of the imported GM channel is the same was from the exported
|
// Ensure the Members of the imported GM channel is the same was from the exported
|
||||||
result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
channels, err = th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
|
||||||
channels = result.Data.([]*model.DirectChannelForExport)
|
require.Nil(t, err)
|
||||||
|
|
||||||
// Adding some deteminism so its possible to assert on slice index
|
// Adding some deteminism so its possible to assert on slice index
|
||||||
sort.Slice(channels, func(i, j int) bool { return channels[i].Type > channels[j].Type })
|
sort.Slice(channels, func(i, j int) bool { return channels[i].Type > channels[j].Type })
|
||||||
|
|||||||
@@ -2487,67 +2487,63 @@ func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string
|
|||||||
return members, nil
|
return members, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string) store.StoreChannel {
|
func (s SqlChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string) ([]*model.DirectChannelForExport, *model.AppError) {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
var directChannelsForExport []*model.DirectChannelForExport
|
||||||
var directChannelsForExport []*model.DirectChannelForExport
|
query := s.getQueryBuilder().
|
||||||
query := s.getQueryBuilder().
|
Select("Channels.*").
|
||||||
Select("Channels.*").
|
From("Channels").
|
||||||
From("Channels").
|
Where(sq.And{
|
||||||
Where(sq.And{
|
sq.Gt{"Channels.Id": afterId},
|
||||||
sq.Gt{"Channels.Id": afterId},
|
sq.Eq{"Channels.DeleteAt": int(0)},
|
||||||
sq.Eq{"Channels.DeleteAt": int(0)},
|
sq.Eq{"Channels.Type": []string{"D", "G"}},
|
||||||
sq.Eq{"Channels.Type": []string{"D", "G"}},
|
}).
|
||||||
}).
|
OrderBy("Channels.Id").
|
||||||
OrderBy("Channels.Id").
|
Limit(uint64(limit))
|
||||||
Limit(uint64(limit))
|
|
||||||
|
|
||||||
queryString, args, err := query.ToSql()
|
queryString, args, err := query.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
result.Err = model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = s.GetReplica().Select(&directChannelsForExport, queryString, args...); err != nil {
|
if _, err = s.GetReplica().Select(&directChannelsForExport, queryString, args...); err != nil {
|
||||||
result.Err = model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var channelIds []string
|
var channelIds []string
|
||||||
for _, channel := range directChannelsForExport {
|
for _, channel := range directChannelsForExport {
|
||||||
channelIds = append(channelIds, channel.Id)
|
channelIds = append(channelIds, channel.Id)
|
||||||
}
|
}
|
||||||
query = s.getQueryBuilder().
|
query = s.getQueryBuilder().
|
||||||
Select("u.Username as Username, ChannelId, UserId, cm.Roles as Roles, LastViewedAt, MsgCount, MentionCount, cm.NotifyProps as NotifyProps, LastUpdateAt, SchemeUser, SchemeAdmin, (SchemeGuest IS NOT NULL AND SchemeGuest) as SchemeGuest").
|
Select("u.Username as Username, ChannelId, UserId, cm.Roles as Roles, LastViewedAt, MsgCount, MentionCount, cm.NotifyProps as NotifyProps, LastUpdateAt, SchemeUser, SchemeAdmin, (SchemeGuest IS NOT NULL AND SchemeGuest) as SchemeGuest").
|
||||||
From("ChannelMembers cm").
|
From("ChannelMembers cm").
|
||||||
Join("Users u ON ( u.Id = cm.UserId )").
|
Join("Users u ON ( u.Id = cm.UserId )").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
sq.Eq{"cm.ChannelId": channelIds},
|
sq.Eq{"cm.ChannelId": channelIds},
|
||||||
sq.Eq{"u.DeleteAt": int(0)},
|
sq.Eq{"u.DeleteAt": int(0)},
|
||||||
})
|
})
|
||||||
|
|
||||||
queryString, args, err = query.ToSql()
|
queryString, args, err = query.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
result.Err = model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var channelMembers []*model.ChannelMemberForExport
|
var channelMembers []*model.ChannelMemberForExport
|
||||||
if _, err := s.GetReplica().Select(&channelMembers, queryString, args...); err != nil {
|
if _, err := s.GetReplica().Select(&channelMembers, queryString, args...); err != nil {
|
||||||
result.Err = model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("SqlChannelStore.GetAllDirectChannelsForExportAfter", "store.sql_channel.get_all_direct.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate each channel with its members
|
// Populate each channel with its members
|
||||||
dmChannelsMap := make(map[string]*model.DirectChannelForExport)
|
dmChannelsMap := make(map[string]*model.DirectChannelForExport)
|
||||||
for _, channel := range directChannelsForExport {
|
for _, channel := range directChannelsForExport {
|
||||||
channel.Members = &[]string{}
|
channel.Members = &[]string{}
|
||||||
dmChannelsMap[channel.Id] = channel
|
dmChannelsMap[channel.Id] = channel
|
||||||
}
|
}
|
||||||
for _, member := range channelMembers {
|
for _, member := range channelMembers {
|
||||||
members := dmChannelsMap[member.ChannelId].Members
|
members := dmChannelsMap[member.ChannelId].Members
|
||||||
*members = append(*members, member.Username)
|
*members = append(*members, member.Username)
|
||||||
}
|
}
|
||||||
result.Data = directChannelsForExport
|
|
||||||
})
|
return directChannelsForExport, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetChannelsBatchForIndexing(startTime, endTime int64, limit int) ([]*model.Channel, *model.AppError) {
|
func (s SqlChannelStore) GetChannelsBatchForIndexing(startTime, endTime int64, limit int) ([]*model.Channel, *model.AppError) {
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ type ChannelStore interface {
|
|||||||
ClearAllCustomRoleAssignments() *model.AppError
|
ClearAllCustomRoleAssignments() *model.AppError
|
||||||
MigratePublicChannels() error
|
MigratePublicChannels() error
|
||||||
GetAllChannelsForExportAfter(limit int, afterId string) ([]*model.ChannelForExport, *model.AppError)
|
GetAllChannelsForExportAfter(limit int, afterId string) ([]*model.ChannelForExport, *model.AppError)
|
||||||
GetAllDirectChannelsForExportAfter(limit int, afterId string) StoreChannel
|
GetAllDirectChannelsForExportAfter(limit int, afterId string) ([]*model.DirectChannelForExport, *model.AppError)
|
||||||
GetChannelMembersForExport(userId string, teamId string) ([]*model.ChannelMemberForExport, *model.AppError)
|
GetChannelMembersForExport(userId string, teamId string) ([]*model.ChannelMemberForExport, *model.AppError)
|
||||||
RemoveAllDeactivatedMembers(channelId string) *model.AppError
|
RemoveAllDeactivatedMembers(channelId string) *model.AppError
|
||||||
GetChannelsBatchForIndexing(startTime, endTime int64, limit int) ([]*model.Channel, *model.AppError)
|
GetChannelsBatchForIndexing(startTime, endTime int64, limit int) ([]*model.Channel, *model.AppError)
|
||||||
|
|||||||
@@ -3467,9 +3467,8 @@ func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s Sql
|
|||||||
|
|
||||||
ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
||||||
|
|
||||||
r1 := <-ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
||||||
assert.Nil(t, r1.Err)
|
assert.Nil(t, err)
|
||||||
d1 := r1.Data.([]*model.DirectChannelForExport)
|
|
||||||
|
|
||||||
assert.Equal(t, 2, len(d1))
|
assert.Equal(t, 2, len(d1))
|
||||||
assert.ElementsMatch(t, []string{o1.DisplayName, o2.DisplayName}, []string{d1[0].DisplayName, d1[1].DisplayName})
|
assert.ElementsMatch(t, []string{o1.DisplayName, o2.DisplayName}, []string{d1[0].DisplayName, d1[1].DisplayName})
|
||||||
@@ -3527,9 +3526,8 @@ func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T
|
|||||||
|
|
||||||
ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
||||||
|
|
||||||
r1 := <-ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
||||||
assert.Nil(t, r1.Err)
|
assert.Nil(t, err)
|
||||||
d1 := r1.Data.([]*model.DirectChannelForExport)
|
|
||||||
assert.Equal(t, 1, len(d1))
|
assert.Equal(t, 1, len(d1))
|
||||||
assert.Equal(t, o1.DisplayName, d1[0].DisplayName)
|
assert.Equal(t, o1.DisplayName, d1[0].DisplayName)
|
||||||
|
|
||||||
@@ -3574,9 +3572,8 @@ func testChannelStoreExportAllDirectChannelsDeletedChannel(t *testing.T, ss stor
|
|||||||
err := ss.Channel().SetDeleteAt(o1.Id, 1, 1)
|
err := ss.Channel().SetDeleteAt(o1.Id, 1, 1)
|
||||||
require.Nil(t, err, "channel should have been deleted")
|
require.Nil(t, err, "channel should have been deleted")
|
||||||
|
|
||||||
r1 := <-ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
|
||||||
assert.Nil(t, r1.Err)
|
assert.Nil(t, err)
|
||||||
d1 := r1.Data.([]*model.DirectChannelForExport)
|
|
||||||
|
|
||||||
assert.Equal(t, 0, len(d1))
|
assert.Equal(t, 0, len(d1))
|
||||||
|
|
||||||
|
|||||||
@@ -304,19 +304,28 @@ func (_m *ChannelStore) GetAllChannelsForExportAfter(limit int, afterId string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetAllDirectChannelsForExportAfter provides a mock function with given fields: limit, afterId
|
// GetAllDirectChannelsForExportAfter provides a mock function with given fields: limit, afterId
|
||||||
func (_m *ChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string) store.StoreChannel {
|
func (_m *ChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string) ([]*model.DirectChannelForExport, *model.AppError) {
|
||||||
ret := _m.Called(limit, afterId)
|
ret := _m.Called(limit, afterId)
|
||||||
|
|
||||||
var r0 store.StoreChannel
|
var r0 []*model.DirectChannelForExport
|
||||||
if rf, ok := ret.Get(0).(func(int, string) store.StoreChannel); ok {
|
if rf, ok := ret.Get(0).(func(int, string) []*model.DirectChannelForExport); ok {
|
||||||
r0 = rf(limit, afterId)
|
r0 = rf(limit, afterId)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(store.StoreChannel)
|
r0 = ret.Get(0).([]*model.DirectChannelForExport)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
var r1 *model.AppError
|
||||||
|
if rf, ok := ret.Get(1).(func(int, string) *model.AppError); ok {
|
||||||
|
r1 = rf(limit, afterId)
|
||||||
|
} else {
|
||||||
|
if ret.Get(1) != nil {
|
||||||
|
r1 = ret.Get(1).(*model.AppError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetByName provides a mock function with given fields: team_id, name, allowFromCache
|
// GetByName provides a mock function with given fields: team_id, name, allowFromCache
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user