54 lines
1.6 KiB
Go
54 lines
1.6 KiB
Go
package rpc
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/iamxvbaba/td/tg"
|
|
|
|
"telesrv/internal/domain"
|
|
)
|
|
|
|
// BuildOutboxUpdates 为在线 outbox worker 构造按接收者视角补全后的 updates。
|
|
func (r *Router) BuildOutboxUpdates(ctx context.Context, requests []OutboxUpdateRequest) []*tg.Updates {
|
|
out := make([]*tg.Updates, len(requests))
|
|
if len(requests) == 0 {
|
|
return out
|
|
}
|
|
cache := newViewerPeerCache(r)
|
|
groups := make(map[int64][]outboxUpdateBuildItem)
|
|
for i, req := range requests {
|
|
viewerUserID := req.TargetUserID
|
|
if viewerUserID == 0 {
|
|
viewerUserID = req.Event.UserID
|
|
}
|
|
event := req.Event
|
|
if event.UserID == 0 {
|
|
event.UserID = viewerUserID
|
|
}
|
|
groups[viewerUserID] = append(groups[viewerUserID], outboxUpdateBuildItem{index: i, event: event})
|
|
}
|
|
for viewerUserID, items := range groups {
|
|
events := make([]domain.UpdateEvent, len(items))
|
|
for i, item := range items {
|
|
events[i] = item.event
|
|
}
|
|
events = r.enrichUpdateEventsWithPeerCache(ctx, viewerUserID, events, cache)
|
|
for i, item := range items {
|
|
update := tgUpdateForOutboxEventForViewer(events[i], viewerUserID)
|
|
if peers := storyUpdateEventPeers(events[i]); len(peers) > 0 {
|
|
update = r.withStoryUpdatePeerObjectsForOutbox(ctx, viewerUserID, update, peers...)
|
|
}
|
|
out[item.index] = update
|
|
}
|
|
}
|
|
// Username rows are viewer-independent. Project the union once after every
|
|
// viewer-specific update has been built so one outbox claim never turns into
|
|
// a registry query per event/session.
|
|
r.applyUsernamesToUpdatesBatch(ctx, out)
|
|
return out
|
|
}
|
|
|
|
type outboxUpdateBuildItem struct {
|
|
index int
|
|
event domain.UpdateEvent
|
|
}
|