좋아요 기능 추가
좋아요 기능에는 먼저 알아두어야 할 것이 있습니다.
Sequelize메소드
우리는 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
};
좋아요 만들기
그리고 Router를 작성해볼까요?
프론트서버에서 parameter로 게시글의 id를 가져와서 그 게시글의 좋아요에 사용자의 ID를 추가하는 방식으로 해보겠습니다.
과정은 다음과 같습니다.
먼저 URI parameter로 받은 게시글 id를 이용해 존재하는 게시글 여부 확인
없는 글이면 에러전송
있다면 Sequelize에서 생성해준 메소드를 이용해 로그인된 사용자 id 추가
리덕스 적용을 위해 프론트로 필요데이터를 날려준다.
URI는 PATCH /post/:id/like
로 받아오겠습니다.
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);
}
});
쉽죠???
Last updated
Was this helpful?