Add a parameter to a Cursor to fetch a user's likes

This commit is contained in:
Alessio 2023-09-09 18:24:01 -03:00
parent 0113e86a00
commit 162802914f
2 changed files with 48 additions and 1 deletions

View File

@ -146,6 +146,24 @@ func TestUserFeedWithTombstone(t *testing.T) {
assert.Equal(tombstone_tweet.TombstoneText, "This Tweet was deleted by the Tweet author") assert.Equal(tombstone_tweet.TombstoneText, "This Tweet was deleted by the Tweet author")
} }
func TestUserLikesFeed(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
profile, err := persistence.LoadProfile("../../sample_data/profile")
require.NoError(err)
// Fetch @Peter_Nimitz user feed while logged in as @MysteryGrove
c := persistence.NewUserFeedLikesCursor(UserHandle("MysteryGrove"))
feed, err := profile.NextPage(c, UserID(0))
require.NoError(err)
// Should have "liked" 1 tweet
require.Len(feed.Tweets, 1)
_, is_ok := feed.Tweets[1413646595493568516]
assert.True(is_ok)
}
func TestTweetDetailWithReplies(t *testing.T) { func TestTweetDetailWithReplies(t *testing.T) {
require := require.New(t) require := require.New(t)
assert := assert.New(t) assert := assert.New(t)

View File

@ -110,6 +110,7 @@ type Cursor struct {
RetweetedByUserHandle scraper.UserHandle RetweetedByUserHandle scraper.UserHandle
ByUserHandle scraper.UserHandle ByUserHandle scraper.UserHandle
ToUserHandles []scraper.UserHandle ToUserHandles []scraper.UserHandle
LikedByUserHandle scraper.UserHandle
SinceTimestamp scraper.Timestamp SinceTimestamp scraper.Timestamp
UntilTimestamp scraper.Timestamp UntilTimestamp scraper.Timestamp
FilterLinks Filter FilterLinks Filter
@ -170,6 +171,22 @@ func NewUserFeedCursor(h scraper.UserHandle) Cursor {
} }
} }
// Generate a cursor for a User's Likes
func NewUserFeedLikesCursor(h scraper.UserHandle) Cursor {
return Cursor{
Keywords: []string{},
ToUserHandles: []scraper.UserHandle{},
SinceTimestamp: scraper.TimestampFromUnix(0),
UntilTimestamp: scraper.TimestampFromUnix(0),
CursorPosition: CURSOR_START,
CursorValue: 0,
SortOrder: SORT_ORDER_NEWEST,
PageSize: 50,
LikedByUserHandle: h,
}
}
func NewCursorFromSearchQuery(q string) (Cursor, error) { func NewCursorFromSearchQuery(q string) (Cursor, error) {
ret := NewCursor() ret := NewCursor()
is_in_quotes := false is_in_quotes := false
@ -351,13 +368,23 @@ func (p Profile) NextPage(c Cursor, current_user_id scraper.UserID) (Feed, error
where_clauses = append(where_clauses, "retweet_id = 0") where_clauses = append(where_clauses, "retweet_id = 0")
} }
liked_by_filter_join_clause := ""
if c.LikedByUserHandle != "" {
liked_by_filter_join_clause = " join likes filter_likes on tweets.id = filter_likes.tweet_id "
where_clauses = append(where_clauses, "filter_likes.user_id = (select id from users where handle like ?) ")
bind_values = append(bind_values, c.LikedByUserHandle)
}
// Pagination // Pagination
if c.CursorPosition != CURSOR_START { if c.CursorPosition != CURSOR_START {
where_clauses = append(where_clauses, c.SortOrder.PaginationWhereClause()) where_clauses = append(where_clauses, c.SortOrder.PaginationWhereClause())
bind_values = append(bind_values, c.CursorValue) bind_values = append(bind_values, c.CursorValue)
} }
where_clause := "where " + strings.Join(where_clauses, " and ") where_clause := ""
if len(where_clauses) > 0 {
where_clause = "where " + strings.Join(where_clauses, " and ")
}
q := `select * from ( q := `select * from (
select ` + TWEETS_ALL_SQL_FIELDS + `, select ` + TWEETS_ALL_SQL_FIELDS + `,
@ -366,6 +393,7 @@ func (p Profile) NextPage(c Cursor, current_user_id scraper.UserID) (Feed, error
from tweets from tweets
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
left join likes on tweets.id = likes.tweet_id and likes.user_id = ? left join likes on tweets.id = likes.tweet_id and likes.user_id = ?
` + liked_by_filter_join_clause + `
` + where_clause + ` ` + c.SortOrder.OrderByClause() + ` limit ? ` + where_clause + ` ` + c.SortOrder.OrderByClause() + ` limit ?
) )
@ -379,6 +407,7 @@ func (p Profile) NextPage(c Cursor, current_user_id scraper.UserID) (Feed, error
left join tweets on retweets.tweet_id = tweets.id left join tweets on retweets.tweet_id = tweets.id
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
left join likes on tweets.id = likes.tweet_id and likes.user_id = ? left join likes on tweets.id = likes.tweet_id and likes.user_id = ?
` + liked_by_filter_join_clause + `
` + where_clause + ` ` + where_clause + `
` + c.SortOrder.OrderByClause() + ` ` + c.SortOrder.OrderByClause() + `
limit ? limit ?