Add better cursor pagination behavior to getFeed ()

This commit is contained in:
Paul Frazee 2022-09-28 17:33:18 -05:00 committed by GitHub
parent a21417ba91
commit 6b47ad7622
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 2 deletions
packages
api/src
schemas.ts
types/todo/social
server
src
api/todo/social
lexicon
schemas.ts
types/todo/social
tests
schemas/todo.social

@ -645,6 +645,9 @@ export const methodSchemas: MethodSchema[] = [
'indexedAt',
],
properties: {
cursor: {
type: 'string',
},
uri: {
type: 'string',
},

@ -19,6 +19,7 @@ export interface OutputSchema {
feed: FeedItem[];
}
export interface FeedItem {
cursor?: string;
uri: string;
author: User;
repostedBy?: User;

@ -107,11 +107,11 @@ export default function (server: Server) {
`requester_like.creator = :requester AND requester_like.subject = post.uri`,
{ requester },
)
.orderBy('post.createdAt', 'DESC')
.orderBy('post.indexedAt', 'DESC')
.groupBy('post.uri')
if (before !== undefined) {
builder.andWhere('post.createdAt < :before', { before })
builder.andWhere('post.indexedAt < :before', { before })
}
if (limit !== undefined) {
builder.limit(limit)
@ -121,6 +121,7 @@ export default function (server: Server) {
// @TODO add embeds
const feed: GetFeed.FeedItem[] = queryRes.map((row) => ({
cursor: row.indexedAt,
uri: row.uri,
author: {
did: row.authorDid,

@ -645,6 +645,9 @@ export const methodSchemas: MethodSchema[] = [
'indexedAt',
],
properties: {
cursor: {
type: 'string',
},
uri: {
type: 'string',
},

@ -27,6 +27,7 @@ export interface OutputSchema {
feed: FeedItem[];
}
export interface FeedItem {
cursor?: string;
uri: string;
author: User;
repostedBy?: User;

@ -374,6 +374,17 @@ describe('pds views', () => {
expect(aliceFeed.data.feed[6].record.text).toEqual(posts.bob[0])
expect(aliceFeed.data.feed[3].repostCount).toEqual(1)
const aliceFeed2 = await client.todo.social.getFeed(
{ before: aliceFeed.data.feed[0].cursor, limit: 1 },
undefined,
{
headers: getHeaders(users.alice.did),
},
)
expect(aliceFeed2.data.feed.length).toBe(1)
/** @ts-ignore TODO */
expect(aliceFeed2.data.feed[0].record.text).toEqual(replies.bob[0])
const bobFeed = await client.todo.social.getFeed({}, undefined, {
headers: getHeaders(users.bob.did),
})
@ -418,6 +429,16 @@ describe('pds views', () => {
/** @ts-ignore TODO */
expect(aliceFeed.data.feed[3].record.text).toEqual(posts.alice[0])
const aliceFeed2 = await client.todo.social.getFeed(
{ author: 'alice.test', before: aliceFeed.data.feed[0].cursor, limit: 1 },
undefined,
{
headers: getHeaders(users.bob.did),
},
)
/** @ts-ignore TODO */
expect(aliceFeed2.data.feed[0].record.text).toEqual(posts.alice[2])
const carolFeed = await client.todo.social.getFeed(
{ author: 'carol.test' },
undefined,

@ -24,6 +24,7 @@
"type": "object",
"required": ["uri", "author", "record", "replyCount", "repostCount", "likeCount", "indexedAt"],
"properties": {
"cursor": {"type": "string"},
"uri": {"type": "string"},
"author": {"$ref": "#/$defs/user"},
"repostedBy": {"$ref": "#/$defs/user"},