summaryrefslogtreecommitdiffstats
path: root/store/sqlstore
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2018-09-17 15:51:26 +0100
committerGitHub <noreply@github.com>2018-09-17 15:51:26 +0100
commitab99f0656fabed8a62a8c6340be7d538cc7bf8d9 (patch)
treebb68ee1d0c743be23bba470f5d81ef11dc134182 /store/sqlstore
parent5786b0d6d57b90bbb0c262235dd9d19b497b5fae (diff)
downloadchat-ab99f0656fabed8a62a8c6340be7d538cc7bf8d9.tar.gz
chat-ab99f0656fabed8a62a8c6340be7d538cc7bf8d9.tar.bz2
chat-ab99f0656fabed8a62a8c6340be7d538cc7bf8d9.zip
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.
Diffstat (limited to 'store/sqlstore')
-rw-r--r--store/sqlstore/channel_store.go54
-rw-r--r--store/sqlstore/post_store.go65
-rw-r--r--store/sqlstore/team_store.go56
-rw-r--r--store/sqlstore/user_store.go11
4 files changed, 186 insertions, 0 deletions
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")