this repo has no description

feat: add cursor pagination

Changed files
+12 -5
pkg
mostliked
+12 -5
pkg/mostliked/generator.go
··· 22 22 var queryParams []any 23 23 var query strings.Builder 24 24 fmt.Fprint(&query, "SELECT posts.uri, likes FROM posts LEFT JOIN langs ON posts.uri = langs.uri") 25 + fmt.Fprint(&query, " WHERE 1=1 ") 25 26 if len(params.Langs) > 0 { 26 - fmt.Fprint(&query, " WHERE ") 27 + fmt.Fprint(&query, " AND ( ") 27 28 for idx, lang := range params.Langs { 28 29 if idx > 0 { 29 30 fmt.Fprint(&query, " OR ") ··· 31 32 fmt.Fprint(&query, " lang = ? ") 32 33 queryParams = append(queryParams, lang.String()) 33 34 } 35 + fmt.Fprint(&query, " ) ") 34 36 } 35 - // TODO cursor/offset stuff 37 + if params.Cursor != "" { 38 + fmt.Fprint(&query, " AND likes <= ? ") 39 + queryParams = append(queryParams, params.Cursor) 40 + } 36 41 fmt.Fprint(&query, "ORDER BY likes DESC, create_ts DESC") 37 42 fmt.Fprint(&query, "LIMIT ?") 38 - queryParams = append(queryParams, params.Limit) 43 + queryParams = append(queryParams, params.Limit+1) 39 44 40 45 rows, err := dbCnx.QueryContext(ctx, query.String(), queryParams...) 41 46 if err != nil { ··· 71 76 var cursor string 72 77 posts := make([]*appbsky.FeedDefs_SkeletonFeedPost, 0, params.Limit) 73 78 74 - for _, row := range rows { 75 - posts = append(posts, &appbsky.FeedDefs_SkeletonFeedPost{Post: row.Uri}) 79 + for idx, row := range rows { 80 + if idx+1 <= params.Limit { 81 + posts = append(posts, &appbsky.FeedDefs_SkeletonFeedPost{Post: row.Uri}) 82 + } 76 83 cursor = strconv.Itoa(row.Likes) 77 84 } 78 85