mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-10 19:14:16 +00:00
improve performance of method fullfillPostsData
This commit is contained in:
parent
bc6ba377da
commit
02db8c6c13
@ -4,7 +4,6 @@ export default async (payload) => {
|
|||||||
let {
|
let {
|
||||||
posts,
|
posts,
|
||||||
for_user_id,
|
for_user_id,
|
||||||
skip = 0,
|
|
||||||
} = payload
|
} = payload
|
||||||
|
|
||||||
if (!Array.isArray(posts)) {
|
if (!Array.isArray(posts)) {
|
||||||
@ -20,10 +19,50 @@ export default async (payload) => {
|
|||||||
savedPostsIds = savedPosts.map((savedPost) => savedPost.post_id)
|
savedPostsIds = savedPosts.map((savedPost) => savedPost.post_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
posts = posts.map(async (post, index) => {
|
let [usersData, likesData, commentsData] = await Promise.all([
|
||||||
|
User.find({
|
||||||
|
_id: {
|
||||||
|
$in: posts.map((post) => post.user_id)
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
PostLike.find({
|
||||||
|
post_id: {
|
||||||
|
$in: posts.map((post) => post._id)
|
||||||
|
}
|
||||||
|
}).catch(() => []),
|
||||||
|
Comment.find({
|
||||||
|
parent_id: {
|
||||||
|
$in: posts.map((post) => post._id)
|
||||||
|
}
|
||||||
|
}).catch(() => []),
|
||||||
|
])
|
||||||
|
|
||||||
|
// wrap likesData by post_id
|
||||||
|
likesData = likesData.reduce((acc, like) => {
|
||||||
|
if (!acc[like.post_id]) {
|
||||||
|
acc[like.post_id] = []
|
||||||
|
}
|
||||||
|
|
||||||
|
acc[like.post_id].push(like)
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
// wrap commentsData by post_id
|
||||||
|
commentsData = commentsData.reduce((acc, comment) => {
|
||||||
|
if (!acc[comment.parent_id]) {
|
||||||
|
acc[comment.parent_id] = []
|
||||||
|
}
|
||||||
|
|
||||||
|
acc[comment.parent_id].push(comment)
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
posts = await Promise.all(posts.map(async (post, index) => {
|
||||||
post = post.toObject()
|
post = post.toObject()
|
||||||
|
|
||||||
let user = await User.findById(post.user_id).catch(() => false)
|
let user = usersData.find((user) => user._id.toString() === post.user_id.toString())
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
user = {
|
user = {
|
||||||
@ -31,14 +70,11 @@ export default async (payload) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let likes = await PostLike.find({ post_id: post._id.toString() })
|
let likes = likesData[post._id.toString()] ?? []
|
||||||
.catch(() => [])
|
|
||||||
|
|
||||||
post.countLikes = likes.length
|
post.countLikes = likes.length
|
||||||
|
|
||||||
let comments = await Comment.find({ parent_id: post._id.toString() })
|
let comments = commentsData[post._id.toString()] ?? []
|
||||||
.select("_id")
|
|
||||||
.catch(() => false)
|
|
||||||
|
|
||||||
post.countComments = comments.length
|
post.countComments = comments.length
|
||||||
|
|
||||||
@ -52,9 +88,7 @@ export default async (payload) => {
|
|||||||
comments: comments.map((comment) => comment._id.toString()),
|
comments: comments.map((comment) => comment._id.toString()),
|
||||||
user,
|
user,
|
||||||
}
|
}
|
||||||
})
|
}))
|
||||||
|
|
||||||
posts = await Promise.all(posts)
|
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user