앞선 포스트에서
1. 설치
2. mongo db 연결
3. port 열기
4. route 설정
5. DB Schema 설정
6. Auth(register, login) api
7. Users api
이 과정을 다 해주었다.
이제 마지막으로 Posts api를 완성시켜보겠다.
8. Posts api
create a post
update a post
delete a post
like or dislike a post
get a post
get timeline posts
const newPost = new Post(req.body)
를 사용한다. const savedPost = await newPost.save()
를 통해 mongo db에 저장을 해준다.// create a post
router.post("/", async (req, res) => {
const newPost = new Post(req.body);
try {
const savedPost = await newPost.save();
res.status(200).json(savedPost);
} catch (err) {
res.status(500).json(err);
}
});
post = await Post.findById(req.param.id)
을 사용해서 업데이트 해줄 post를 변수에 지정해준다.await post.updateOne({ $set: req.body })
를 통해 req.body의 내용을 업데이트해준다.// update a post
router.put("/:id", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
if (post.userId === req.body.userId) {
await post.updateOne({ $set: req.body });
res.status(200).json("the post has been updated");
} else {
res.status(403).json("you can update only your post");
}
} catch (err) {
res.status(500).json(err);
}
});
const post = await Post.findById(req.params.id);
로 findById를 통해 post를 찾아준다.await post.deleteOne({ $set: req.body });
그 선택한 post를 deleteOne으로 삭제시킨다.// delete a post
router.delete("/:id", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
if (post.userId === req.body.userId) {
await post.deleteOne({ $set: req.body });
res.status(200).json("the post has been delete");
} else {
res.status(403).json("you can delete only your post");
}
} catch (err) {
res.status(500).json(err);
}
})
const post = await Post.findById(req.params.id);
원하는 post를 찾아준다. await post.updateOne({ $push: { likes: req.body.userId } });
로 like array를 업데이트 해준다. await post.updateOne({ $pull: { likes: req.body.userId } });
로 like array를 업데이트 해준다.// like or dislike a post
router.put("/:id/like", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
if(!post.likes.includes(req.body.userId)) {
await post.updateOne({ $push: { likes: req.body.userId } });
res.status(200).json("The post has been liked");
} else {
await post.updateOne({ $pull: { likes: req.body.userId } });
res.status(200).json("The post has been disliked");
}
} catch (err) {
res.status(500).json(err);
}
})
const post = await Post.findById(req.params.id);
를 통해 원하는 post를 받아온다.res.status(200).json(post);
로 post 정보를 response해준다.// get a post
router.get("/:id", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
res.status(200).json(post);
} catch (err) {
res.status(500).json(err);
}
})
const userPosts = await Post.find({ userId: currentUser._id });
로 가져와주고, const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
로 자신이 following하는 friend를 find해주고 그것을 friendPosts에 넣어준다.res.json(userPosts.concat(...friendPosts));
를 통해 userPost에다가 frienPost를 더해주고 response를 해준다. 이러면 모든 following하고 더해서 내 포스트 까지 전달이 될 것 이다.// get timeline posts
router.get("/timeline/all", async (req, res) => {
try {
const currentUser = await User.findById(req.body.userId);
const userPosts = await Post.find({ userId: currentUser._id });
const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
res.json(userPosts.concat(...friendPosts));
} catch (err) {
res.status(500).json(err);
}
})