···33import (
44 "context"
55 "fmt"
66+ "log/slog"
77+ "strconv"
6879 "github.com/willdot/bskyfeedgen/store"
810)
9111012type feedStore interface {
1111- GetUsersFeed(usersDID string) ([]store.FeedPost, error)
1313+ GetUsersFeed(usersDID string, cursor int64, limit int) ([]store.FeedPost, error)
1214}
13151416type FeedGenerator struct {
···2628 Feed: make([]FeedItem, 0, 0),
2729 }
28302929- usersFeed, err := f.store.GetUsersFeed(userDID)
3131+ cursorInt, err := strconv.Atoi(cursor)
3232+ if err != nil {
3333+ slog.Error("convert cursor to int", "error", err, "cursor value", cursor)
3434+ }
3535+ if cursorInt == 0 {
3636+ // if no cursor provided use a date waaaaay in the future to start the less than query
3737+ cursorInt = 9999999999999
3838+ }
3939+4040+ usersFeed, err := f.store.GetUsersFeed(userDID, int64(cursorInt), limit)
3041 if err != nil {
3142 return resp, fmt.Errorf("get users feed items from DB: %w", err)
3243 }
···3950 }
40514152 resp.Feed = feedItems
4242- resp.Cursor = ""
43535454+ // only set the return cursor if there was a record returned and that the len of records
5555+ // being returned is the same as the limit
5656+ if len(usersFeed) > 0 && len(usersFeed) == limit {
5757+ lastFeedItem := usersFeed[len(usersFeed)-1]
5858+ resp.Cursor = fmt.Sprintf("%d", lastFeedItem.CreatedAt)
5959+ }
4460 return resp, nil
4561}
+2-1
handler.go
···82828383 slog.Info("post is a reply to a post that users are subscribed to", "subscribed post URI", subscribedPostURI, "dids", subscribedDids, "RKey", event.Commit.RKey)
84848585- createdAt := time.Now().UTC().UnixNano()
8585+ // TODO: parse from the event
8686+ createdAt := time.Now().UTC().UnixMilli()
86878788 replyPostURI := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", event.Did, event.Commit.RKey)
8889 h.createFeedPostForSubscribedUsers(subscribedDids, replyPostURI, subscribedPostURI, createdAt)
+6-4
store/feed.go
···4747 return nil
4848}
49495050-func (s *Store) GetUsersFeed(usersDID string) ([]FeedPost, error) {
5151- sql := "SELECT id, replyURI, userDID, subscribedPostURI FROM feed WHERE userDID = ?;"
5252- rows, err := s.db.Query(sql, usersDID)
5050+func (s *Store) GetUsersFeed(usersDID string, cursor int64, limit int) ([]FeedPost, error) {
5151+ sql := `SELECT id, replyURI, userDID, subscribedPostURI, createdAt FROM feed
5252+ WHERE userDID = ? AND createdAt < ?
5353+ ORDER BY createdAt LIMIT ?;`
5454+ rows, err := s.db.Query(sql, usersDID, cursor, limit)
5355 if err != nil {
5456 return nil, fmt.Errorf("run query to get users feed posts: %w", err)
5557 }
···5860 feedPosts := make([]FeedPost, 0)
5961 for rows.Next() {
6062 var feedPost FeedPost
6161- if err := rows.Scan(&feedPost.ID, &feedPost.ReplyURI, &feedPost.UserDID, &feedPost.SubscribedPostURI); err != nil {
6363+ if err := rows.Scan(&feedPost.ID, &feedPost.ReplyURI, &feedPost.UserDID, &feedPost.SubscribedPostURI, &feedPost.CreatedAt); err != nil {
6264 return nil, fmt.Errorf("scan row: %w", err)
6365 }
6466 feedPosts = append(feedPosts, feedPost)