2022-09-09 20:38:18 +02:00

75 lines
1.8 KiB
JavaScript

import { Post, User, SavedPost } from "../../../models"
export default async (payload) => {
let {
from_user_id,
for_user_id,
feedTrimIndex = 0,
feedLimit = 20,
savedOnly = false,
} = payload
let query = {}
let savedPostsIds = []
if (from_user_id) {
query.user_id = from_user_id
}
// short posts in order of `saved_at`.
const savedPosts = await SavedPost.find({ user_id: for_user_id })
.sort({ saved_at: -1 })
savedPostsIds = savedPosts.map((savedPost) => savedPost.post_id)
if (savedOnly) {
query._id = { $in: savedPostsIds }
}
let posts = []
if (savedOnly) {
posts = await Post.find({
_id: { $in: savedPostsIds },
})
.skip(feedTrimIndex)
.limit(feedLimit)
posts.sort((a, b) => {
return (
savedPostsIds.indexOf(a._id.toString()) -
savedPostsIds.indexOf(b._id.toString())
)
})
} else {
// make sure that sort by date descending
// trim index is used to get the last n posts
posts = await Post.find(query)
.sort({ created_at: -1 })
.skip(feedTrimIndex)
.limit(feedLimit)
}
// fetch and add user data to each post
posts = posts.map(async (post, index) => {
const user = await User.findById(post.user_id)
if (feedTrimIndex > 0) {
index = Number(feedTrimIndex) + Number(index)
}
// check if post is saved by the user
const isSaved = savedPostsIds.includes(post._id.toString())
return {
...post.toObject(),
user: user.toObject(),
key: index,
isSaved,
}
})
posts = await Promise.all(posts)
return posts
}