spark-server/internal/module/square/logic/album.go
2026-09-22 17:07:26 +08:00

58 lines
1.3 KiB
Go

package logic
import (
"context"
"spark-server/internal/module/square/entity"
"spark-server/internal/pkg/errs"
)
// UserPosts lists posts by owner visible to viewer (profile square tab).
func (s *Service) UserPosts(ctx context.Context, viewerID, ownerID, cursor int64, limit int) (*ListResult, error) {
if !s.ready() || viewerID <= 0 {
return nil, errs.ErrUnauthorized
}
if ownerID <= 0 {
return nil, errs.ErrInvalidArgument
}
if ownerID != viewerID {
blocked, err := s.friends.BlockedEither(ctx, viewerID, ownerID)
if err != nil {
return nil, err
}
if blocked {
return nil, errs.ErrNotFound
}
}
limit = entity.ClampLimit(limit)
picked := make([]*entity.Post, 0, limit)
scan := cursor
for range entity.OverfetchRounds {
batch, err := s.repo.ListByAuthor(ctx, ownerID, scan, entity.Overfetch)
if err != nil {
return nil, err
}
if len(batch) == 0 {
break
}
vis, err := s.visFor(ctx, viewerID, batch)
if err != nil {
return nil, err
}
for _, p := range batch {
scan = p.ID
if !vis.canSee(p) {
continue
}
picked = append(picked, p)
if len(picked) >= limit {
break
}
}
if len(picked) >= limit || len(batch) < entity.Overfetch {
break
}
}
return s.listResult(ctx, viewerID, picked, limit, false)
}