2022-11-14 01:29:56 +00:00

71 lines
1.7 KiB
JavaScript
Executable File

import { Post, User, Comment, SavedPost } from "../../../models"
import fullfillPostsData from "../../../utils/fullfillPostsData"
export default async (payload) => {
let {
from_user_id,
for_user_id,
post_id,
query = {},
skip = 0,
limit = 20,
sort = { created_at: -1 },
savedOnly = false,
} = payload
let posts = []
let savedPostsIds = []
// if for_user_id is provided, get saved posts
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)
}
// if from_user_id is provided, get posts from that user
if (from_user_id) {
query.user_id = from_user_id
}
// if savedOnly is true,set to query to get only saved posts
if (savedOnly) {
query._id = { $in: savedPostsIds }
}
if (post_id) {
const post = await Post.findById(post_id).catch(() => false)
posts = [post]
} else {
posts = await Post.find({ ...query })
.sort(sort)
.skip(skip)
.limit(limit)
}
// short posts if is savedOnly argument
if (savedOnly) {
posts.sort((a, b) => {
return (
savedPostsIds.indexOf(a._id.toString()) -
savedPostsIds.indexOf(b._id.toString())
)
})
}
// fullfill data
posts = await fullfillPostsData({
posts,
for_user_id,
skip,
})
// if post_id is specified, return only one post
if (post_id) {
return posts[0]
}
return posts
}