MM-30970 Add Basic unreadMentions support for collapsed threads (#16407)
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
1bd7dc41bd
Коммит
c2036f614e
@@ -2100,7 +2100,7 @@ func (s SqlChannelStore) UpdateLastViewedAt(channelIds []string, userId string,
|
||||
times[t.Id] = t.LastPostAt
|
||||
}
|
||||
if updateThreads {
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now)
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now, true)
|
||||
}
|
||||
return times, nil
|
||||
}
|
||||
@@ -2136,7 +2136,7 @@ func (s SqlChannelStore) UpdateLastViewedAt(channelIds []string, userId string,
|
||||
}
|
||||
|
||||
if updateThreads {
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now)
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now, true)
|
||||
}
|
||||
return times, nil
|
||||
}
|
||||
@@ -2252,7 +2252,7 @@ func (s SqlChannelStore) UpdateLastViewedAtPost(unreadPost *model.Post, userID s
|
||||
}
|
||||
|
||||
if updateThreads {
|
||||
s.Thread().UpdateUnreadsByChannel(userID, threadsToUpdate, unreadDate)
|
||||
s.Thread().UpdateUnreadsByChannel(userID, threadsToUpdate, unreadDate, true)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
@@ -2282,7 +2282,7 @@ func (s SqlChannelStore) IncrementMentionCount(channelId string, userId string,
|
||||
return errors.Wrapf(err, "failed to Update ChannelMembers with channelId=%s and userId=%s", channelId, userId)
|
||||
}
|
||||
if updateThreads {
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now)
|
||||
s.Thread().UpdateUnreadsByChannel(userId, threadsToUpdate, now, false)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ func (s *SqlThreadStore) GetThreadsForUser(userId string, opts model.GetUserThre
|
||||
var threads []*JoinedThread
|
||||
|
||||
fetchConditions := sq.And{
|
||||
sq.Eq{"Posts.UserId": userId},
|
||||
sq.Eq{"ThreadMemberships.UserId": userId},
|
||||
sq.Eq{"ThreadMemberships.Following": true},
|
||||
}
|
||||
if !opts.Deleted {
|
||||
@@ -273,13 +273,18 @@ func (s *SqlThreadStore) DeleteMembershipForUser(userId string, postId string) e
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) CreateMembershipIfNeeded(userId, postId string, following bool) error {
|
||||
func (s *SqlThreadStore) CreateMembershipIfNeeded(userId, postId string, following, incrementMentions, updateFollowing bool) error {
|
||||
membership, err := s.GetMembershipForUser(userId, postId)
|
||||
now := utils.MillisFromTime(time.Now())
|
||||
if err == nil {
|
||||
if !membership.Following || membership.Following != following {
|
||||
membership.Following = following
|
||||
if (updateFollowing && !membership.Following || membership.Following != following) || incrementMentions {
|
||||
if updateFollowing {
|
||||
membership.Following = following
|
||||
}
|
||||
membership.LastUpdated = now
|
||||
if incrementMentions {
|
||||
membership.UnreadMentions += 1
|
||||
}
|
||||
_, err = s.UpdateMembership(membership)
|
||||
}
|
||||
return err
|
||||
@@ -290,12 +295,17 @@ func (s *SqlThreadStore) CreateMembershipIfNeeded(userId, postId string, followi
|
||||
if !errors.As(err, &nfErr) {
|
||||
return errors.Wrap(err, "failed to get thread membership")
|
||||
}
|
||||
mentions := 0
|
||||
if incrementMentions {
|
||||
mentions = 1
|
||||
}
|
||||
_, err = s.SaveMembership(&model.ThreadMembership{
|
||||
PostId: postId,
|
||||
UserId: userId,
|
||||
Following: following,
|
||||
LastViewed: 0,
|
||||
LastUpdated: now,
|
||||
PostId: postId,
|
||||
UserId: userId,
|
||||
Following: following,
|
||||
LastViewed: 0,
|
||||
LastUpdated: now,
|
||||
UnreadMentions: int64(mentions),
|
||||
})
|
||||
return err
|
||||
}
|
||||
@@ -321,19 +331,38 @@ func (s *SqlThreadStore) CollectThreadsWithNewerReplies(userId string, channelId
|
||||
return changedThreads, nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) UpdateUnreadsByChannel(userId string, changedThreads []string, timestamp int64) error {
|
||||
func (s *SqlThreadStore) UpdateUnreadsByChannel(userId string, changedThreads []string, timestamp int64, updateViewedTimestamp bool) error {
|
||||
if len(changedThreads) == 0 {
|
||||
return nil
|
||||
}
|
||||
updateQuery, updateArgs, _ := s.getQueryBuilder().
|
||||
|
||||
qb := s.getQueryBuilder().
|
||||
Update("ThreadMemberships").
|
||||
Where(sq.Eq{"UserId": userId, "PostId": changedThreads}).
|
||||
Set("LastUpdated", timestamp).
|
||||
Set("LastViewed", timestamp).
|
||||
ToSql()
|
||||
Set("LastUpdated", timestamp)
|
||||
|
||||
if updateViewedTimestamp {
|
||||
qb = qb.Set("LastViewed", timestamp)
|
||||
}
|
||||
updateQuery, updateArgs, _ := qb.ToSql()
|
||||
|
||||
if _, err := s.GetMaster().Exec(updateQuery, updateArgs...); err != nil {
|
||||
return errors.Wrap(err, "failed to update thread membership")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) GetPosts(threadId string, since int64) ([]*model.Post, error) {
|
||||
query, args, _ := s.getQueryBuilder().
|
||||
Select("*").
|
||||
From("Posts").
|
||||
Where(sq.Eq{"RootId": threadId}).
|
||||
Where(sq.Eq{"DeleteAt": 0}).
|
||||
Where(sq.GtOrEq{"UpdateAt": since}).ToSql()
|
||||
var result []*model.Post
|
||||
if _, err := s.GetReplica().Select(&result, query, args...); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to fetch thread posts")
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user