package logic import ( "context" "spark-server/internal/module/moment/entity" "spark-server/internal/pkg/errs" ) func (s *Service) Album(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 { ok, err := s.friends.AreFriends(ctx, viewerID, ownerID) if err != nil { return nil, err } if !ok { return nil, errs.ErrNotFound } 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) self := ownerID == viewerID for range entity.OverfetchRounds { batch, err := s.repo.ListByAuthor(ctx, ownerID, cursor, entity.Overfetch) if err != nil { return nil, err } if len(batch) == 0 { break } vis, err := s.visFor(ctx, viewerID, batch, self) if err != nil { return nil, err } for _, p := range batch { cursor = 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, false) }