미니프로젝트에서 게시글 CRUD 구현, 좋아요 기능, 해쉬태그 검색기능 구현을 맡았다. 오늘은 게시글 CRUD 코드를 짰다. 이전에 한 번 해본적이 있어 어렵지 않게 구현했다.
프론트엔드 팀원이 상세 게시글 조회 시 자신이 쓴 글이 아닐 경우 수정, 삭제 버튼이 안보이도록 할 수 없을까를 고민했다. 자신이 쓴 게시글의 상세 게시글에 들어가면 true 아닐 경우 false값을 response로 줄 수 없냐고 물어봤는데 처음에는 쉽다고 생각했는데 생각보다 구현이 쉽지 않았다.
로그인 안 한 사람도 상세 게시글을 볼 수 있도록 해놨기 때문에 로그인 확인 미들웨어를 넣을 수 없다고 생각했다. JWT 토큰 방식으로 로그인을 구현했기 때문에 토큰 유무, 그리고 토큰이 있을 경우 자신이 썼는지 안썼는지 유무의 경우의 수를 생각해서 하면 되는데 한 라우터 안에서 이 구현이 잘 되지 않았다.
내일까지 고민해보고 기술 매니저님과 한 번 얘기를 해봐야겠다.
게시글 CRUD
// 전체게시글 조회
router.get('/posts', async (req, res, next) => {
try {
const posts = await Post.findAll({
order: [['createdAt', 'DESC']],
include: [{ model: User, attributes: ['id', 'nickname'] }],
});
res.status(200).json(posts);
} catch (error) {
console.error(error);
next(error);
}
});
// 게시글 작성
router.post('/post', authMiddleware, async (req, res, next) => {
const { title, img, content } = req.body;
const UserId = res.locals.user.id;
try {
const post = await Post.create({ title, img, content, UserId });
res.status(201).json(post);
} catch (error) {
console.error(error);
next(error);
}
});
// 게시글 상세 조회
router.get('/post/:id', async (req, res, next) => {
try {
const post = await Post.findOne({
where: { id: Number(req.params.id) },
include: [
{
model: User,
attributes: ['id', 'nickname'],
},
],
});
res.status(201).json(post);
} catch (error) {
console.error(error);
next(error);
}
});
// 게시글 수정
router.put('/post/:id', authMiddleware, async (req, res, next) => {
const post = await Post.findOne({ where: { id: Number(req.params.id) } });
const user = res.locals.user;
if (post.UserId !== user.id) {
return res.status(401).json({ message: '작성자만 수정할 수 있습니다.' });
}
try {
await Post.update(
{
title: req.body.title,
img: req.body.img,
content: req.body.content,
},
{ where: { id: Number(req.params.id) } }
);
res.status(201).json({ PostId: Number(req.params.id) });
} catch (error) {
console.error(error);
next(error);
}
});
// 게시글 삭제
router.delete('/post/:id', authMiddleware, async (req, res, next) => {
const post = await Post.findOne({ where: { id: Number(req.params.id) } });
const user = res.locals.user;
if (post.UserId !== user.id) {
return res.status(401).json({ message: '작성자만 삭제할 수 있습니다.' });
}
try {
await Post.destroy({
where: { id: Number(req.params.id) },
});
res.json({ PostId: Number(req.params.id) });
} catch (error) {
console.error(error);
next(error);
}
});
아직 조회 시 댓글을 추가해주지 않았다. 댓글 구현이 완료되면 추가 할 생각이다.