mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-11 16:13:10 -06:00
This is to avoid issues where we return notification data in one sync, but not the other. Which could result in clients simply displaying a "dot" as the count. (Observerd in Element Android, where the count would disappear on subsequent syncs where no notification data would be present, e.g. we only returned ephemeral data). It's also something Synapse is doing.
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package streams
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/matrix-org/dendrite/syncapi/types"
|
|
)
|
|
|
|
type NotificationDataStreamProvider struct {
|
|
StreamProvider
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) Setup() {
|
|
p.StreamProvider.Setup()
|
|
|
|
id, err := p.DB.MaxStreamPositionForNotificationData(context.Background())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
p.latest = id
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) CompleteSync(
|
|
ctx context.Context,
|
|
req *types.SyncRequest,
|
|
) types.StreamPosition {
|
|
return p.IncrementalSync(ctx, req, 0, p.LatestPosition(ctx))
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) IncrementalSync(
|
|
ctx context.Context,
|
|
req *types.SyncRequest,
|
|
from, _ types.StreamPosition,
|
|
) types.StreamPosition {
|
|
// Get the unread notifications for rooms in our join response.
|
|
// This is to ensure clients always have an unread notification section
|
|
// and can display the correct numbers.
|
|
countsByRoom, err := p.DB.GetUserUnreadNotificationCountsForRooms(ctx, req.Device.UserID, req.Rooms)
|
|
if err != nil {
|
|
req.Log.WithError(err).Error("GetUserUnreadNotificationCountsForRooms failed")
|
|
return from
|
|
}
|
|
|
|
// We're merely decorating existing rooms.
|
|
for roomID, jr := range req.Response.Rooms.Join {
|
|
counts := countsByRoom[roomID]
|
|
if counts == nil {
|
|
continue
|
|
}
|
|
jr.UnreadNotifications = &types.UnreadNotifications{
|
|
HighlightCount: counts.UnreadHighlightCount,
|
|
NotificationCount: counts.UnreadNotificationCount,
|
|
}
|
|
req.Response.Rooms.Join[roomID] = jr
|
|
}
|
|
|
|
return p.LatestPosition(ctx)
|
|
}
|