From fd6ee328325b4be3c477c54e973d3ecf8498744a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Wed, 22 Nov 2023 20:07:59 +0100 Subject: [PATCH] [backend] Don't fetch more notes than requested --- .../api/endpoints/notes/global-timeline.ts | 19 ++--------------- .../api/endpoints/notes/hybrid-timeline.ts | 19 ++--------------- .../api/endpoints/notes/local-timeline.ts | 19 ++--------------- .../server/api/endpoints/notes/mentions.ts | 21 ++++--------------- .../endpoints/notes/recommended-timeline.ts | 19 ++--------------- .../src/server/api/endpoints/notes/renotes.ts | 19 ++--------------- .../src/server/api/endpoints/notes/replies.ts | 19 ++--------------- .../api/endpoints/notes/search-by-tag.ts | 19 ++--------------- .../server/api/endpoints/notes/timeline.ts | 19 ++--------------- .../api/endpoints/notes/user-list-timeline.ts | 19 ++--------------- 10 files changed, 22 insertions(+), 170 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts index 54d0a5425..8f4f805ac 100644 --- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts @@ -106,25 +106,10 @@ export default define(meta, paramDef, async (ps, user) => { } }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; }); diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts index 5b1095669..0f1d0f8c1 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -165,25 +165,10 @@ export default define(meta, paramDef, async (ps, user) => { activeUsersChart.read(user); }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; }); diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts index e40d5d86b..3bf10c65d 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -135,25 +135,10 @@ export default define(meta, paramDef, async (ps, user) => { } }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; }); diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts index a4714b1fc..2ccafd225 100644 --- a/packages/backend/src/server/api/endpoints/notes/mentions.ts +++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts @@ -80,23 +80,10 @@ export default define(meta, paramDef, async (ps, user) => { query.setParameters(followingQuery.getParameters()); } - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + const packed = await Notes.packMany(notes, user); - if (found.length > ps.limit) { - found.length = ps.limit; - } + read(user.id, packed); - read(user.id, found); - - return found; + return packed; }); diff --git a/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts b/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts index 1bdd13e71..9bf783feb 100644 --- a/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts @@ -135,25 +135,10 @@ export default define(meta, paramDef, async (ps, user) => { } }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; }); diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts index 7bb74d41d..2cd20abef 100644 --- a/packages/backend/src/server/api/endpoints/notes/renotes.ts +++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts @@ -75,21 +75,6 @@ export default define(meta, paramDef, async (ps, user) => { if (user) generateMutedUserQuery(query, user); if (user) generateBlockedUserQuery(query, user); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); }); diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts index 98c751963..9921ebf3b 100644 --- a/packages/backend/src/server/api/endpoints/notes/replies.ts +++ b/packages/backend/src/server/api/endpoints/notes/replies.ts @@ -52,21 +52,6 @@ export default define(meta, paramDef, async (ps, user) => { if (user) generateMutedUserQuery(query, user); if (user) generateBlockedUserQuery(query, user); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); }); diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts index ae65ee2ac..3cd52bee2 100644 --- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts +++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts @@ -139,21 +139,6 @@ export default define(meta, paramDef, async (ps, me) => { } } - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, me))); - skip += take; - if (notes.length < take) break; - } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, me); }); diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index 99f38245d..0bb674fd9 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -143,25 +143,10 @@ export default define(meta, paramDef, async (ps, user) => { activeUsersChart.read(user); }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; }); diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts index be745fb14..5f96d1e81 100644 --- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts @@ -143,25 +143,10 @@ export default define(meta, paramDef, async (ps, user) => { } }); - // We fetch more than requested because some may be filtered out, and if there's less than - // requested, the pagination stops. - const found = []; - const take = Math.floor(ps.limit * 1.5); - let skip = 0; try { - while (found.length < ps.limit) { - const notes = await query.take(take).skip(skip).getMany(); - found.push(...(await Notes.packMany(notes, user))); - skip += take; - if (notes.length < take) break; - } + const notes = await query.take(ps.limit).getMany(); + return await Notes.packMany(notes, user); } catch (error) { throw new ApiError(meta.errors.queryError); } - - if (found.length > ps.limit) { - found.length = ps.limit; - } - - return found; });