♻️ Upgrade to new feed reader

This commit is contained in:
2025-04-05 01:12:03 +08:00
parent 3c3cbd9c29
commit 349d768d22
9 changed files with 18 additions and 388 deletions

View File

@@ -34,8 +34,7 @@ func GetFeed(c *fiber.Ctx, limit int, user *uint, cursor *time.Time) ([]FeedEntr
// Planing the feed
limitF := float64(limit)
interCount := int(math.Ceil(limitF * 0.5))
fediCount := int(math.Ceil(limitF * 0.25))
newsCount := int(math.Ceil(limitF * 0.25))
readerCount := int(math.Ceil(limitF * 0.5))
// Internal posts
interTx, err := services.UniversalPostFilter(c, database.C)
@@ -45,32 +44,21 @@ func GetFeed(c *fiber.Ctx, limit int, user *uint, cursor *time.Time) ([]FeedEntr
if cursor != nil {
interTx = interTx.Where("published_at < ?", *cursor)
}
interPosts, err := ListPostForFeed(interTx, interCount, user, c.Get("X-API-Version", "1"))
posts, err := ListPostForFeed(interTx, interCount, user, c.Get("X-API-Version", "1"))
if err != nil {
return nil, fmt.Errorf("failed to load interactive posts: %v", err)
}
feed = append(feed, interPosts...)
// Fediverse posts
fediTx := database.C
if cursor != nil {
fediTx = fediTx.Where("created_at < ?", *cursor)
}
fediPosts, err := ListFediversePostForFeed(fediTx, fediCount)
if err != nil {
return feed, fmt.Errorf("failed to load fediverse posts: %v", err)
}
feed = append(feed, fediPosts...)
feed = append(feed, posts...)
sort.Slice(feed, func(i, j int) bool {
return feed[i].CreatedAt.After(feed[j].CreatedAt)
})
// News today - from Reader
if news, err := ListNewsForFeed(newsCount, cursor); err != nil {
if news, err := ListNewsForFeed(readerCount, cursor); err != nil {
log.Error().Err(err).Msg("Failed to load news in getting feed...")
} else {
feed = append(feed, news)
feed = append(feed, news...)
}
return feed, nil
@@ -100,27 +88,10 @@ func ListPostForFeed(tx *gorm.DB, limit int, user *uint, api string) ([]FeedEntr
return entries, nil
}
func ListFediversePostForFeed(tx *gorm.DB, limit int) ([]FeedEntry, error) {
var posts []models.FediversePost
if err := tx.
Preload("User").Limit(limit).
Find(&posts).Error; err != nil {
return nil, err
}
entries := lo.Map(posts, func(post models.FediversePost, _ int) FeedEntry {
return FeedEntry{
Type: "fediverse.post",
Data: post,
CreatedAt: post.CreatedAt,
}
})
return entries, nil
}
func ListNewsForFeed(limit int, cursor *time.Time) (FeedEntry, error) {
func ListNewsForFeed(limit int, cursor *time.Time) ([]FeedEntry, error) {
conn, err := gap.Nx.GetClientGrpcConn("re")
if err != nil {
return FeedEntry{}, fmt.Errorf("failed to get grpc connection with reader: %v", err)
return nil, fmt.Errorf("failed to get grpc connection with reader: %v", err)
}
client := proto.NewFeedServiceClient(conn)
request := &proto.GetFeedRequest{
@@ -131,16 +102,16 @@ func ListNewsForFeed(limit int, cursor *time.Time) (FeedEntry, error) {
}
resp, err := client.GetFeed(context.Background(), request)
if err != nil {
return FeedEntry{}, fmt.Errorf("failed to get feed from reader: %v", err)
return nil, fmt.Errorf("failed to get feed from reader: %v", err)
}
var createdAt time.Time
return FeedEntry{
Type: "reader.news",
CreatedAt: createdAt,
Data: lo.Map(resp.Items, func(item *proto.FeedItem, _ int) map[string]any {
cta := time.UnixMilli(int64(item.CreatedAt))
createdAt = lo.Ternary(createdAt.Before(cta), cta, createdAt)
return nex.DecodeMap(item.Content)
}),
}, nil
return lo.Map(resp.Items, func(item *proto.FeedItem, _ int) FeedEntry {
cta := time.UnixMilli(int64(item.CreatedAt))
createdAt = lo.Ternary(createdAt.Before(cta), cta, createdAt)
return FeedEntry{
Type: item.Type,
Data: nex.DecodeMap(item.Content),
CreatedAt: cta,
}
}), nil
}