리트윗

//리트윗
router.post("/:id/retweet", isLoggedIn, async (req, res, next) => {
  //:id는 parameter
  try {
    //백앤드에서 철저히 검사를 해줘야 한다. (개시글이 있는 개시글인지)
    const post = await Post.findOne({
      where: { id: req.params.id },
      include: [{ model: Post, as: "Retweet" }],
    });
    if (!post) {
      return res.send.status(403).send("존재하지 않는 개시글입니다");
    }
    if (
      req.user.id === post.UserId || //자기 게시글 리트윗 막기
      (post.Retweet && post.Retweet.UserId === req.user.id) //자기 게시글 리트윗한 게시글 리트위 막기
    ) {
      return res.status(403).send("자기 글을 리트윗 안되요!");
    }
    //그러나 다른 사람 게시글을 리트윗한 게시글을 리트윗하면 리트윗하면 원본게시글 리트윗됨
    const retweetTargetId = post.RetweetId || post.id;
    const exPost = await Post.findOne({
      where: {
        UserId: req.user.id,
        RetweetId: retweetTargetId,
      },
    });
    if (exPost) {
      return res.status(403).send("이미 리트윗 함");
    }
    const retweet = await Post.create({
      UserId: req.user.id,
      RetweetId: retweetTargetId,
      content: "retweet", //원래는 null이여야 하지만, model에서 null을 허용안해서
    });
    const retweetWithPrevPost = await Post.findOne({
      where: { id: retweet.id },
      include: [
        {
          model: Post,
          as: "Retweet",
          include: [
            { model: User, attributes: ["id", "nickname"] },
            { model: Image },
          ],
        },
        { model: User, attributes: ["id", "nickname"] },
        {
          model: User, // 좋아요 누른 사람
          as: "Likers",
          attributes: ["id"],
        },
        { model: Image },
        {
          model: Comment,
          include: [{ model: User, attributes: ["id", "nickname"] }],
        },
      ],
    });
    //include가 너무 많아지면 DB읽는 속도가 느려져서 분리해줘야 한다. (Comment같이)
    res.status(201).json(retweetWithPrevPost); //생성되었다고 프론트로
  } catch (e) {
    console.error(e);
    next(e);
  }
});

Last updated