支持 square/squarenovel/squaresteps/squarehealth 实例与 category 筛选;音乐增加免登录 grouped/track;订阅套餐按 package_name 区分;补 migration 0030/0031 与 OpenAPI。 Co-authored-by: Cursor <cursoragent@cursor.com>
62 lines
1.4 KiB
Go
62 lines
1.4 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 int64, channel entity.Channel, cursor int64, limit int) (*ListResult, error) {
|
|
if !s.ready() || viewerID <= 0 {
|
|
return nil, errs.ErrUnauthorized
|
|
}
|
|
if ownerID <= 0 {
|
|
return nil, errs.ErrInvalidArgument
|
|
}
|
|
channel = normalizeChannel(channel)
|
|
if !channel.Valid() {
|
|
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, channel, 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)
|
|
}
|