owpengram-server/internal/rpc/media_count.go

102 lines
2.6 KiB
Go

package rpc
import (
"context"
"fmt"
"github.com/gotd/td/tg"
"telesrv/internal/domain"
)
func (r *Router) mediaCountsForPeer(ctx context.Context, userID int64, peer domain.Peer) (domain.MediaCategoryCounts, error) {
if userID == 0 || peer.ID == 0 {
return domain.MediaCategoryCounts{}, nil
}
key := fmt.Sprintf("%d:%s:%d", userID, peer.Type, peer.ID)
v, err, _ := r.mediaCountSF.Do(key, func() (any, error) {
counts, err := r.loadMediaCountsForPeer(ctx, userID, peer)
if err != nil {
return nil, err
}
return cloneMediaCategoryCounts(counts), nil
})
if err != nil {
return nil, err
}
counts, _ := v.(domain.MediaCategoryCounts)
return cloneMediaCategoryCounts(counts), nil
}
func (r *Router) loadMediaCountsForPeer(ctx context.Context, userID int64, peer domain.Peer) (domain.MediaCategoryCounts, error) {
switch peer.Type {
case domain.PeerTypeChannel:
if r.deps.Channels == nil {
return domain.MediaCategoryCounts{}, nil
}
return r.deps.Channels.CountChannelMediaCategories(ctx, userID, peer.ID)
case domain.PeerTypeUser:
if r.deps.Messages == nil {
return domain.MediaCategoryCounts{}, nil
}
return r.deps.Messages.CountPrivateMediaCategories(ctx, userID, peer.ID)
default:
return domain.MediaCategoryCounts{}, nil
}
}
func cloneMediaCategoryCounts(in domain.MediaCategoryCounts) domain.MediaCategoryCounts {
if len(in) == 0 {
return domain.MediaCategoryCounts{}
}
out := make(domain.MediaCategoryCounts, len(in))
for category, count := range in {
out[category] = count
}
return out
}
func mediaSearchCountOnlyRequest(req *tg.MessagesSearchRequest) bool {
if req == nil {
return false
}
if req.Q != "" || req.Limit != 0 || req.OffsetID != 0 || req.AddOffset != 0 ||
req.MaxID != 0 || req.MinID != 0 || req.MinDate != 0 || req.MaxDate != 0 || req.Hash != 0 {
return false
}
if _, ok := req.GetFromID(); ok {
return false
}
if _, ok := req.GetSavedPeerID(); ok {
return false
}
if _, ok := req.GetSavedReaction(); ok {
return false
}
if _, ok := req.GetTopMsgID(); ok {
return false
}
return searchFilterNeedsMediaStore(req.Filter)
}
func mediaSearchCanReusePeerWideCount(req *tg.MessagesSearchRequest) bool {
if req == nil {
return false
}
if req.Q != "" || req.MaxID != 0 || req.MinID != 0 || req.MinDate != 0 || req.MaxDate != 0 {
return false
}
if _, ok := req.GetFromID(); ok {
return false
}
if _, ok := req.GetSavedPeerID(); ok {
return false
}
if _, ok := req.GetSavedReaction(); ok {
return false
}
if _, ok := req.GetTopMsgID(); ok {
return false
}
return searchFilterNeedsMediaStore(req.Filter)
}