this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ordering by createdAt and limiting the number of records

+27 -8
+19 -3
feedgenerator.go
··· 3 3 import ( 4 4 "context" 5 5 "fmt" 6 + "log/slog" 7 + "strconv" 6 8 7 9 "github.com/willdot/bskyfeedgen/store" 8 10 ) 9 11 10 12 type feedStore interface { 11 - GetUsersFeed(usersDID string) ([]store.FeedPost, error) 13 + GetUsersFeed(usersDID string, cursor int64, limit int) ([]store.FeedPost, error) 12 14 } 13 15 14 16 type FeedGenerator struct { ··· 26 28 Feed: make([]FeedItem, 0, 0), 27 29 } 28 30 29 - usersFeed, err := f.store.GetUsersFeed(userDID) 31 + cursorInt, err := strconv.Atoi(cursor) 32 + if err != nil { 33 + slog.Error("convert cursor to int", "error", err, "cursor value", cursor) 34 + } 35 + if cursorInt == 0 { 36 + // if no cursor provided use a date waaaaay in the future to start the less than query 37 + cursorInt = 9999999999999 38 + } 39 + 40 + usersFeed, err := f.store.GetUsersFeed(userDID, int64(cursorInt), limit) 30 41 if err != nil { 31 42 return resp, fmt.Errorf("get users feed items from DB: %w", err) 32 43 } ··· 39 50 } 40 51 41 52 resp.Feed = feedItems 42 - resp.Cursor = "" 43 53 54 + // only set the return cursor if there was a record returned and that the len of records 55 + // being returned is the same as the limit 56 + if len(usersFeed) > 0 && len(usersFeed) == limit { 57 + lastFeedItem := usersFeed[len(usersFeed)-1] 58 + resp.Cursor = fmt.Sprintf("%d", lastFeedItem.CreatedAt) 59 + } 44 60 return resp, nil 45 61 }
+2 -1
handler.go
··· 82 82 83 83 slog.Info("post is a reply to a post that users are subscribed to", "subscribed post URI", subscribedPostURI, "dids", subscribedDids, "RKey", event.Commit.RKey) 84 84 85 - createdAt := time.Now().UTC().UnixNano() 85 + // TODO: parse from the event 86 + createdAt := time.Now().UTC().UnixMilli() 86 87 87 88 replyPostURI := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", event.Did, event.Commit.RKey) 88 89 h.createFeedPostForSubscribedUsers(subscribedDids, replyPostURI, subscribedPostURI, createdAt)
+6 -4
store/feed.go
··· 47 47 return nil 48 48 } 49 49 50 - func (s *Store) GetUsersFeed(usersDID string) ([]FeedPost, error) { 51 - sql := "SELECT id, replyURI, userDID, subscribedPostURI FROM feed WHERE userDID = ?;" 52 - rows, err := s.db.Query(sql, usersDID) 50 + func (s *Store) GetUsersFeed(usersDID string, cursor int64, limit int) ([]FeedPost, error) { 51 + sql := `SELECT id, replyURI, userDID, subscribedPostURI, createdAt FROM feed 52 + WHERE userDID = ? AND createdAt < ? 53 + ORDER BY createdAt LIMIT ?;` 54 + rows, err := s.db.Query(sql, usersDID, cursor, limit) 53 55 if err != nil { 54 56 return nil, fmt.Errorf("run query to get users feed posts: %w", err) 55 57 } ··· 58 60 feedPosts := make([]FeedPost, 0) 59 61 for rows.Next() { 60 62 var feedPost FeedPost 61 - if err := rows.Scan(&feedPost.ID, &feedPost.ReplyURI, &feedPost.UserDID, &feedPost.SubscribedPostURI); err != nil { 63 + if err := rows.Scan(&feedPost.ID, &feedPost.ReplyURI, &feedPost.UserDID, &feedPost.SubscribedPostURI, &feedPost.CreatedAt); err != nil { 62 64 return nil, fmt.Errorf("scan row: %w", err) 63 65 } 64 66 feedPosts = append(feedPosts, feedPost)