mirror of
https://github.com/aykhans/bsky-feedgen.git
synced 2025-07-17 21:34:00 +00:00
🦋
This commit is contained in:
80
pkg/feed/az.go
Normal file
80
pkg/feed/az.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package feed
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/aykhans/bsky-feedgen/pkg/logger"
|
||||
"github.com/aykhans/bsky-feedgen/pkg/storage/mongodb/collections"
|
||||
"github.com/aykhans/bsky-feedgen/pkg/types"
|
||||
"github.com/aykhans/bsky-feedgen/pkg/utils"
|
||||
"github.com/bluesky-social/indigo/api/bsky"
|
||||
"github.com/whyrusleeping/go-did"
|
||||
)
|
||||
|
||||
type FeedAz struct {
|
||||
name string
|
||||
did *did.DID
|
||||
feedAzCollection *collections.FeedAzCollection
|
||||
}
|
||||
|
||||
func NewFeedAz(name string, publisherDID *did.DID, feedAzCollection *collections.FeedAzCollection) *FeedAz {
|
||||
return &FeedAz{
|
||||
name: name,
|
||||
did: publisherDID,
|
||||
feedAzCollection: feedAzCollection,
|
||||
}
|
||||
}
|
||||
|
||||
func (f FeedAz) GetName(_ context.Context) string {
|
||||
return f.name
|
||||
}
|
||||
|
||||
func (f *FeedAz) Describe(_ context.Context) bsky.FeedDescribeFeedGenerator_Feed {
|
||||
return bsky.FeedDescribeFeedGenerator_Feed{
|
||||
Uri: "at://" + f.did.String() + "/app.bsky.feed.generator/" + f.name,
|
||||
}
|
||||
}
|
||||
|
||||
func (f *FeedAz) GetPage(
|
||||
ctx context.Context,
|
||||
_ string,
|
||||
limit int64,
|
||||
cursor string,
|
||||
) ([]*bsky.FeedDefs_SkeletonFeedPost, *string, error) {
|
||||
var cursorInt int64 = 0
|
||||
if cursor != "" {
|
||||
var err error
|
||||
cursorInt, err = strconv.ParseInt(cursor, 10, 64)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("cursor is not an integer: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
feedAzItems, err := f.feedAzCollection.GetByCreatedAt(ctx, cursorInt, limit+1)
|
||||
if err != nil {
|
||||
logger.Log.Error("failed to get feedAzCollection items", "error", err)
|
||||
return nil, nil, types.ErrInternal
|
||||
}
|
||||
|
||||
var newCursor *string
|
||||
|
||||
if feedAzItemsLen := int64(len(feedAzItems)); limit >= feedAzItemsLen {
|
||||
posts := make([]*bsky.FeedDefs_SkeletonFeedPost, feedAzItemsLen)
|
||||
for i, feedItem := range feedAzItems {
|
||||
posts[i] = &bsky.FeedDefs_SkeletonFeedPost{
|
||||
Post: "at://" + feedItem.DID + "/app.bsky.feed.post/" + feedItem.RecordKey,
|
||||
}
|
||||
}
|
||||
return posts, newCursor, nil
|
||||
} else {
|
||||
posts := make([]*bsky.FeedDefs_SkeletonFeedPost, feedAzItemsLen-1)
|
||||
for i, feedItem := range feedAzItems[:feedAzItemsLen-1] {
|
||||
posts[i] = &bsky.FeedDefs_SkeletonFeedPost{
|
||||
Post: "at://" + feedItem.DID + "/app.bsky.feed.post/" + feedItem.RecordKey,
|
||||
}
|
||||
}
|
||||
return posts, utils.ToPtr(strconv.FormatInt(cursorInt+limit, 10)), nil
|
||||
}
|
||||
}
|
13
pkg/feed/base.go
Normal file
13
pkg/feed/base.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package feed
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/bluesky-social/indigo/api/bsky"
|
||||
)
|
||||
|
||||
type Feed interface {
|
||||
GetPage(ctx context.Context, userDID string, limit int64, cursor string) (feedPosts []*bsky.FeedDefs_SkeletonFeedPost, newCursor *string, err error)
|
||||
GetName(ctx context.Context) string
|
||||
Describe(ctx context.Context) bsky.FeedDescribeFeedGenerator_Feed
|
||||
}
|
Reference in New Issue
Block a user