MM-58038: Use context to call master for DeletePost (#27098)
Calling app.DeletePost immediately after creating a post is susceptible to replica lag because we were calling the replica to check for the post. We fix this by passing a context to always query master. https://mattermost.atlassian.net/browse/MM-58038 ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
09c0eb7e7a
Коммит
6f3327ce0f
@@ -1750,7 +1750,7 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
audit.AddEventParameter(auditRec, "post_root_id", postRootId)
|
||||
|
||||
if ok && len(postRootId) == 26 {
|
||||
rootPost, err := c.App.GetSinglePost(postRootId, false)
|
||||
rootPost, err := c.App.GetSinglePost(c.AppContext, postRootId, false)
|
||||
if err != nil {
|
||||
c.Err = err
|
||||
return
|
||||
|
||||
@@ -176,7 +176,7 @@ func localAddChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
audit.AddEventParameter(auditRec, "post_root_id", postRootId)
|
||||
|
||||
if ok && len(postRootId) == 26 {
|
||||
rootPost, err := c.App.GetSinglePost(postRootId, false)
|
||||
rootPost, err := c.App.GetSinglePost(c.AppContext, postRootId, false)
|
||||
if err != nil {
|
||||
c.Err = err
|
||||
return
|
||||
|
||||
@@ -563,7 +563,7 @@ func getEditHistoryForPost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.SetPermissionError(model.PermissionEditPost)
|
||||
return
|
||||
@@ -600,7 +600,7 @@ func deletePost(c *Context, w http.ResponseWriter, _ *http.Request) {
|
||||
defer c.LogAuditRecWithLevel(auditRec, app.LevelContent)
|
||||
audit.AddEventParameter(auditRec, "post_id", c.Params.PostId)
|
||||
|
||||
post, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
post, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.SetPermissionError(model.PermissionDeletePost)
|
||||
return
|
||||
@@ -844,7 +844,7 @@ func updatePost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.SetPermissionError(model.PermissionEditPost)
|
||||
return
|
||||
@@ -916,7 +916,7 @@ func patchPost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
// Updating the file_ids of a post is not a supported operation and will be ignored
|
||||
post.FileIds = nil
|
||||
|
||||
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.SetPermissionError(model.PermissionEditPost)
|
||||
return
|
||||
@@ -1023,7 +1023,7 @@ func saveIsPinnedPost(c *Context, w http.ResponseWriter, isPinned bool) {
|
||||
audit.AddEventParameter(auditRec, "post_id", c.Params.PostId)
|
||||
defer c.LogAuditRecWithLevel(auditRec, app.LevelContent)
|
||||
|
||||
post, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
post, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.SetPermissionError(model.PermissionReadChannelContent)
|
||||
return
|
||||
@@ -1117,7 +1117,7 @@ func unacknowledgePost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
_, err := c.App.GetSinglePost(c.Params.PostId, false)
|
||||
_, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
|
||||
if err != nil {
|
||||
c.Err = err
|
||||
return
|
||||
|
||||
@@ -1645,7 +1645,7 @@ func TestPinPost(t *testing.T) {
|
||||
_, err := client.PinPost(context.Background(), post.Id)
|
||||
require.NoError(t, err)
|
||||
|
||||
rpost, appErr := th.App.GetSinglePost(post.Id, false)
|
||||
rpost, appErr := th.App.GetSinglePost(th.Context, post.Id, false)
|
||||
require.Nil(t, appErr)
|
||||
require.True(t, rpost.IsPinned, "failed to pin post")
|
||||
|
||||
@@ -1675,7 +1675,7 @@ func TestUnpinPost(t *testing.T) {
|
||||
_, err := client.UnpinPost(context.Background(), pinnedPost.Id)
|
||||
require.NoError(t, err)
|
||||
|
||||
rpost, appErr := th.App.GetSinglePost(pinnedPost.Id, false)
|
||||
rpost, appErr := th.App.GetSinglePost(th.Context, pinnedPost.Id, false)
|
||||
require.Nil(t, appErr)
|
||||
require.False(t, rpost.IsPinned)
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ func updatePreferences(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
for _, pref := range preferences {
|
||||
if pref.Category == model.PreferenceCategoryFlaggedPost {
|
||||
post, err := c.App.GetSinglePost(pref.Name, false)
|
||||
post, err := c.App.GetSinglePost(c.AppContext, pref.Name, false)
|
||||
if err != nil {
|
||||
c.SetInvalidParam("preference.name")
|
||||
return
|
||||
|
||||
@@ -820,7 +820,7 @@ type AppIface interface {
|
||||
GetSidebarCategoriesForTeamForUser(c request.CTX, userID, teamID string) (*model.OrderedSidebarCategories, *model.AppError)
|
||||
GetSidebarCategory(c request.CTX, categoryId string) (*model.SidebarCategoryWithChannels, *model.AppError)
|
||||
GetSidebarCategoryOrder(c request.CTX, userID, teamID string) ([]string, *model.AppError)
|
||||
GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError)
|
||||
GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError)
|
||||
GetSiteURL() string
|
||||
GetStatus(userID string) (*model.Status, *model.AppError)
|
||||
GetStatusFromCache(userID string) *model.Status
|
||||
@@ -830,7 +830,7 @@ type AppIface interface {
|
||||
GetTeamByName(name string) (*model.Team, *model.AppError)
|
||||
GetTeamIcon(team *model.Team) ([]byte, *model.AppError)
|
||||
GetTeamIdFromQuery(rctx request.CTX, query url.Values) (string, *model.AppError)
|
||||
GetTeamMember(c request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError)
|
||||
GetTeamMember(rctx request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError)
|
||||
GetTeamMembers(teamID string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembersByIds(teamID string, userIDs []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembersForUser(c request.CTX, userID string, excludeTeamID string, includeDeleted bool) ([]*model.TeamMember, *model.AppError)
|
||||
|
||||
@@ -2700,7 +2700,7 @@ func (a *App) MarkChannelAsUnreadFromPost(c request.CTX, postID string, userID s
|
||||
if !collapsedThreadsSupported || !a.IsCRTEnabledForUser(c, userID) {
|
||||
return a.markChannelAsUnreadFromPostCRTUnsupported(c, postID, userID)
|
||||
}
|
||||
post, err := a.GetSinglePost(postID, false)
|
||||
post, err := a.GetSinglePost(c, postID, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -2727,7 +2727,7 @@ func (a *App) MarkChannelAsUnreadFromPost(c request.CTX, postID string, userID s
|
||||
}
|
||||
|
||||
func (a *App) markChannelAsUnreadFromPostCRTUnsupported(c request.CTX, postID string, userID string) (*model.ChannelUnreadAt, *model.AppError) {
|
||||
post, appErr := a.GetSinglePost(postID, false)
|
||||
post, appErr := a.GetSinglePost(c, postID, false)
|
||||
if appErr != nil {
|
||||
return nil, appErr
|
||||
}
|
||||
@@ -2766,7 +2766,7 @@ func (a *App) markChannelAsUnreadFromPostCRTUnsupported(c request.CTX, postID st
|
||||
// If there are replies with mentions below the marked reply in the thread, then sum the mentions for the threads mention badge.
|
||||
// In CRT Unsupported Client: Channel is marked as unread and new messages line inserted above the marked post.
|
||||
// Badge on channel sums mentions in all posts (root & replies) including and below the post that was marked unread.
|
||||
rootPost, appErr := a.GetSinglePost(post.RootId, false)
|
||||
rootPost, appErr := a.GetSinglePost(c, post.RootId, false)
|
||||
if appErr != nil {
|
||||
return nil, appErr
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func (a *App) DoPostActionWithCookie(c request.CTX, postID, actionId, userID, se
|
||||
// Start all queries here for parallel execution
|
||||
pchan := make(chan store.StoreResult[*model.Post], 1)
|
||||
go func() {
|
||||
post, err := a.Srv().Store().Post().GetSingle(postID, false)
|
||||
post, err := a.Srv().Store().Post().GetSingle(c, postID, false)
|
||||
pchan <- store.StoreResult[*model.Post]{Data: post, NErr: err}
|
||||
close(pchan)
|
||||
}()
|
||||
|
||||
@@ -530,7 +530,7 @@ func TestPostActionProps(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
assert.True(t, len(clientTriggerId) == 26)
|
||||
|
||||
newPost, nErr := th.App.Srv().Store().Post().GetSingle(post.Id, false)
|
||||
newPost, nErr := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
assert.True(t, newPost.IsPinned)
|
||||
|
||||
@@ -9818,7 +9818,7 @@ func (a *OpenTracingAppLayer) GetSidebarCategoryOrder(c request.CTX, userID stri
|
||||
return resultVar0, resultVar1
|
||||
}
|
||||
|
||||
func (a *OpenTracingAppLayer) GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError) {
|
||||
func (a *OpenTracingAppLayer) GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError) {
|
||||
origCtx := a.ctx
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetSinglePost")
|
||||
|
||||
@@ -9830,7 +9830,7 @@ func (a *OpenTracingAppLayer) GetSinglePost(postID string, includeDeleted bool)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
resultVar0, resultVar1 := a.app.GetSinglePost(postID, includeDeleted)
|
||||
resultVar0, resultVar1 := a.app.GetSinglePost(rctx, postID, includeDeleted)
|
||||
|
||||
if resultVar1 != nil {
|
||||
span.LogFields(spanlog.Error(resultVar1))
|
||||
@@ -10089,7 +10089,7 @@ func (a *OpenTracingAppLayer) GetTeamIdFromQuery(rctx request.CTX, query url.Val
|
||||
return resultVar0, resultVar1
|
||||
}
|
||||
|
||||
func (a *OpenTracingAppLayer) GetTeamMember(c request.CTX, teamID string, userID string) (*model.TeamMember, *model.AppError) {
|
||||
func (a *OpenTracingAppLayer) GetTeamMember(rctx request.CTX, teamID string, userID string) (*model.TeamMember, *model.AppError) {
|
||||
origCtx := a.ctx
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetTeamMember")
|
||||
|
||||
@@ -10101,7 +10101,7 @@ func (a *OpenTracingAppLayer) GetTeamMember(c request.CTX, teamID string, userID
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
resultVar0, resultVar1 := a.app.GetTeamMember(c, teamID, userID)
|
||||
resultVar0, resultVar1 := a.app.GetTeamMember(rctx, teamID, userID)
|
||||
|
||||
if resultVar1 != nil {
|
||||
span.LogFields(spanlog.Error(resultVar1))
|
||||
|
||||
@@ -704,7 +704,7 @@ func (api *PluginAPI) GetPostThread(postID string) (*model.PostList, *model.AppE
|
||||
}
|
||||
|
||||
func (api *PluginAPI) GetPost(postID string) (*model.Post, *model.AppError) {
|
||||
post, appErr := api.app.GetSinglePost(postID, false)
|
||||
post, appErr := api.app.GetSinglePost(api.ctx, postID, false)
|
||||
if post != nil {
|
||||
post = post.ForPlugin()
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ func TestHookMessageWillBePosted(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
assert.Equal(t, "message", post.Message)
|
||||
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(post.Id, false)
|
||||
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
|
||||
require.NoError(t, errSingle)
|
||||
assert.Equal(t, "message", retrievedPost.Message)
|
||||
})
|
||||
@@ -229,7 +229,7 @@ func TestHookMessageWillBePosted(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
assert.Equal(t, "message_fromplugin", post.Message)
|
||||
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(post.Id, false)
|
||||
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
|
||||
require.NoError(t, errSingle)
|
||||
assert.Equal(t, "message_fromplugin", retrievedPost.Message)
|
||||
})
|
||||
@@ -1606,7 +1606,7 @@ func TestHookMessagesWillBeConsumed(t *testing.T) {
|
||||
_, err := th.App.CreatePost(th.Context, newPost, th.BasicChannel, false, true)
|
||||
require.Nil(t, err)
|
||||
|
||||
post, err := th.App.GetSinglePost(newPost.Id, true)
|
||||
post, err := th.App.GetSinglePost(th.Context, newPost.Id, true)
|
||||
require.Nil(t, err)
|
||||
assert.Equal(t, "message", post.Message)
|
||||
})
|
||||
@@ -1629,7 +1629,7 @@ func TestHookMessagesWillBeConsumed(t *testing.T) {
|
||||
_, err := th.App.CreatePost(th.Context, newPost, th.BasicChannel, false, true)
|
||||
require.Nil(t, err)
|
||||
|
||||
post, err := th.App.GetSinglePost(newPost.Id, true)
|
||||
post, err := th.App.GetSinglePost(th.Context, newPost.Id, true)
|
||||
require.Nil(t, err)
|
||||
assert.Equal(t, "mwbc_plugin:message", post.Message)
|
||||
})
|
||||
|
||||
@@ -130,7 +130,7 @@ func (a *App) deduplicateCreatePost(rctx request.CTX, post *model.Post) (foundPo
|
||||
|
||||
// If the other thread finished creating the post, return the created post back to the
|
||||
// client, making the API call feel idempotent.
|
||||
actualPost, err := a.GetSinglePost(postID, false)
|
||||
actualPost, err := a.GetSinglePost(rctx, postID, false)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("deduplicateCreatePost", "api.post.deduplicate_create_post.failed_to_get", nil, "", http.StatusInternalServerError).Wrap(err)
|
||||
}
|
||||
@@ -795,7 +795,7 @@ func (a *App) publishWebsocketEventForPermalinkPost(c request.CTX, post *model.P
|
||||
return false, nil
|
||||
}
|
||||
|
||||
previewedPost, err := a.GetSinglePost(previewedPostID, false)
|
||||
previewedPost, err := a.GetSinglePost(c, previewedPostID, false)
|
||||
if err != nil {
|
||||
if err.StatusCode == http.StatusNotFound {
|
||||
a.CountNotificationReason(model.NotificationStatusError, model.NotificationTypeAll, model.NotificationReasonFetchError)
|
||||
@@ -880,7 +880,7 @@ func (a *App) publishWebsocketEventForPermalinkPost(c request.CTX, post *model.P
|
||||
}
|
||||
|
||||
func (a *App) PatchPost(c request.CTX, postID string, patch *model.PostPatch) (*model.Post, *model.AppError) {
|
||||
post, err := a.GetSinglePost(postID, false)
|
||||
post, err := a.GetSinglePost(c, postID, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -971,8 +971,8 @@ func (a *App) GetPostsSince(options model.GetPostsSinceOptions) (*model.PostList
|
||||
return postList, nil
|
||||
}
|
||||
|
||||
func (a *App) GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError) {
|
||||
post, err := a.Srv().Store().Post().GetSingle(postID, includeDeleted)
|
||||
func (a *App) GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError) {
|
||||
post, err := a.Srv().Store().Post().GetSingle(rctx, postID, includeDeleted)
|
||||
if err != nil {
|
||||
var nfErr *store.ErrNotFound
|
||||
switch {
|
||||
@@ -1362,7 +1362,7 @@ func (a *App) GetPostsForChannelAroundLastUnread(c request.CTX, channelID, userI
|
||||
}
|
||||
|
||||
func (a *App) DeletePost(c request.CTX, postID, deleteByID string) (*model.Post, *model.AppError) {
|
||||
post, err := a.Srv().Store().Post().GetSingle(postID, false)
|
||||
post, err := a.Srv().Store().Post().GetSingle(sqlstore.RequestContextWithMaster(c), postID, false)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("DeletePost", "app.post.get.app_error", nil, "", http.StatusBadRequest).Wrap(err)
|
||||
}
|
||||
@@ -1730,7 +1730,7 @@ func (a *App) SearchPostsForUser(c request.CTX, terms string, userID string, tea
|
||||
func (a *App) GetFileInfosForPostWithMigration(rctx request.CTX, postID string, includeDeleted bool) ([]*model.FileInfo, *model.AppError) {
|
||||
pchan := make(chan store.StoreResult[*model.Post], 1)
|
||||
go func() {
|
||||
post, err := a.Srv().Store().Post().GetSingle(postID, includeDeleted)
|
||||
post, err := a.Srv().Store().Post().GetSingle(rctx, postID, includeDeleted)
|
||||
pchan <- store.StoreResult[*model.Post]{Data: post, NErr: err}
|
||||
close(pchan)
|
||||
}()
|
||||
@@ -2077,7 +2077,7 @@ func (a *App) GetThreadMembershipsForUser(userID, teamID string) ([]*model.Threa
|
||||
}
|
||||
|
||||
func (a *App) GetPostIfAuthorized(c request.CTX, postID string, session *model.Session, includeDeleted bool) (*model.Post, *model.AppError) {
|
||||
post, err := a.GetSinglePost(postID, includeDeleted)
|
||||
post, err := a.GetSinglePost(c, postID, includeDeleted)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -2269,7 +2269,7 @@ func (a *App) CheckPostReminders(rctx request.CTX) {
|
||||
|
||||
func (a *App) GetPostInfo(c request.CTX, postID string) (*model.PostInfo, *model.AppError) {
|
||||
userID := c.Session().UserId
|
||||
post, appErr := a.GetSinglePost(postID, false)
|
||||
post, appErr := a.GetSinglePost(c, postID, false)
|
||||
if appErr != nil {
|
||||
return nil, appErr
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
)
|
||||
|
||||
func (a *App) SaveAcknowledgementForPost(c request.CTX, postID, userID string) (*model.PostAcknowledgement, *model.AppError) {
|
||||
post, err := a.GetSinglePost(postID, false)
|
||||
post, err := a.GetSinglePost(c, postID, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -62,7 +62,7 @@ func (a *App) SaveAcknowledgementForPost(c request.CTX, postID, userID string) (
|
||||
}
|
||||
|
||||
func (a *App) DeleteAcknowledgementForPost(c request.CTX, postID, userID string) *model.AppError {
|
||||
post, err := a.GetSinglePost(postID, false)
|
||||
post, err := a.GetSinglePost(c, postID, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func testSaveAcknowledgementForPost(t *testing.T) {
|
||||
_, err = th.App.SaveAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
post, err = th.App.GetSinglePost(post.Id, false)
|
||||
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Greater(t, post.UpdateAt, oldUpdateAt)
|
||||
@@ -91,7 +91,7 @@ func testDeleteAcknowledgementForPost(t *testing.T) {
|
||||
_, err := th.App.SaveAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
post, err = th.App.GetSinglePost(post.Id, false)
|
||||
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
|
||||
require.Nil(t, err)
|
||||
|
||||
oldUpdateAt := post.UpdateAt
|
||||
@@ -99,7 +99,7 @@ func testDeleteAcknowledgementForPost(t *testing.T) {
|
||||
err = th.App.DeleteAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
post, err = th.App.GetSinglePost(post.Id, false)
|
||||
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Greater(t, post.UpdateAt, oldUpdateAt)
|
||||
|
||||
@@ -645,7 +645,7 @@ func (a *App) getLinkMetadata(c request.CTX, requestURL string, timestamp int64,
|
||||
if looksLikeAPermalink(requestURL, a.GetSiteURL()) && *a.Config().ServiceSettings.EnablePermalinkPreviews {
|
||||
referencedPostID := requestURL[len(requestURL)-26:]
|
||||
|
||||
referencedPost, appErr := a.GetSinglePost(referencedPostID, false)
|
||||
referencedPost, appErr := a.GetSinglePost(c, referencedPostID, false)
|
||||
// TODO: Look into saving a value in the LinkMetadata.Data field to prevent perpetually re-querying for the deleted post.
|
||||
if appErr != nil {
|
||||
return nil, nil, nil, appErr
|
||||
|
||||
@@ -257,7 +257,7 @@ func TestAttachFilesToPost(t *testing.T) {
|
||||
assert.Len(t, infos, 1)
|
||||
assert.Equal(t, info2.Id, infos[0].Id)
|
||||
|
||||
updated, appErr := th.App.GetSinglePost(post.Id, false)
|
||||
updated, appErr := th.App.GetSinglePost(th.Context, post.Id, false)
|
||||
require.Nil(t, appErr)
|
||||
assert.Len(t, updated.FileIds, 1)
|
||||
assert.Contains(t, updated.FileIds, info2.Id)
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
)
|
||||
|
||||
func (a *App) SaveReactionForPost(c request.CTX, reaction *model.Reaction) (*model.Reaction, *model.AppError) {
|
||||
post, err := a.GetSinglePost(reaction.PostId, false)
|
||||
post, err := a.GetSinglePost(c, reaction.PostId, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -132,7 +132,7 @@ func populateEmptyReactions(postIDs []string, reactions map[string][]*model.Reac
|
||||
}
|
||||
|
||||
func (a *App) DeleteReactionForPost(c request.CTX, reaction *model.Reaction) *model.AppError {
|
||||
post, err := a.GetSinglePost(reaction.PostId, false)
|
||||
post, err := a.GetSinglePost(c, reaction.PostId, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -969,8 +969,8 @@ func (a *App) GetTeamsForUser(userID string) ([]*model.Team, *model.AppError) {
|
||||
return teams, nil
|
||||
}
|
||||
|
||||
func (a *App) GetTeamMember(c request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError) {
|
||||
teamMember, err := a.Srv().Store().Team().GetMember(sqlstore.RequestContextWithMaster(c), teamID, userID)
|
||||
func (a *App) GetTeamMember(rctx request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError) {
|
||||
teamMember, err := a.Srv().Store().Team().GetMember(sqlstore.RequestContextWithMaster(rctx), teamID, userID)
|
||||
if err != nil {
|
||||
var nfErr *store.ErrNotFound
|
||||
switch {
|
||||
|
||||
@@ -2723,7 +2723,7 @@ func (a *App) UpdateThreadFollowForUserFromChannelAdd(c request.CTX, userID, tea
|
||||
return model.NewAppError("UpdateThreadFollowForUserFromChannelAdd", "app.user.update_thread_follow_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
|
||||
}
|
||||
|
||||
post, appErr := a.GetSinglePost(threadID, false)
|
||||
post, appErr := a.GetSinglePost(c, threadID, false)
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
@@ -2772,7 +2772,7 @@ func (a *App) UpdateThreadFollowForUserFromChannelAdd(c request.CTX, userID, tea
|
||||
}
|
||||
|
||||
func (a *App) UpdateThreadReadForUserByPost(c request.CTX, currentSessionId, userID, teamID, threadID, postID string) (*model.ThreadResponse, *model.AppError) {
|
||||
post, err := a.GetSinglePost(postID, false)
|
||||
post, err := a.GetSinglePost(c, postID, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -2805,7 +2805,7 @@ func (a *App) UpdateThreadReadForUser(c request.CTX, currentSessionId, userID, t
|
||||
return nil, model.NewAppError("UpdateThreadReadForUser", "app.user.update_thread_read_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
|
||||
}
|
||||
|
||||
post, err := a.GetSinglePost(threadID, false)
|
||||
post, err := a.GetSinglePost(c, threadID, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -6771,7 +6771,7 @@ func (s *OpenTracingLayerPostStore) GetRepliesForExport(parentID string) ([]*mod
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||
func (s *OpenTracingLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.GetSingle")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
@@ -6780,7 +6780,7 @@ func (s *OpenTracingLayerPostStore) GetSingle(id string, inclDeleted bool) (*mod
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.PostStore.GetSingle(id, inclDeleted)
|
||||
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
|
||||
@@ -7685,11 +7685,11 @@ func (s *RetryLayerPostStore) GetRepliesForExport(parentID string) ([]*model.Rep
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||
func (s *RetryLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.PostStore.GetSingle(id, inclDeleted)
|
||||
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ func (s SearchFileInfoStore) indexFile(rctx request.CTX, file *model.FileInfo) {
|
||||
if file.PostId == "" {
|
||||
return
|
||||
}
|
||||
post, postErr := s.rootStore.Post().GetSingle(file.PostId, false)
|
||||
post, postErr := s.rootStore.Post().GetSingle(rctx, file.PostId, false)
|
||||
if postErr != nil {
|
||||
rctx.Logger().Error("Couldn't get post for file for SearchEngine indexing.", mlog.String("post_id", file.PostId), mlog.String("search_engine", engineCopy.GetName()), mlog.String("file_info_id", file.Id), mlog.Err(postErr))
|
||||
return
|
||||
|
||||
@@ -833,7 +833,7 @@ func (s *SqlPostStore) Get(ctx context.Context, id string, opts model.GetPostsOp
|
||||
return pl, nil
|
||||
}
|
||||
|
||||
func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||
func (s *SqlPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select("p.*").
|
||||
From("Posts p").
|
||||
@@ -855,7 +855,7 @@ func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, erro
|
||||
}
|
||||
|
||||
var post model.Post
|
||||
err = s.GetReplicaX().Get(&post, queryString, args...)
|
||||
err = s.DBXFromContext(rctx.Context()).Get(&post, queryString, args...)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("Post", id)
|
||||
|
||||
@@ -945,7 +945,7 @@ func (s SqlTeamStore) UpdateMember(rctx request.CTX, member *model.TeamMember) (
|
||||
}
|
||||
|
||||
// GetMember returns a single member of the team that matches the teamId and userId provided as parameters.
|
||||
func (s SqlTeamStore) GetMember(ctx request.CTX, teamId string, userId string) (*model.TeamMember, error) {
|
||||
func (s SqlTeamStore) GetMember(rctx request.CTX, teamId string, userId string) (*model.TeamMember, error) {
|
||||
query := s.getTeamMembersWithSchemeSelectQuery().
|
||||
Where(sq.Eq{"TeamMembers.TeamId": teamId}).
|
||||
Where(sq.Eq{"TeamMembers.UserId": userId})
|
||||
@@ -956,7 +956,7 @@ func (s SqlTeamStore) GetMember(ctx request.CTX, teamId string, userId string) (
|
||||
}
|
||||
|
||||
var dbMember teamMemberWithSchemeRoles
|
||||
err = s.DBXFromContext(ctx.Context()).Get(&dbMember, queryString, args...)
|
||||
err = s.DBXFromContext(rctx.Context()).Get(&dbMember, queryString, args...)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("TeamMember", fmt.Sprintf("teamId=%s, userId=%s", teamId, userId))
|
||||
|
||||
@@ -353,7 +353,7 @@ type PostStore interface {
|
||||
Save(rctx request.CTX, post *model.Post) (*model.Post, error)
|
||||
Update(rctx request.CTX, newPost *model.Post, oldPost *model.Post) (*model.Post, error)
|
||||
Get(ctx context.Context, id string, opts model.GetPostsOptions, userID string, sanitizeOptions map[string]bool) (*model.PostList, error)
|
||||
GetSingle(id string, inclDeleted bool) (*model.Post, error)
|
||||
GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error)
|
||||
Delete(rctx request.CTX, postID string, timestamp int64, deleteByID string) error
|
||||
PermanentDeleteByUser(rctx request.CTX, userID string) error
|
||||
PermanentDeleteByChannel(rctx request.CTX, channelID string) error
|
||||
|
||||
@@ -916,9 +916,9 @@ func (_m *PostStore) GetRepliesForExport(parentID string) ([]*model.ReplyForExpo
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetSingle provides a mock function with given fields: id, inclDeleted
|
||||
func (_m *PostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||
ret := _m.Called(id, inclDeleted)
|
||||
// GetSingle provides a mock function with given fields: rctx, id, inclDeleted
|
||||
func (_m *PostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
|
||||
ret := _m.Called(rctx, id, inclDeleted)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for GetSingle")
|
||||
@@ -926,19 +926,19 @@ func (_m *PostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error)
|
||||
|
||||
var r0 *model.Post
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, bool) (*model.Post, error)); ok {
|
||||
return rf(id, inclDeleted)
|
||||
if rf, ok := ret.Get(0).(func(request.CTX, string, bool) (*model.Post, error)); ok {
|
||||
return rf(rctx, id, inclDeleted)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, bool) *model.Post); ok {
|
||||
r0 = rf(id, inclDeleted)
|
||||
if rf, ok := ret.Get(0).(func(request.CTX, string, bool) *model.Post); ok {
|
||||
r0 = rf(rctx, id, inclDeleted)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.Post)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, bool) error); ok {
|
||||
r1 = rf(id, inclDeleted)
|
||||
if rf, ok := ret.Get(1).(func(request.CTX, string, bool) error); ok {
|
||||
r1 = rf(rctx, id, inclDeleted)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ func testPostAcknowledgementsStoreSave(t *testing.T, rctx request.CTX, ss store.
|
||||
_, err := ss.PostAcknowledgement().Save(post.Id, userId1, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
post, err = ss.Post().GetSingle(post.Id, false)
|
||||
post, err = ss.Post().GetSingle(rctx, post.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Greater(t, post.UpdateAt, oldUpdateAt)
|
||||
})
|
||||
|
||||
@@ -180,7 +180,7 @@ func testPostStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, err = ss.Post().Save(rctx, &replyPost)
|
||||
require.NoError(t, err)
|
||||
|
||||
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
|
||||
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, rrootPost.UpdateAt, rootPost.UpdateAt)
|
||||
})
|
||||
@@ -293,7 +293,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, -1, errIdx)
|
||||
for _, post := range newPosts {
|
||||
storedPost, err := ss.Post().GetSingle(post.Id, false)
|
||||
storedPost, err := ss.Post().GetSingle(rctx, post.Id, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, post.ChannelId, storedPost.ChannelId)
|
||||
assert.Equal(t, post.Message, storedPost.Message)
|
||||
@@ -372,13 +372,13 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
require.Error(t, err)
|
||||
require.Equal(t, 1, errIdx)
|
||||
require.Nil(t, newPosts)
|
||||
storedPost, err := ss.Post().GetSingle(p3.Id, false)
|
||||
storedPost, err := ss.Post().GetSingle(rctx, p3.Id, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, p3.ChannelId, storedPost.ChannelId)
|
||||
assert.Equal(t, p3.Message, storedPost.Message)
|
||||
assert.Equal(t, p3.UserId, storedPost.UserId)
|
||||
|
||||
storedPost, err = ss.Post().GetSingle(p4.Id, false)
|
||||
storedPost, err = ss.Post().GetSingle(rctx, p4.Id, false)
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, storedPost)
|
||||
})
|
||||
@@ -407,7 +407,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, _, err = ss.Post().SaveMultiple([]*model.Post{&rootPost, &replyPost})
|
||||
require.NoError(t, err)
|
||||
|
||||
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
|
||||
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, rrootPost.UpdateAt, rootPost.UpdateAt)
|
||||
|
||||
@@ -429,7 +429,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, _, err = ss.Post().SaveMultiple([]*model.Post{&replyPost2, &replyPost3})
|
||||
require.NoError(t, err)
|
||||
|
||||
rrootPost2, err := ss.Post().GetSingle(rootPost.Id, false)
|
||||
rrootPost2, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, rrootPost2.UpdateAt, rrootPost.UpdateAt)
|
||||
})
|
||||
@@ -947,21 +947,21 @@ func testPostStoreGetSingle(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
err = ss.Post().Delete(rctx, o4.Id, model.GetMillis(), o4.UserId)
|
||||
require.NoError(t, err)
|
||||
|
||||
post, err := ss.Post().GetSingle(o1.Id, false)
|
||||
post, err := ss.Post().GetSingle(rctx, o1.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, post.CreateAt, o1.CreateAt, "invalid returned post")
|
||||
require.Equal(t, int64(1), post.ReplyCount, "wrong replyCount computed")
|
||||
|
||||
_, err = ss.Post().GetSingle(o2.Id, false)
|
||||
_, err = ss.Post().GetSingle(rctx, o2.Id, false)
|
||||
require.Error(t, err, "should not return deleted post")
|
||||
|
||||
post, err = ss.Post().GetSingle(o2.Id, true)
|
||||
post, err = ss.Post().GetSingle(rctx, o2.Id, true)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, post.CreateAt, o2.CreateAt, "invalid returned post")
|
||||
require.NotZero(t, post.DeleteAt, "DeleteAt should be non-zero")
|
||||
require.Zero(t, post.ReplyCount, "Post without replies should return zero ReplyCount")
|
||||
|
||||
_, err = ss.Post().GetSingle("123", false)
|
||||
_, err = ss.Post().GetSingle(rctx, "123", false)
|
||||
require.Error(t, err, "Missing id should have failed")
|
||||
}
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ func testThreadStorePopulation(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
thread1, err := ss.Thread().Get(newPosts[0].RootId)
|
||||
require.NoError(t, err)
|
||||
|
||||
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
|
||||
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, rrootPost.UpdateAt, rootPost.UpdateAt)
|
||||
|
||||
@@ -207,7 +207,7 @@ func testThreadStorePopulation(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, _, err = ss.Post().SaveMultiple([]*model.Post{&replyPost2, &replyPost3})
|
||||
require.NoError(t, err)
|
||||
|
||||
rrootPost2, err := ss.Post().GetSingle(rootPost.Id, false)
|
||||
rrootPost2, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Greater(t, rrootPost2.UpdateAt, rrootPost.UpdateAt)
|
||||
|
||||
@@ -969,7 +969,7 @@ func testVarious(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
gm1post1,
|
||||
}
|
||||
for i := range allPosts {
|
||||
updatedPost, err := ss.Post().GetSingle(allPosts[i].Id, true)
|
||||
updatedPost, err := ss.Post().GetSingle(rctx, allPosts[i].Id, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Fix some inconsistencies with how the post store returns posts vs. how the
|
||||
|
||||
@@ -6122,10 +6122,10 @@ func (s *TimerLayerPostStore) GetRepliesForExport(parentID string) ([]*model.Rep
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||
func (s *TimerLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
|
||||
start := time.Now()
|
||||
|
||||
result, err := s.PostStore.GetSingle(id, inclDeleted)
|
||||
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
|
||||
@@ -329,8 +329,9 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
|
||||
var appErr *model.AppError
|
||||
|
||||
post.RemoteId = model.NewString(rc.RemoteId)
|
||||
rctx := request.EmptyContext(scs.server.Log())
|
||||
|
||||
rpost, err := scs.server.GetStore().Post().GetSingle(post.Id, true)
|
||||
rpost, err := scs.server.GetStore().Post().GetSingle(rctx, post.Id, true)
|
||||
if err != nil {
|
||||
if _, ok := err.(errNotFound); !ok {
|
||||
return nil, fmt.Errorf("error checking sync post: %w", err)
|
||||
@@ -339,7 +340,7 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
|
||||
|
||||
if rpost == nil {
|
||||
// post doesn't exist; create new one
|
||||
rpost, appErr = scs.app.CreatePost(request.EmptyContext(scs.server.Log()), post, channel, true, true)
|
||||
rpost, appErr = scs.app.CreatePost(rctx, post, channel, true, true)
|
||||
if appErr == nil {
|
||||
scs.server.Log().Log(mlog.LvlSharedChannelServiceDebug, "Created sync post",
|
||||
mlog.String("post_id", post.Id),
|
||||
@@ -348,7 +349,7 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
|
||||
}
|
||||
} else if post.DeleteAt > 0 {
|
||||
// delete post
|
||||
rpost, appErr = scs.app.DeletePost(request.EmptyContext(scs.server.Log()), post.Id, post.UserId)
|
||||
rpost, appErr = scs.app.DeletePost(rctx, post.Id, post.UserId)
|
||||
if appErr == nil {
|
||||
scs.server.Log().Log(mlog.LvlSharedChannelServiceDebug, "Deleted sync post",
|
||||
mlog.String("post_id", post.Id),
|
||||
|
||||
@@ -322,7 +322,7 @@ func (scs *Service) handlePostError(postId string, task syncTask, rc *model.Remo
|
||||
}
|
||||
|
||||
// this post failed as part of a group of posts. Retry as an individual post.
|
||||
post, err := scs.server.GetStore().Post().GetSingle(postId, true)
|
||||
post, err := scs.server.GetStore().Post().GetSingle(request.EmptyContext(scs.server.Log()), postId, true)
|
||||
if err != nil {
|
||||
scs.server.Log().Log(mlog.LvlSharedChannelServiceError, "error fetching post for sync retry",
|
||||
mlog.String("remote", rc.DisplayName),
|
||||
|
||||
@@ -270,7 +270,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
|
||||
return fmt.Errorf("could not fetch new posts for sync: %w", err)
|
||||
}
|
||||
count := len(posts)
|
||||
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostCreateAt)
|
||||
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostCreateAt, scs.server.Log())
|
||||
|
||||
cache := postsSliceToMap(posts)
|
||||
|
||||
@@ -284,7 +284,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
|
||||
}
|
||||
posts = reducePostsSliceInCache(posts, cache)
|
||||
count += len(posts)
|
||||
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostUpdateAt)
|
||||
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostUpdateAt, scs.server.Log())
|
||||
}
|
||||
|
||||
sd.resultNextCursor = nextCursor
|
||||
@@ -293,7 +293,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostStore, timestamp int64) []*model.Post {
|
||||
func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostStore, timestamp int64, logger mlog.LoggerIFace) []*model.Post {
|
||||
// Append the posts individually, checking for root posts that might appear later in the list.
|
||||
// This is due to the UpdateAt collision handling algorithm where the order of posts is not based
|
||||
// on UpdateAt or CreateAt when the posts have the same UpdateAt value. Here we are guarding
|
||||
@@ -302,7 +302,7 @@ func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostSt
|
||||
// happens during load testing or bulk imports.
|
||||
for _, p := range posts {
|
||||
if p.RootId != "" {
|
||||
root, err := postStore.GetSingle(p.RootId, true)
|
||||
root, err := postStore.GetSingle(request.EmptyContext(logger), p.RootId, true)
|
||||
if err == nil {
|
||||
if (root.CreateAt >= timestamp || root.UpdateAt >= timestamp) && !containsPost(dest, root) {
|
||||
dest = append(dest, root)
|
||||
|
||||
Ссылка в новой задаче
Block a user