+12
-5
pkg/mostliked/generator.go
+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