From 326eb2242a9c6a3cbcecb590dc086c99f762f00f Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Mon, 14 Jun 2021 08:25:44 -0400 Subject: [PATCH] Change Post.IsFollowing to a pointer and set to nil for responses to updates to Posts (#17774) --- app/post.go | 5 +++++ app/post_test.go | 2 +- model/post.go | 6 ++++-- store/sqlstore/post_store.go | 6 ++++-- store/storetest/post_store.go | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/post.go b/app/post.go index cfcf2f05d3..54f25061c5 100644 --- a/app/post.go +++ b/app/post.go @@ -649,6 +649,11 @@ func (a *App) UpdatePost(c *request.Context, post *model.Post, safeUpdate bool) rpost = a.PreparePostForClient(rpost, false, true) + // Ensure IsFollowing is nil since this updated post will be broadcast to all users + // and we don't want to have to populate it for every single user and broadcast to each + // individually. + rpost.IsFollowing = nil + message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_POST_EDITED, "", rpost.ChannelId, "", nil) message.Add("post", rpost.ToJson()) a.Publish(message) diff --git a/app/post_test.go b/app/post_test.go index 9bdc17d162..70f93aef14 100644 --- a/app/post_test.go +++ b/app/post_test.go @@ -2080,7 +2080,7 @@ func TestCollapsedThreadFetch(t *testing.T) { require.EqualValues(t, []string{user1.Id}, []string{l.Posts[postRoot.Id].Participants[0].Id}) require.Empty(t, l.Posts[postRoot.Id].Participants[0].Email) require.NotZero(t, l.Posts[postRoot.Id].LastReplyAt) - require.True(t, l.Posts[postRoot.Id].IsFollowing) + require.True(t, *l.Posts[postRoot.Id].IsFollowing) // try extended fetch l, err = th.App.GetPostsForChannelAroundLastUnread(channel.Id, user1.Id, 10, 10, true, true, true) diff --git a/model/post.go b/model/post.go index ff5795cb4a..dd66d69166 100644 --- a/model/post.go +++ b/model/post.go @@ -102,7 +102,7 @@ type Post struct { ReplyCount int64 `json:"reply_count" db:"-"` LastReplyAt int64 `json:"last_reply_at" db:"-"` Participants []*User `json:"participants" db:"-"` - IsFollowing bool `json:"is_following" db:"-"` // for root posts in collapsed thread mode indicates if the current user is following this thread + IsFollowing *bool `json:"is_following,omitempty" db:"-"` // for root posts in collapsed thread mode indicates if the current user is following this thread Metadata *PostMetadata `json:"metadata,omitempty" db:"-"` } @@ -207,7 +207,9 @@ func (o *Post) ShallowCopy(dst *Post) error { dst.Participants = o.Participants dst.LastReplyAt = o.LastReplyAt dst.Metadata = o.Metadata - dst.IsFollowing = o.IsFollowing + if o.IsFollowing != nil { + dst.IsFollowing = NewBool(*o.IsFollowing) + } dst.RemoteId = o.RemoteId return nil } diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index 5e9440cfa1..bb675c6e89 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -34,7 +34,7 @@ type SqlPostStore struct { type postWithExtra struct { ThreadReplyCount int64 - IsFollowing bool + IsFollowing *bool ThreadParticipants model.StringArray model.Post } @@ -739,7 +739,9 @@ func (s *SqlPostStore) prepareThreadedResponse(posts []*postWithExtra, extended, } processPost := func(p *postWithExtra) error { p.Post.ReplyCount = p.ThreadReplyCount - p.Post.IsFollowing = p.IsFollowing + if p.IsFollowing != nil { + p.Post.IsFollowing = model.NewBool(*p.IsFollowing) + } for _, th := range p.ThreadParticipants { var participant *model.User for _, u := range users { diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index ea547802e0..1ee3eb90e1 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -451,7 +451,7 @@ func testPostStoreGetForThread(t *testing.T, ss store.Store) { r1, err := ss.Post().Get(context.Background(), o1.Id, false, true, false, o1.UserId) require.NoError(t, err) require.Equal(t, r1.Posts[o1.Id].CreateAt, o1.CreateAt, "invalid returned post") - require.True(t, r1.Posts[o1.Id].IsFollowing) + require.True(t, *r1.Posts[o1.Id].IsFollowing) } func testPostStoreGetSingle(t *testing.T, ss store.Store) {