좋아요 기능에는 먼저 알아두어야 할 것이 있습니다.
우리는 Sequelize에서 모델을 생성할 때 관계를 설정해둔 모델이 있었습니다.
Sequelize에서 관계를 설정하면 자동으로 add, get, remove같은 메소드들이 생성되는데 다음과 같습니다.
참고로 as를 이용해 별칭을 안정해주면 그냥 태이블명 addUser 이렇게 생성이 되요.
Post.associate = (db) => {
//belongsTo는 UserId칼럼을 만들어줘서 참조관계를 만들어준다.
db.Post.belongsTo(db.User); //post.addUser,post.getUser, post.setUser
db.Post.belongsToMany(db.Hashtag, { through: "PostHashtag" }); //post.addHashtags
db.Post.hasMany(db.Comment); //post.addComments,post.getComments
db.Post.hasMany(db.Image); //post.addImages,post.getImages
db.Post.belongsToMany(db.User, { through: "Like", as: "Likers" }); //다대다 관계 (Like 이름설정,별칭: 좋아요누른사람)
db.Post.belongsTo(db.Post, { as: "Retweet" }); //addRetweet
};
프론트서버에서 parameter로 게시글의 id를 가져와서 그 게시글의 좋아요에 사용자의 ID를 추가하는 방식으로 해보겠습니다.
과정은 다음과 같습니다.
router.patch("/:id/like", isLoggedIn, async (req, res, next) => {
try {
//좋아려 하려고 하는 게시글 조회
const post = await Post.findOne({ where: { id: req.params.id } });
//해당 게시글이 없다면 에러발생
if (!post) {
return res.status(403).send("게시글이 없어요!");
}
//게시글Liker에 로그인되있는 사용자 아이디 추가
await post.addLikers(req.user.id);
// 프론트 리덕스 적용을 위해 포스트아이디와 유저아이디 보내줌
res.status(201).json({ PostId: post.id, UserId: req.user.id });
} catch (e) {
console.error(e);
next(e);
}
});
방식은 좋아요때와 같습니다.
router.delete("/:id/unlike", isLoggedIn, (req, res, next) => {
try {
//취소할 게시글 조회
const post = await Post.findOne({ where: { id: req.params.id } });
if(!post){
return res.status(403).send('게시글이 없어요!');
}
//게시글 Likers에 있는 내 id 제거
await post.removeLikers(req.user.id);
// 프론트 리덕스 적용을 위해 포스트아이디와 유저아이디 보내줌
res.status(201).json({ PostId: post.id, UserId: req.user.id });
} catch (e) {
console.error(e);
next(e);
}
});