From ab99f0656fabed8a62a8c6340be7d538cc7bf8d9 Mon Sep 17 00:00:00 2001 From: George Goldberg Date: Mon, 17 Sep 2018 15:51:26 +0100 Subject: MM-11781: Basic Data Export Command Line. (#9296) * MM-11781: Basic Data Export Command Line. * ChannelStore new unit tests. * TeamStore new unit tests. * Unit test for new UserStore function. * Unit tests for post store new methods. * Review fixes. * Fix duplicate command name. --- store/sqlstore/channel_store.go | 54 ++++++++++++++++++++++++++++++++++ store/sqlstore/post_store.go | 65 +++++++++++++++++++++++++++++++++++++++++ store/sqlstore/team_store.go | 56 +++++++++++++++++++++++++++++++++++ store/sqlstore/user_store.go | 11 +++++++ 4 files changed, 186 insertions(+) (limited to 'store/sqlstore') diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index 4103980c5..c0c1d2c8a 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -2016,3 +2016,57 @@ func (s SqlChannelStore) IsExperimentalPublicChannelsMaterializationEnabled() bo // See SqlChannelStoreExperimental return false } + +func (s SqlChannelStore) GetAllChannelsForExportAfter(limit int, afterId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var data []*model.ChannelForExport + if _, err := s.GetReplica().Select(&data, ` + SELECT + Channels.*, + Teams.Name as TeamName, + Schemes.Name as SchemeName + FROM Channels + INNER JOIN + Teams ON Channels.TeamId = Teams.Id + LEFT JOIN + Schemes ON Channels.SchemeId = Schemes.Id + WHERE + Channels.Id > :AfterId + AND Channels.Type IN ('O', 'P') + ORDER BY + Id + LIMIT :Limit`, + map[string]interface{}{"AfterId": afterId, "Limit": limit}); err != nil { + result.Err = model.NewAppError("SqlTeamStore.GetAllChannelsForExportAfter", "store.sql_channel.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) + return + } + + result.Data = data + }) +} + +func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var members []*model.ChannelMemberForExport + _, err := s.GetReplica().Select(&members, ` + SELECT + ChannelMembers.*, + Channels.Name as ChannelName + FROM + ChannelMembers + INNER JOIN + Channels ON ChannelMembers.ChannelId = Channels.Id + WHERE + ChannelMembers.UserId = :UserId + AND Channels.TeamId = :TeamId + AND Channels.DeleteAt = 0`, + map[string]interface{}{"TeamId": teamId, "UserId": userId}) + + if err != nil { + result.Err = model.NewAppError("SqlChannelStore.GetChannelMembersForExport", "store.sql_channel.get_members.app_error", nil, "teamId="+teamId+", userId="+userId+", err="+err.Error(), http.StatusInternalServerError) + return + } + + result.Data = members + }) +} diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index 9cf33888d..bc85b260e 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -1308,3 +1308,68 @@ func (s *SqlPostStore) GetMaxPostSize() store.StoreChannel { result.Data = s.maxPostSizeCached }) } + +func (s *SqlPostStore) GetParentsForExportAfter(limit int, afterId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var posts []*model.PostForExport + _, err1 := s.GetSearchReplica().Select(&posts, ` + SELECT + p1.*, + Users.Username as Username, + Teams.Name as TeamName, + Channels.Name as ChannelName + FROM + Posts p1 + INNER JOIN + Channels ON p1.ChannelId = Channels.Id + INNER JOIN + Teams ON Channels.TeamId = Teams.Id + INNER JOIN + Users ON p1.UserId = Users.Id + WHERE + p1.Id > :AfterId + AND p1.ParentId = '' + AND p1.DeleteAt = 0 + AND Channels.DeleteAt = 0 + AND Teams.DeleteAt = 0 + AND Users.DeleteAt = 0 + ORDER BY + p1.Id + LIMIT + :Limit`, + map[string]interface{}{"Limit": limit, "AfterId": afterId}) + + if err1 != nil { + result.Err = model.NewAppError("SqlPostStore.GetAllAfterForExport", "store.sql_post.get_posts.app_error", nil, err1.Error(), http.StatusInternalServerError) + } else { + result.Data = posts + } + }) +} + +func (s *SqlPostStore) GetRepliesForExport(parentId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var posts []*model.ReplyForExport + _, err1 := s.GetSearchReplica().Select(&posts, ` + SELECT + Posts.*, + Users.Username as Username + FROM + Posts + INNER JOIN + Users ON Posts.UserId = Users.Id + WHERE + Posts.ParentId = :ParentId + AND Posts.DeleteAt = 0 + AND Users.DeleteAt = 0 + ORDER BY + Posts.Id`, + map[string]interface{}{"ParentId": parentId}) + + if err1 != nil { + result.Err = model.NewAppError("SqlPostStore.GetAllAfterForExport", "store.sql_post.get_posts.app_error", nil, err1.Error(), http.StatusInternalServerError) + } else { + result.Data = posts + } + }) +} diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 3ea6feced..b48242294 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -924,3 +924,59 @@ func (s SqlTeamStore) AnalyticsGetTeamCountForScheme(schemeId string) store.Stor result.Data = count }) } + +func (s SqlTeamStore) GetAllForExportAfter(limit int, afterId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var data []*model.TeamForExport + if _, err := s.GetReplica().Select(&data, ` + SELECT + Teams.*, + Schemes.Name as SchemeName + FROM + Teams + LEFT JOIN + Schemes ON Teams.SchemeId = Schemes.Id + WHERE + Teams.Id > :AfterId + ORDER BY + Id + LIMIT + :Limit`, + map[string]interface{}{"AfterId": afterId, "Limit": limit}); err != nil { + result.Err = model.NewAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) + return + } + + for _, team := range data { + if len(team.InviteId) == 0 { + team.InviteId = team.Id + } + } + + result.Data = data + }) +} + +func (s SqlTeamStore) GetTeamMembersForExport(userId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var members []*model.TeamMemberForExport + _, err := s.GetReplica().Select(&members, ` + SELECT + TeamMembers.*, + Teams.Name as TeamName + FROM + TeamMembers + INNER JOIN + Teams ON TeamMembers.TeamId = Teams.Id + WHERE + TeamMembers.UserId = :UserId + AND Teams.DeleteAt = 0`, + map[string]interface{}{"UserId": userId}) + if err != nil { + result.Err = model.NewAppError("SqlTeamStore.GetTeamMembersForExport", "store.sql_team.get_members.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError) + return + } + + result.Data = members + }) +} diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index c89c445ad..900010ce4 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -332,6 +332,17 @@ func (us SqlUserStore) GetAll() store.StoreChannel { }) } +func (us SqlUserStore) GetAllAfter(limit int, afterId string) store.StoreChannel { + return store.Do(func(result *store.StoreResult) { + var data []*model.User + if _, err := us.GetReplica().Select(&data, "SELECT * FROM Users WHERE Id > :AfterId ORDER BY Id LIMIT :Limit", map[string]interface{}{"AfterId": afterId, "Limit": limit}); err != nil { + result.Err = model.NewAppError("SqlUserStore.GetAllAfter", "store.sql_user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + result.Data = data + }) +} + func (s SqlUserStore) GetEtagForAllProfiles() store.StoreChannel { return store.Do(func(result *store.StoreResult) { updateAt, err := s.GetReplica().SelectInt("SELECT UpdateAt FROM Users ORDER BY UpdateAt DESC LIMIT 1") -- cgit v1.2.3-1-g7c22