Migrates Channel.GetAllDirectChannelsForExportAfter to sync by default (#11272)

Этот коммит содержится в:
Rodrigo Villablanca Vásquez
2019-06-20 11:01:49 -04:00
коммит произвёл Gabe Jackson
родитель b1631026d8
Коммит 1e05d37290
6 изменённых файлов: 97 добавлений и 96 удалений

Просмотреть файл

@@ -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