2024-03-05 10:20:36 +00:00

94 lines
2.3 KiB
JavaScript
Executable File

import { User, Comment, PostLike, SavedPost } from "@shared-classes/DbModels"
export default async (payload) => {
let {
posts,
for_user_id,
} = payload
if (!Array.isArray(posts)) {
posts = [posts]
}
let savedPostsIds = []
if (for_user_id) {
const savedPosts = await SavedPost.find({ user_id: for_user_id })
.sort({ saved_at: -1 })
savedPostsIds = savedPosts.map((savedPost) => savedPost.post_id)
}
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()
let user = usersData.find((user) => user._id.toString() === post.user_id.toString())
if (!user) {
user = {
username: "Deleted user",
}
}
let likes = likesData[post._id.toString()] ?? []
post.countLikes = likes.length
let comments = commentsData[post._id.toString()] ?? []
post.countComments = comments.length
if (for_user_id) {
post.isLiked = likes.some((like) => like.user_id.toString() === for_user_id)
post.isSaved = savedPostsIds.includes(post._id.toString())
}
return {
...post,
comments: comments.map((comment) => comment._id.toString()),
user,
}
}))
return posts
}