TIL - 220611(토)

Jason Moon·2022년 6월 11일
0

TIL

목록 보기
15/47

오늘 한 일

  • 게시글 CRUD API 코드 짜기 및 테스트

생각

미니프로젝트에서 게시글 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);
  }
});

아직 조회 시 댓글을 추가해주지 않았다. 댓글 구현이 완료되면 추가 할 생각이다.

profile
어려워 보여도 시간을 들여서 해보면 누구나 할 수 있는 일이다

0개의 댓글