From 696741ba14a32acd429de70b1d1efd44a5ec58ad Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 24 Apr 2025 12:01:53 +0000 Subject: [PATCH] Replace trim-based pagination with page-based pagination --- .../app/src/components/PostsList/index.jsx | 14 +++-- .../posts/classes/posts/methods/data.js | 4 +- .../posts/classes/posts/methods/fromUserId.js | 35 ++++++------- .../posts/classes/posts/methods/getLiked.js | 33 ++++++------ .../posts/classes/posts/methods/getSaved.js | 40 +++++++-------- .../classes/posts/methods/globalTimeline.js | 16 ++---- .../posts/classes/posts/methods/replies.js | 4 +- .../posts/classes/posts/methods/timeline.js | 51 ++++++++----------- .../posts/routes/posts/feed/global/get.js | 4 +- .../posts/routes/posts/feed/timeline/get.js | 4 +- .../services/posts/routes/posts/liked/get.js | 2 +- .../services/posts/routes/posts/saved/get.js | 2 +- .../posts/routes/posts/user/[user_id]/get.js | 4 +- 13 files changed, 96 insertions(+), 117 deletions(-) diff --git a/packages/app/src/components/PostsList/index.jsx b/packages/app/src/components/PostsList/index.jsx index da3cf787..afda9260 100755 --- a/packages/app/src/components/PostsList/index.jsx +++ b/packages/app/src/components/PostsList/index.jsx @@ -110,6 +110,7 @@ export class PostsListsComponent extends React.Component { hasMore: true, list: this.props.list ?? [], + pageCount: 0, } parentRef = this.props.innerRef @@ -148,12 +149,17 @@ export class PostsListsComponent extends React.Component { } handleLoad = async (fn, params = {}) => { + if (this.state.loading === true) { + console.warn(`Please wait to load the post before load more`) + return + } + this.setState({ loading: true, }) let payload = { - trim: this.state.list.length, + page: this.state.pageCount, limit: app.cores.settings.get("feed_max_fetch"), } @@ -164,10 +170,6 @@ export class PostsListsComponent extends React.Component { } } - if (params.replace) { - payload.trim = 0 - } - const result = await fn(payload).catch((err) => { console.error(err) @@ -186,10 +188,12 @@ export class PostsListsComponent extends React.Component { if (params.replace) { this.setState({ list: result, + pageCount: 0, }) } else { this.setState({ list: [...this.state.list, ...result], + pageCount: this.state.pageCount + 1, }) } } diff --git a/packages/server/services/posts/classes/posts/methods/data.js b/packages/server/services/posts/classes/posts/methods/data.js index dbbc158b..97c6e590 100644 --- a/packages/server/services/posts/classes/posts/methods/data.js +++ b/packages/server/services/posts/classes/posts/methods/data.js @@ -8,8 +8,8 @@ export default async (payload = {}) => { for_user_id, post_id, query = {}, - trim = 0, limit = 20, + page = 0, sort = { created_at: -1 }, } = payload @@ -31,8 +31,8 @@ export default async (payload = {}) => { } else { posts = await Post.find({ ...query }) .sort(sort) - .skip(trim) .limit(limit) + .skip(limit * page) } // fullfill data diff --git a/packages/server/services/posts/classes/posts/methods/fromUserId.js b/packages/server/services/posts/classes/posts/methods/fromUserId.js index 38f5c731..1b00b60e 100644 --- a/packages/server/services/posts/classes/posts/methods/fromUserId.js +++ b/packages/server/services/posts/classes/posts/methods/fromUserId.js @@ -1,25 +1,20 @@ import GetData from "./data" export default async (payload = {}) => { - const { - for_user_id, - user_id, - trim, - limit, - } = payload + const { for_user_id, user_id, page, limit } = payload - if (!user_id) { - throw new OperationError(400, "Missing user_id") - } + if (!user_id) { + throw new OperationError(400, "Missing user_id") + } - return await GetData({ - for_user_id: for_user_id, - trim: trim, - limit: limit, - query: { - user_id: { - $in: user_id - } - } - }) -} \ No newline at end of file + return await GetData({ + for_user_id: for_user_id, + page: page, + limit: limit, + query: { + user_id: { + $in: user_id, + }, + }, + }) +} diff --git a/packages/server/services/posts/classes/posts/methods/getLiked.js b/packages/server/services/posts/classes/posts/methods/getLiked.js index 84ed4a6a..e443348b 100644 --- a/packages/server/services/posts/classes/posts/methods/getLiked.js +++ b/packages/server/services/posts/classes/posts/methods/getLiked.js @@ -2,25 +2,24 @@ import { PostLike } from "@db_models" import GetData from "./data" export default async (payload = {}) => { - let { user_id, trim, limit } = payload + let { user_id, page, limit } = payload - if (!user_id) { - throw new OperationError(400, "Missing user_id") - } + if (!user_id) { + throw new OperationError(400, "Missing user_id") + } - let ids = await PostLike.find({ user_id }) + let ids = await PostLike.find({ user_id }) - ids = ids.map((item) => item.post_id) + ids = ids.map((item) => item.post_id) - return await GetData({ - trim: trim, - limit: limit, - for_user_id: user_id, - query: { - _id: { - $in: ids - } - } - }) + return await GetData({ + page: page, + limit: limit, + for_user_id: user_id, + query: { + _id: { + $in: ids, + }, + }, + }) } - diff --git a/packages/server/services/posts/classes/posts/methods/getSaved.js b/packages/server/services/posts/classes/posts/methods/getSaved.js index e3697df1..56f79bc2 100644 --- a/packages/server/services/posts/classes/posts/methods/getSaved.js +++ b/packages/server/services/posts/classes/posts/methods/getSaved.js @@ -2,28 +2,28 @@ import { PostSave } from "@db_models" import GetData from "./data" export default async (payload = {}) => { - let { user_id, trim, limit } = payload + let { user_id, page, limit } = payload - if (!user_id) { - throw new OperationError(400, "Missing user_id") - } + if (!user_id) { + throw new OperationError(400, "Missing user_id") + } - let ids = await PostSave.find({ user_id }) + let ids = await PostSave.find({ user_id }) - if (ids.length === 0) { - return [] - } + if (ids.length === 0) { + return [] + } - ids = ids.map((item) => item.post_id) + ids = ids.map((item) => item.post_id) - return await GetData({ - trim: trim, - limit: limit, - for_user_id: user_id, - query: { - _id: { - $in: ids - } - } - }) -} \ No newline at end of file + return await GetData({ + page: page, + limit: limit, + for_user_id: user_id, + query: { + _id: { + $in: ids, + }, + }, + }) +} diff --git a/packages/server/services/posts/classes/posts/methods/globalTimeline.js b/packages/server/services/posts/classes/posts/methods/globalTimeline.js index e08fd6af..31af49cc 100644 --- a/packages/server/services/posts/classes/posts/methods/globalTimeline.js +++ b/packages/server/services/posts/classes/posts/methods/globalTimeline.js @@ -1,17 +1,7 @@ import GetPostData from "./data" export default async (payload = {}) => { - let { - user_id, - trim, - limit, - } = payload + const posts = await GetPostData(payload) - const posts = await GetPostData({ - for_user_id: user_id, - trim, - limit, - }) - - return posts -} \ No newline at end of file + return posts +} diff --git a/packages/server/services/posts/classes/posts/methods/replies.js b/packages/server/services/posts/classes/posts/methods/replies.js index d245d2a7..b7a9fe95 100644 --- a/packages/server/services/posts/classes/posts/methods/replies.js +++ b/packages/server/services/posts/classes/posts/methods/replies.js @@ -2,7 +2,7 @@ import { Post } from "@db_models" import stage from "./stage" export default async (payload = {}) => { - const { post_id, for_user_id, trim = 0, limit = 50 } = payload + const { post_id, for_user_id, page = 0, limit = 50 } = payload if (!post_id) { throw new OperationError(400, "Post ID is required") @@ -12,7 +12,7 @@ export default async (payload = {}) => { reply_to: post_id, }) .limit(limit) - .skip(trim) + .skip(limit * page) .sort({ created_at: -1 }) posts = await stage({ diff --git a/packages/server/services/posts/classes/posts/methods/timeline.js b/packages/server/services/posts/classes/posts/methods/timeline.js index 30702f61..9be97801 100644 --- a/packages/server/services/posts/classes/posts/methods/timeline.js +++ b/packages/server/services/posts/classes/posts/methods/timeline.js @@ -3,41 +3,32 @@ import { UserFollow } from "@db_models" import GetPostData from "./data" export default async (payload = {}) => { - let { - user_id, - trim, - limit, - } = payload + payload.query = {} - let query = {} + //TODO: include posts from groups + //TODO: include promotional posts + if (payload.for_user_id) { + const from_users = [] - //TODO: include posts from groups - //TODO: include promotional posts - if (user_id) { - const from_users = [] + from_users.push(payload.for_user_id) - from_users.push(user_id) + // get post from users that the user follows + const followingUsers = await UserFollow.find({ + user_id: payload.for_user_id, + }) - // get post from users that the user follows - const followingUsers = await UserFollow.find({ - user_id: user_id - }) + const followingUserIds = followingUsers.map( + (followingUser) => followingUser.to, + ) - const followingUserIds = followingUsers.map((followingUser) => followingUser.to) + from_users.push(...followingUserIds) - from_users.push(...followingUserIds) + payload.query.user_id = { + $in: from_users, + } + } - query.user_id = { - $in: from_users - } - } + const posts = await GetPostData(payload) - const posts = await GetPostData({ - for_user_id: user_id, - trim, - limit, - query: query, - }) - - return posts -} \ No newline at end of file + return posts +} diff --git a/packages/server/services/posts/routes/posts/feed/global/get.js b/packages/server/services/posts/routes/posts/feed/global/get.js index 52eebad2..6a1afaa3 100644 --- a/packages/server/services/posts/routes/posts/feed/global/get.js +++ b/packages/server/services/posts/routes/posts/feed/global/get.js @@ -5,11 +5,11 @@ export default { fn: async (req, res) => { const payload = { limit: req.query?.limit, - trim: req.query?.trim, + page: req.query?.page, } if (req.auth) { - payload.user_id = req.auth.session.user_id + payload.for_user_id = req.auth.session.user_id } const result = await Posts.globalTimeline(payload) diff --git a/packages/server/services/posts/routes/posts/feed/timeline/get.js b/packages/server/services/posts/routes/posts/feed/timeline/get.js index 99d96263..a6ea2cf0 100644 --- a/packages/server/services/posts/routes/posts/feed/timeline/get.js +++ b/packages/server/services/posts/routes/posts/feed/timeline/get.js @@ -5,11 +5,11 @@ export default { fn: async (req, res) => { const payload = { limit: req.query?.limit, - trim: req.query?.trim, + page: req.query?.page, } if (req.auth) { - payload.user_id = req.auth.session.user_id + payload.for_user_id = req.auth.session.user_id } const result = await Posts.timeline(payload) diff --git a/packages/server/services/posts/routes/posts/liked/get.js b/packages/server/services/posts/routes/posts/liked/get.js index a6f1540c..e4904ee7 100644 --- a/packages/server/services/posts/routes/posts/liked/get.js +++ b/packages/server/services/posts/routes/posts/liked/get.js @@ -4,7 +4,7 @@ export default { useMiddlewares: ["withAuthentication"], fn: async (req) => { return await Posts.getLiked({ - trim: req.query.trim, + page: req.query.page, limit: req.query.limit, user_id: req.auth.session.user_id, }) diff --git a/packages/server/services/posts/routes/posts/saved/get.js b/packages/server/services/posts/routes/posts/saved/get.js index a4c804e6..2aa85390 100644 --- a/packages/server/services/posts/routes/posts/saved/get.js +++ b/packages/server/services/posts/routes/posts/saved/get.js @@ -4,7 +4,7 @@ export default { useMiddlewares: ["withAuthentication"], fn: async (req) => { return await Posts.getSaved({ - trim: req.query.trim, + page: req.query.page, limit: req.query.limit, user_id: req.auth.session.user_id, }) diff --git a/packages/server/services/posts/routes/posts/user/[user_id]/get.js b/packages/server/services/posts/routes/posts/user/[user_id]/get.js index f29b3986..ed282b46 100644 --- a/packages/server/services/posts/routes/posts/user/[user_id]/get.js +++ b/packages/server/services/posts/routes/posts/user/[user_id]/get.js @@ -4,8 +4,8 @@ export default { useMiddlewares: ["withOptionalAuthentication"], fn: async (req, res) => { return await Posts.fromUserId({ - skip: req.query.skip, - trim: req.query.trim, + limit: req.query.limit, + page: req.query.page, user_id: req.params.user_id, for_user_id: req.auth?.session?.user_id, })