diff --git a/app/post.go b/app/post.go index 7ffb940fa5..7c7809bff9 100644 --- a/app/post.go +++ b/app/post.go @@ -297,6 +297,12 @@ func (a *App) CreatePost(c *request.Context, post *model.Post, channel *model.Ch } } + post = a.PreparePostForClient(post, true, false) + previewPost := post.GetPreviewPost() + if previewPost != nil { + post.AddProp(model.PostPropsPreviewedPost, previewPost.PostID) + } + rpost, nErr := a.Srv().Store.Post().Save(post) if nErr != nil { var appErr *model.AppError @@ -345,11 +351,6 @@ func (a *App) CreatePost(c *request.Context, post *model.Post, channel *model.Ch // to be done when we send the post over the websocket in handlePostEvents rpost = a.PreparePostForClient(rpost, true, false) - rpost, nErr = a.addPostPreviewProp(rpost) - if nErr != nil { - return nil, model.NewAppError("CreatePost", "app.post.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) - } - // Make sure poster is following the thread if *a.Config().ServiceSettings.ThreadAutoFollow && rpost.RootId != "" { _, err := a.Srv().Store.Thread().MaintainMembership(user.Id, rpost.RootId, store.ThreadMembershipOpts{ diff --git a/app/post_test.go b/app/post_test.go index 0654f30667..a472ac16c6 100644 --- a/app/post_test.go +++ b/app/post_test.go @@ -427,17 +427,17 @@ func TestPostChannelMentions(t *testing.T) { CreateAt: 0, } - result, err := th.App.CreatePostAsUser(th.Context, post, "", true) + post, err = th.App.CreatePostAsUser(th.Context, post, "", true) require.Nil(t, err) assert.Equal(t, map[string]interface{}{ "mention-test": map[string]interface{}{ "display_name": "Mention Test", "team_name": th.BasicTeam.Name, }, - }, result.GetProp("channel_mentions")) + }, post.GetProp("channel_mentions")) post.Message = fmt.Sprintf("goodbye, ~%v!", channelToMention.Name) - result, err = th.App.UpdatePost(th.Context, post, false) + result, err := th.App.UpdatePost(th.Context, post, false) require.Nil(t, err) assert.Equal(t, map[string]interface{}{ "mention-test": map[string]interface{}{ @@ -786,6 +786,44 @@ func TestCreatePost(t *testing.T) { assert.Equal(t, previewPost.GetProps(), model.StringInterface{"previewed_post": referencedPost.Id}) }) + + t.Run("creates a single record for a permalink preview post", func(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + + channelForPreview := th.CreateChannel(th.BasicTeam) + + referencedPost := &model.Post{ + ChannelId: th.BasicChannel.Id, + Message: "hello world", + UserId: th.BasicUser.Id, + } + referencedPost, err := th.App.CreatePost(th.Context, referencedPost, th.BasicChannel, false, false) + require.Nil(t, err) + + th.App.UpdateConfig(func(cfg *model.Config) { + *cfg.ServiceSettings.SiteURL = "http://foobar.com" + *cfg.ServiceSettings.EnablePermalinkPreviews = true + }) + + permalink := fmt.Sprintf("%s/%s/pl/%s", *th.App.Config().ServiceSettings.SiteURL, th.BasicTeam.Name, referencedPost.Id) + + previewPost := &model.Post{ + ChannelId: channelForPreview.Id, + Message: permalink, + UserId: th.BasicUser.Id, + } + + previewPost, err = th.App.CreatePost(th.Context, previewPost, channelForPreview, false, false) + require.Nil(t, err) + + sqlStore := th.GetSqlStore() + sql := fmt.Sprintf("select count(*) from Posts where Id = '%[1]s' or OriginalId = '%[1]s';", previewPost.Id) + val, err2 := sqlStore.GetMaster().SelectInt(sql) + require.NoError(t, err2) + + require.EqualValues(t, int64(1), val) + }) } func TestPatchPost(t *testing.T) {