[MM-58834] Review user preferences export and import (#28286)

Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2024-10-11 12:28:37 +02:00
коммит произвёл GitHub
родитель e8ebbcc980
Коммит 9d5993d89d
10 изменённых файлов: 526 добавлений и 140 удалений

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

@@ -29,43 +29,83 @@ import (
// We use this map to identify the exportable preferences.
// Here we link the preference category and name, to the name of the relevant field in the import struct.
var exportablePreferences = map[imports.ComparablePreference]string{{
Category: model.PreferenceCategoryTheme,
Name: "",
}: "Theme", {
Category: model.PreferenceCategoryAdvancedSettings,
Name: "feature_enabled_markdown_preview",
}: "UseMarkdownPreview", {
Category: model.PreferenceCategoryAdvancedSettings,
Name: "formatting",
}: "UseFormatting", {
Category: model.PreferenceCategorySidebarSettings,
Name: "show_unread_section",
}: "ShowUnreadSection", {
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameUseMilitaryTime,
}: "UseMilitaryTime", {
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameCollapseSetting,
}: "CollapsePreviews", {
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameMessageDisplay,
}: "MessageDisplay", {
Category: model.PreferenceCategoryDisplaySettings,
Name: "channel_display_mode",
}: "CollapseConsecutive", {
Category: model.PreferenceCategoryDisplaySettings,
Name: "collapse_consecutive_messages",
}: "ColorizeUsernames", {
Category: model.PreferenceCategoryDisplaySettings,
Name: "colorize_usernames",
}: "ChannelDisplayMode", {
Category: model.PreferenceCategoryTutorialSteps,
Name: "",
}: "TutorialStep", {
Category: model.PreferenceCategoryNotifications,
Name: model.PreferenceNameEmailInterval,
}: "EmailInterval",
var exportablePreferences = map[imports.ComparablePreference]string{
{
Category: model.PreferenceCategoryTheme,
Name: "",
}: "Theme",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "feature_enabled_markdown_preview",
}: "UseMarkdownPreview",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "formatting",
}: "UseFormatting",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "send_on_ctrl_enter",
}: "SendOnCtrlEnter",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "code_block_ctrl_enter",
}: "CodeBlockCtrlEnter",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "join_leave",
}: "ShowJoinLeave",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "unread_scroll_position",
}: "ShowUnreadScrollPosition",
{
Category: model.PreferenceCategoryAdvancedSettings,
Name: "sync_drafts",
}: "SyncDrafts",
{
Category: model.PreferenceCategorySidebarSettings,
Name: model.PreferenceNameShowUnreadSection,
}: "ShowUnreadSection",
{
Category: model.PreferenceCategorySidebarSettings,
Name: model.PreferenceLimitVisibleDmsGms,
}: "LimitVisibleDmsGms",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameUseMilitaryTime,
}: "UseMilitaryTime",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameCollapseSetting,
}: "CollapsePreviews",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameMessageDisplay,
}: "MessageDisplay",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameChannelDisplayMode,
}: "ChannelDisplayMode",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameCollapseConsecutive,
}: "CollapseConsecutive",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameColorizeUsernames,
}: "ColorizeUsernames",
{
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameNameFormat,
}: "NameFormat",
{
Category: model.PreferenceCategoryTutorialSteps,
Name: "",
}: "TutorialStep",
{
Category: model.PreferenceCategoryNotifications,
Name: model.PreferenceNameEmailInterval,
}: "EmailInterval",
}
func (a *App) BulkExport(ctx request.CTX, writer io.Writer, outPath string, job *model.Job, opts model.BulkExportOpts) *model.AppError {

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

@@ -144,28 +144,35 @@ func ImportLineFromUser(user *model.User, exportedPrefs map[string]*string) *imp
return &imports.LineImportData{
Type: "user",
User: &imports.UserImportData{
Username: &user.Username,
Email: &user.Email,
AuthService: authService,
AuthData: user.AuthData,
Nickname: &user.Nickname,
FirstName: &user.FirstName,
LastName: &user.LastName,
Position: &user.Position,
Roles: &user.Roles,
Locale: &user.Locale,
UseMarkdownPreview: exportedPrefs["UseMarkdownPreview"],
UseFormatting: exportedPrefs["UseFormatting"],
ShowUnreadSection: exportedPrefs["ShowUnreadSection"],
Theme: exportedPrefs["Theme"],
UseMilitaryTime: exportedPrefs["UseMilitaryTime"],
CollapsePreviews: exportedPrefs["CollapsePreviews"],
MessageDisplay: exportedPrefs["MessageDisplay"],
ColorizeUsernames: exportedPrefs["ColorizeUsernames"],
ChannelDisplayMode: exportedPrefs["ChannelDisplayMode"],
TutorialStep: exportedPrefs["TutorialStep"],
EmailInterval: exportedPrefs["EmailInterval"],
DeleteAt: &user.DeleteAt,
Username: &user.Username,
Email: &user.Email,
AuthService: authService,
AuthData: user.AuthData,
Nickname: &user.Nickname,
FirstName: &user.FirstName,
LastName: &user.LastName,
Position: &user.Position,
Roles: &user.Roles,
Locale: &user.Locale,
UseMarkdownPreview: exportedPrefs["UseMarkdownPreview"],
UseFormatting: exportedPrefs["UseFormatting"],
ShowUnreadSection: exportedPrefs["ShowUnreadSection"],
Theme: exportedPrefs["Theme"],
UseMilitaryTime: exportedPrefs["UseMilitaryTime"],
CollapsePreviews: exportedPrefs["CollapsePreviews"],
MessageDisplay: exportedPrefs["MessageDisplay"],
ColorizeUsernames: exportedPrefs["ColorizeUsernames"],
ChannelDisplayMode: exportedPrefs["ChannelDisplayMode"],
TutorialStep: exportedPrefs["TutorialStep"],
EmailInterval: exportedPrefs["EmailInterval"],
NameFormat: exportedPrefs["NameFormat"],
SendOnCtrlEnter: exportedPrefs["SendOnCtrlEnter"],
ShowJoinLeave: exportedPrefs["ShowJoinLeave"],
SyncDrafts: exportedPrefs["SyncDrafts"],
ShowUnreadScrollPosition: exportedPrefs["ShowUnreadScrollPosition"],
LimitVisibleDmsGms: exportedPrefs["LimitVisibleDmsGms"],
CodeBlockCtrlEnter: exportedPrefs["CodeBlockCtrlEnter"],
DeleteAt: &user.DeleteAt,
},
}
}
@@ -238,17 +245,20 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM
}
func ImportLineForPost(post *model.PostForExport) *imports.LineImportData {
f := []string(post.FlaggedBy)
return &imports.LineImportData{
Type: "post",
Post: &imports.PostImportData{
Team: &post.TeamName,
Channel: &post.ChannelName,
User: &post.Username,
Type: &post.Type,
Message: &post.Message,
Props: &post.Props,
CreateAt: &post.CreateAt,
EditAt: &post.EditAt,
Team: &post.TeamName,
Channel: &post.ChannelName,
User: &post.Username,
Type: &post.Type,
Message: &post.Message,
Props: &post.Props,
CreateAt: &post.CreateAt,
EditAt: &post.EditAt,
IsPinned: &post.IsPinned,
FlaggedBy: &f,
},
}
}
@@ -258,6 +268,7 @@ func ImportLineForDirectPost(post *model.DirectPostForExport) *imports.LineImpor
if len(channelMembers) == 1 {
channelMembers = []string{channelMembers[0], channelMembers[0]}
}
f := []string(post.FlaggedBy)
return &imports.LineImportData{
Type: "direct_post",
DirectPost: &imports.DirectPostImportData{
@@ -268,17 +279,22 @@ func ImportLineForDirectPost(post *model.DirectPostForExport) *imports.LineImpor
Props: &post.Props,
CreateAt: &post.CreateAt,
EditAt: &post.EditAt,
IsPinned: &post.IsPinned,
FlaggedBy: &f,
},
}
}
func ImportReplyFromPost(post *model.ReplyForExport) *imports.ReplyImportData {
f := []string(post.FlaggedBy)
return &imports.ReplyImportData{
User: &post.Username,
Type: &post.Type,
Message: &post.Message,
CreateAt: &post.CreateAt,
EditAt: &post.EditAt,
User: &post.Username,
Type: &post.Type,
Message: &post.Message,
CreateAt: &post.CreateAt,
EditAt: &post.EditAt,
IsPinned: &post.IsPinned,
FlaggedBy: &f,
}
}

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

@@ -722,7 +722,7 @@ func (a *App) importUser(rctx request.CTX, data *imports.UserImportData, dryRun
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryDisplaySettings,
Name: "channel_display_mode",
Name: model.PreferenceNameChannelDisplayMode,
Value: *data.ChannelDisplayMode,
})
}
@@ -763,6 +763,69 @@ func (a *App) importUser(rctx request.CTX, data *imports.UserImportData, dryRun
})
}
if data.SendOnCtrlEnter != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryAdvancedSettings,
Name: "send_on_ctrl_enter",
Value: *data.SendOnCtrlEnter,
})
}
if data.CodeBlockCtrlEnter != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryAdvancedSettings,
Name: "code_block_ctrl_enter",
Value: *data.CodeBlockCtrlEnter,
})
}
if data.ShowJoinLeave != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryAdvancedSettings,
Name: "join_leave",
Value: *data.ShowJoinLeave,
})
}
if data.ShowUnreadScrollPosition != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryAdvancedSettings,
Name: "unread_scroll_position",
Value: *data.ShowUnreadScrollPosition,
})
}
if data.SyncDrafts != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryAdvancedSettings,
Name: "sync_drafts",
Value: *data.SyncDrafts,
})
}
if data.LimitVisibleDmsGms != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategorySidebarSettings,
Name: model.PreferenceLimitVisibleDmsGms,
Value: *data.LimitVisibleDmsGms,
})
}
if data.NameFormat != nil {
preferences = append(preferences, model.Preference{
UserId: savedUser.Id,
Category: model.PreferenceCategoryDisplaySettings,
Name: model.PreferenceNameNameFormat,
Value: *data.NameFormat,
})
}
if data.EmailInterval != nil || savedUser.NotifyProps[model.EmailNotifyProp] == "false" {
var intervalSeconds string
if value := savedUser.NotifyProps[model.EmailNotifyProp]; value == "false" {
@@ -1184,6 +1247,9 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po
return err
}
usernames = append(usernames, *replyData.User)
if replyData.FlaggedBy != nil {
usernames = append(usernames, *replyData.FlaggedBy...)
}
}
users, err := a.getUsersByUsernames(usernames)
@@ -1233,6 +1299,9 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po
if replyData.EditAt != nil {
reply.EditAt = *replyData.EditAt
}
if replyData.IsPinned != nil {
reply.IsPinned = *replyData.IsPinned
}
fileIDs := a.uploadAttachments(rctx, replyData.Attachments, reply, teamID, extractContent)
for _, fileID := range reply.FileIds {
@@ -1274,6 +1343,27 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po
for _, postWithData := range postsWithData {
a.updateFileInfoWithPostId(rctx, postWithData.post)
if postWithData.replyData.FlaggedBy != nil {
var preferences model.Preferences
for _, username := range *postWithData.replyData.FlaggedBy {
user := users[strings.ToLower(username)]
preferences = append(preferences, model.Preference{
UserId: user.Id,
Category: model.PreferenceCategoryFlaggedPost,
Name: postWithData.post.Id,
Value: "true",
})
}
if len(preferences) > 0 {
if err := a.Srv().Store().Preference().Save(preferences); err != nil {
return model.NewAppError("BulkImport", "app.import.import_post.save_preferences.error", nil, "", http.StatusInternalServerError).Wrap(err)
}
}
}
}
return nil

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

@@ -1166,19 +1166,26 @@ func TestImportImportUser(t *testing.T) {
// Add a user with some preferences.
username = model.NewUsername()
data = imports.UserImportData{
Username: &username,
Email: ptrStr(model.NewId() + "@example.com"),
Theme: ptrStr(`{"awayIndicator":"#DCBD4E","buttonBg":"#23A2FF","buttonColor":"#FFFFFF","centerChannelBg":"#ffffff","centerChannelColor":"#333333","codeTheme":"github","image":"/static/files/a4a388b38b32678e83823ef1b3e17766.png","linkColor":"#2389d7","mentionBg":"#2389d7","mentionColor":"#ffffff","mentionHighlightBg":"#fff2bb","mentionHighlightLink":"#2f81b7","newMessageSeparator":"#FF8800","onlineIndicator":"#7DBE00","sidebarBg":"#fafafa","sidebarHeaderBg":"#3481B9","sidebarHeaderTextColor":"#ffffff","sidebarText":"#333333","sidebarTextActiveBorder":"#378FD2","sidebarTextActiveColor":"#111111","sidebarTextHoverBg":"#e6f2fa","sidebarUnreadText":"#333333","type":"Mattermost"}`),
UseMilitaryTime: ptrStr("true"),
CollapsePreviews: ptrStr("true"),
MessageDisplay: ptrStr("compact"),
ColorizeUsernames: ptrStr("true"),
ChannelDisplayMode: ptrStr("centered"),
TutorialStep: ptrStr("3"),
UseMarkdownPreview: ptrStr("true"),
UseFormatting: ptrStr("true"),
ShowUnreadSection: ptrStr("true"),
EmailInterval: ptrStr("immediately"),
Username: &username,
Email: ptrStr(model.NewId() + "@example.com"),
Theme: ptrStr(`{"awayIndicator":"#DCBD4E","buttonBg":"#23A2FF","buttonColor":"#FFFFFF","centerChannelBg":"#ffffff","centerChannelColor":"#333333","codeTheme":"github","image":"/static/files/a4a388b38b32678e83823ef1b3e17766.png","linkColor":"#2389d7","mentionBg":"#2389d7","mentionColor":"#ffffff","mentionHighlightBg":"#fff2bb","mentionHighlightLink":"#2f81b7","newMessageSeparator":"#FF8800","onlineIndicator":"#7DBE00","sidebarBg":"#fafafa","sidebarHeaderBg":"#3481B9","sidebarHeaderTextColor":"#ffffff","sidebarText":"#333333","sidebarTextActiveBorder":"#378FD2","sidebarTextActiveColor":"#111111","sidebarTextHoverBg":"#e6f2fa","sidebarUnreadText":"#333333","type":"Mattermost"}`),
UseMilitaryTime: ptrStr("true"),
CollapsePreviews: ptrStr("true"),
MessageDisplay: ptrStr("compact"),
ColorizeUsernames: ptrStr("true"),
ChannelDisplayMode: ptrStr("centered"),
TutorialStep: ptrStr("3"),
UseMarkdownPreview: ptrStr("true"),
UseFormatting: ptrStr("true"),
ShowUnreadSection: ptrStr("true"),
EmailInterval: ptrStr("immediately"),
NameFormat: model.NewPointer("full_name"),
SendOnCtrlEnter: model.NewPointer("true"),
CodeBlockCtrlEnter: model.NewPointer("true"),
ShowJoinLeave: model.NewPointer("false"),
SyncDrafts: model.NewPointer("false"),
ShowUnreadScrollPosition: model.NewPointer("start_from_newest"),
LimitVisibleDmsGms: model.NewPointer("20"),
}
appErr = th.App.importUser(th.Context, &data, false)
assert.Nil(t, appErr)
@@ -1197,7 +1204,13 @@ func TestImportImportUser(t *testing.T) {
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "feature_enabled_markdown_preview", *data.UseMarkdownPreview)
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "formatting", *data.UseFormatting)
checkPreference(t, th.App, user.Id, model.PreferenceCategorySidebarSettings, "show_unread_section", *data.ShowUnreadSection)
checkPreference(t, th.App, user.Id, model.PreferenceCategoryNotifications, model.PreferenceNameEmailInterval, "30")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryDisplaySettings, model.PreferenceNameNameFormat, "full_name")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "send_on_ctrl_enter", "true")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "code_block_ctrl_enter", "true")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "join_leave", "false")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "sync_drafts", "false")
checkPreference(t, th.App, user.Id, model.PreferenceCategoryAdvancedSettings, "unread_scroll_position", "start_from_newest")
checkPreference(t, th.App, user.Id, model.PreferenceCategorySidebarSettings, model.PreferenceLimitVisibleDmsGms, "20")
// Change those preferences.
data = imports.UserImportData{
@@ -2556,6 +2569,44 @@ func TestImportimportMultiplePostLines(t *testing.T) {
AssertAllPostsCount(t, th.App, initialPostCountForTeam2, 1, team2.Id)
AssertAllPostsCount(t, th.App, initialPostCount, 15, team.Id)
t.Run("Importing a post with a reply both pinned", func(t *testing.T) {
// Create a thread.
importCreate := time.Now().Add(-1 * time.Minute).UnixMilli()
replyCreate := time.Now().Add(-30 * time.Second).UnixMilli()
data = imports.LineImportWorkerData{
LineImportData: imports.LineImportData{
Post: &imports.PostImportData{
Team: &teamName,
Channel: &channelName,
User: &user.Username,
Message: model.NewPointer("Thread Message"),
CreateAt: model.NewPointer(importCreate),
IsPinned: model.NewPointer(true),
Replies: &[]imports.ReplyImportData{{
User: &user.Username,
Message: model.NewPointer("Reply"),
CreateAt: model.NewPointer(replyCreate),
IsPinned: model.NewPointer(true),
}},
},
},
LineNumber: 1,
}
_, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true)
require.Nil(t, err)
resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate)
require.NoError(t, nErr)
require.Equal(t, 1, len(resultPosts))
require.True(t, resultPosts[0].IsPinned)
resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyCreate)
require.NoError(t, nErr)
require.Equal(t, 1, len(resultPosts))
require.True(t, resultPosts[0].IsPinned)
})
t.Run("Importing a post with a thread", func(t *testing.T) {
// Create a thread.
importCreate := time.Now().Add(-1 * time.Minute).UnixMilli()
@@ -2715,6 +2766,76 @@ func TestImportimportMultiplePostLines(t *testing.T) {
assert.ElementsMatch(t, []string{user.Id}, followers)
})
t.Run("Importing a post that someone flagged", func(t *testing.T) {
// Create a thread.
importCreate := time.Now().Add(-1 * time.Minute).UnixMilli()
data = imports.LineImportWorkerData{
LineImportData: imports.LineImportData{
Post: &imports.PostImportData{
Team: &teamName,
Channel: &channelName,
User: &user.Username,
Message: model.NewPointer("Flagged Message"),
CreateAt: model.NewPointer(importCreate),
FlaggedBy: &[]string{user.Username},
},
},
LineNumber: 1,
}
errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true)
require.Nil(t, err)
require.Equal(t, 0, errLine)
resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate)
require.NoError(t, nErr)
require.Equal(t, 1, len(resultPosts))
pref, err := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id)
require.NoError(t, err)
require.Len(t, pref, 1)
assert.Equal(t, user.Id, pref[0].UserId)
})
t.Run("Importing a post that someone flagged its replies", func(t *testing.T) {
// Create a thread.
importCreate := time.Now().Add(-1 * time.Minute).UnixMilli()
replyCreate := time.Now().Add(-30 * time.Second).UnixMilli()
data = imports.LineImportWorkerData{
LineImportData: imports.LineImportData{
Post: &imports.PostImportData{
Team: &teamName,
Channel: &channelName,
User: &user.Username,
Message: model.NewPointer("Flagged Message"),
CreateAt: model.NewPointer(importCreate),
Replies: &[]imports.ReplyImportData{{
User: &user.Username,
Message: model.NewPointer("Reply"),
CreateAt: model.NewPointer(replyCreate),
FlaggedBy: &[]string{user2.Username},
}},
},
},
LineNumber: 1,
}
errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true)
require.Nil(t, err)
require.Equal(t, 0, errLine)
resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyCreate)
require.NoError(t, nErr)
require.Equal(t, 1, len(resultPosts))
pref, err := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id)
require.NoError(t, err)
require.Len(t, pref, 1)
assert.Equal(t, user2.Id, pref[0].UserId)
})
}
func TestImportImportPost(t *testing.T) {

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

@@ -73,6 +73,14 @@ type UserImportData struct {
ShowUnreadSection *string `json:"show_unread_section,omitempty"`
DeleteAt *int64 `json:"delete_at,omitempty"`
SendOnCtrlEnter *string `json:"send_on_ctrl_enter,omitempty"`
CodeBlockCtrlEnter *string `json:"code_block_ctrl_enter,omitempty"`
ShowJoinLeave *string `json:"show_join_leave,omitempty"`
ShowUnreadScrollPosition *string `json:"show_unread_scroll_position,omitempty"`
SyncDrafts *string `json:"sync_drafts,omitempty"`
LimitVisibleDmsGms *string `json:"limit_visible_dms_gms,omitempty"`
NameFormat *string `json:"name_format,omitempty"`
Teams *[]UserTeamImportData `json:"teams,omitempty"`
Theme *string `json:"theme,omitempty"`
@@ -169,6 +177,7 @@ type ReplyImportData struct {
FlaggedBy *[]string `json:"flagged_by,omitempty"`
Reactions *[]ReactionImportData `json:"reactions,omitempty"`
Attachments *[]AttachmentImportData `json:"attachments,omitempty"`
IsPinned *bool `json:"is_pinned,omitempty"`
}
type PostImportData struct {
@@ -210,7 +219,7 @@ type DirectPostImportData struct {
CreateAt *int64 `json:"create_at"`
EditAt *int64 `json:"edit_at"`
FlaggedBy *[]string `json:"flagged_by"`
FlaggedBy *[]string `json:"flagged_by,omitempty"`
Reactions *[]ReactionImportData `json:"reactions"`
Replies *[]ReplyImportData `json:"replies"`
Attachments *[]AttachmentImportData `json:"attachments"`

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

@@ -295,7 +295,7 @@ func (a *App) createUserOrGuest(c request.CTX, user *model.User, guest bool) (*m
a.sendUpdatedUserEvent(*nUser)
}
recommendedNextStepsPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceRecommendedNextSteps, Name: "hide", Value: "false"}
recommendedNextStepsPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryRecommendedNextSteps, Name: model.PreferenceNameRecommendedNextStepsHide, Value: "false"}
tutorialStepPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryTutorialSteps, Name: ruser.Id, Value: "0"}
gmASdmPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceCategorySystemNotice, Name: "GMasDM", Value: "true"}