From bc6c071c3a897ee120c6a9ac974684a9abeb76c4 Mon Sep 17 00:00:00 2001 From: Tim Scheuermann Date: Tue, 31 Jan 2023 09:18:20 +0100 Subject: [PATCH] MM-47537 Export and import read channels (#22145) --- app/export.go | 7 +++---- app/export_converters.go | 14 ++++++++++---- app/export_test.go | 21 +++++++++++++++------ app/import_functions.go | 19 ++++++++++++++++--- app/imports/import_types.go | 14 ++++++++++---- store/sqlstore/channel_store.go | 1 + 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/app/export.go b/app/export.go index ee427b6936..48e389f8de 100644 --- a/app/export.go +++ b/app/export.go @@ -371,8 +371,6 @@ func (a *App) buildUserTeamAndChannelMemberships(userID string) (*[]imports.User } func (a *App) buildUserChannelMemberships(userID string, teamID string) (*[]imports.UserChannelImportData, *model.AppError) { - var memberships []imports.UserChannelImportData - members, nErr := a.Srv().Store().Channel().GetChannelMembersForExport(userID, teamID) if nErr != nil { return nil, model.NewAppError("buildUserChannelMemberships", "app.channel.get_members.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr) @@ -384,8 +382,9 @@ func (a *App) buildUserChannelMemberships(userID string, teamID string) (*[]impo return nil, err } - for _, member := range members { - memberships = append(memberships, *ImportUserChannelDataFromChannelMemberAndPreferences(member, &preferences)) + memberships := make([]imports.UserChannelImportData, len(members)) + for i, member := range members { + memberships[i] = *ImportUserChannelDataFromChannelMemberAndPreferences(member, &preferences) } return &memberships, nil } diff --git a/app/export_converters.go b/app/export_converters.go index 750a0decb5..1d49149302 100644 --- a/app/export_converters.go +++ b/app/export_converters.go @@ -150,10 +150,16 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM roles := strings.Join(rolesList, " ") return &imports.UserChannelImportData{ - Name: &member.ChannelName, - Roles: &roles, - NotifyProps: ¬ifyProps, - Favorite: &favorite, + Name: &member.ChannelName, + Roles: &roles, + NotifyProps: ¬ifyProps, + Favorite: &favorite, + MentionCount: &member.MentionCount, + MentionCountRoot: &member.MentionCountRoot, + UrgentMentionCount: &member.UrgentMentionCount, + MsgCount: &member.MsgCount, + MsgCountRoot: &member.MsgCountRoot, + LastViewedAt: &member.LastViewedAt, } } diff --git a/app/export_test.go b/app/export_test.go index e839e1dc13..533eaeee1a 100644 --- a/app/export_test.go +++ b/app/export_test.go @@ -77,6 +77,7 @@ func TestExportUserNotifyProps(t *testing.T) { func TestExportUserChannels(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() + channel := th.BasicChannel user := th.BasicUser team := th.BasicTeam @@ -91,6 +92,10 @@ func TestExportUserChannels(t *testing.T) { Name: channel.Id, Value: "true", } + + _, appErr := th.App.MarkChannelsAsViewed(th.Context, []string{th.BasicPost.ChannelId}, user.Id, "", true) + require.Nil(t, appErr) + var preferences model.Preferences preferences = append(preferences, preference) err := th.App.Srv().Store().Preference().Save(preferences) @@ -102,15 +107,19 @@ func TestExportUserChannels(t *testing.T) { assert.Equal(t, len(*exportData), 3) for _, data := range *exportData { if *data.Name == channelName { - assert.Equal(t, *data.NotifyProps.Desktop, "all") - assert.Equal(t, *data.NotifyProps.Mobile, "none") - assert.Equal(t, *data.NotifyProps.MarkUnread, "all") // default value + assert.Equal(t, "all", *data.NotifyProps.Desktop) + assert.Equal(t, "none", *data.NotifyProps.Mobile) + assert.Equal(t, "all", *data.NotifyProps.MarkUnread) // default value assert.True(t, *data.Favorite) + assert.NotEqualValues(t, 0, *data.LastViewedAt) + assert.NotEqualValues(t, 0, *data.MsgCount) } else { // default values - assert.Equal(t, *data.NotifyProps.Desktop, "default") - assert.Equal(t, *data.NotifyProps.Mobile, "default") - assert.Equal(t, *data.NotifyProps.MarkUnread, "all") + assert.Equal(t, "default", *data.NotifyProps.Desktop) + assert.Equal(t, "default", *data.NotifyProps.Mobile) + assert.Equal(t, "all", *data.NotifyProps.MarkUnread) assert.False(t, *data.Favorite) + assert.EqualValues(t, 0, *data.LastViewedAt) + assert.EqualValues(t, 0, *data.MsgCount) } } } diff --git a/app/import_functions.go b/app/import_functions.go index 1f28b046d3..c131123c9d 100644 --- a/app/import_functions.go +++ b/app/import_functions.go @@ -981,9 +981,7 @@ func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Te isUserByChannelId[channel.Id] = true isAdminByChannelId[channel.Id] = false - if cdata.Roles == nil { - isUserByChannelId[channel.Id] = true - } else { + if cdata.Roles != nil { rawRoles := *cdata.Roles explicitRoles := []string{} for _, role := range strings.Fields(rawRoles) { @@ -1027,6 +1025,21 @@ func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Te member.SchemeAdmin = userShouldBeAdmin } + if cdata.MentionCount != nil && cdata.MentionCountRoot != nil { + member.MentionCount = *cdata.MentionCount + member.MentionCountRoot = *cdata.MentionCountRoot + } + if cdata.UrgentMentionCount != nil { + member.UrgentMentionCount = *cdata.UrgentMentionCount + } + if cdata.MsgCount != nil && cdata.MsgCountRoot != nil { + member.MsgCount = *cdata.MsgCount + member.MsgCountRoot = *cdata.MsgCountRoot + } + if cdata.LastViewedAt != nil { + member.LastViewedAt = *cdata.LastViewedAt + } + if cdata.NotifyProps != nil { if cdata.NotifyProps.Desktop != nil { member.NotifyProps[model.DesktopNotifyProp] = *cdata.NotifyProps.Desktop diff --git a/app/imports/import_types.go b/app/imports/import_types.go index 30996df709..981a5dd8f8 100644 --- a/app/imports/import_types.go +++ b/app/imports/import_types.go @@ -108,10 +108,16 @@ type UserTeamImportData struct { } type UserChannelImportData struct { - Name *string `json:"name"` - Roles *string `json:"roles"` - NotifyProps *UserChannelNotifyPropsImportData `json:"notify_props,omitempty"` - Favorite *bool `json:"favorite,omitempty"` + Name *string `json:"name"` + Roles *string `json:"roles"` + NotifyProps *UserChannelNotifyPropsImportData `json:"notify_props,omitempty"` + Favorite *bool `json:"favorite,omitempty"` + MentionCount *int64 `json:"mention_count,omitempty"` + MentionCountRoot *int64 `json:"mention_count_root,omitempty"` + UrgentMentionCount *int64 `json:"urgend_mention_count,omitempty"` + MsgCount *int64 `json:"msg_count,omitempty"` + MsgCountRoot *int64 `json:"msg_count_root,omitempty"` + LastViewedAt *int64 `json:"last_viewed_at,omitempty"` } type UserChannelNotifyPropsImportData struct { diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index d480efdd7c..f067c369db 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -4082,6 +4082,7 @@ func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string ChannelMembers.MentionCount, ChannelMembers.MentionCountRoot, COALESCE(ChannelMembers.UrgentMentionCount, 0) AS UrgentMentionCount, + ChannelMembers.MsgCountRoot, ChannelMembers.NotifyProps, ChannelMembers.LastUpdateAt, ChannelMembers.SchemeUser,