Backend ๐Ÿ“š/Node.js

[Node]Instagram Clone - 15. ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์ผ๋ฐ˜ ์œ ์ € ์‚ญ์ œ API

leejaejae 2024. 11. 16. 16:33

1. ๊ด€๋ฆฌ์ž๊ฐ€ ์ผ๋ฐ˜ ์œ ์ €๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” API

  • ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ผ๋ฐ˜ ์œ ์ €๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” API ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•จ.
  • ์ผ๋ฐ˜ ์œ ์ €๋Š” ์ž์‹ ์˜ ๊ณ„์ •๋งŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ด€๋ฆฌ์ž๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋‹ค๋ฅธ ์œ ์ €๋“ค์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ด€๋ฆฌ์ž๋งŒ์ด ์œ ์ € ๊ด€๋ฆฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ์œ ์ € ์‚ญ์ œ ์‹œ ํ•ด๋‹น ์œ ์ €์˜ ๋ชจ๋“  ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๊ฒŒ๋” ๊ตฌํ˜„ํ•จ.

1) ๊ด€๋ฆฌ์ž ์œ ์ € ์‚ญ์ œ API ์„ค์ • (adminDeleteUser.js)

  • adminDeleteUser.js ํŒŒ์ผ: ๊ด€๋ฆฌ์ž๊ฐ€ ํŠน์ • ์œ ์ €๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๊ด€๋ฆฌ์ž๋Š” admin ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์œ ์ €๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์‹œ์— ํ•ด๋‹น ์œ ์ €์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•จ. ์ด ๊ณผ์ •์€ ๊ด€๋ฆฌ์ž์˜ ๊ถŒํ•œ ์ฒดํฌ์™€ ์œ ์ € ์‚ญ์ œ ํ›„ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๊ณผ์ •์„ ํฌํ•จํ•จ.
const express = require("express");
const router = express.Router();

const { User } = require("../../models/User");
const { Post } = require("../../models/Post");
const { Comment } = require("../../models/Comment");
const { Like } = require("../../models/Like");
const { auth } = require("../auth");

router.delete("/:userId", auth, async (req, res) => {
  const userId = req.params.userId;

  try {
    // ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ
    const user = await User.findById(req.user._id);

    // ์œ ์ €๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๊ถŒํ•œ ๊ฑฐ๋ถ€
    if (!user || user.role !== "admin") {
      return res
        .status(403)
        .json({ message: "์œ ์ €๋ฅผ ์‚ญ์ œํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค." });
    }

    // ์‚ญ์ œํ•˜๋ ค๋Š” ์œ ์ €๋ฅผ ์ฐพ๊ธฐ
    const userToDelete = await User.findById(userId);
    if (!userToDelete) {
      return res.status(404).json({ message: "์œ ์ €๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." });
    }

    // ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ
    await Post.deleteMany({ user: userToDelete._id });

    // ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ๋Œ“๊ธ€ ์‚ญ์ œ
    await Comment.deleteMany({ user: userToDelete._id });

    // ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๋ฌผ/๋Œ“๊ธ€ ์‚ญ์ œ
    await Like.deleteMany({ user: userToDelete._id });

    // ์œ ์ € ์‚ญ์ œ
    await User.findByIdAndDelete(userId);

    return res.status(200).json({
      message: "์œ ์ €๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
    });
  } catch (error) {
    return res.status(500).json({
      message: "์œ ์ € ์‚ญ์ œ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.",
      error: error.message,
    });
  }
});

module.exports = router;


2) ์ฃผ์š” ๊ธฐ๋Šฅ ์„ค๋ช…

  • ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํ™•์ธ: ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ. ๋งŒ์•ฝ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์œ ์ € ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œ.
  • ์œ ์ € ์ฐพ๊ธฐ: ์‚ญ์ œํ•  ์œ ์ €๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฐพ๊ณ , ์œ ์ €๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜.
  • ๊ฒŒ์‹œ๋ฌผ, ๋Œ“๊ธ€, ์ข‹์•„์š” ์‚ญ์ œ: ์‚ญ์ œ๋˜๋Š” ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๋ฌผ, ๋Œ“๊ธ€, ์ข‹์•„์š” ์ •๋ณด๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ. ์ด๋ฅผ ํ†ตํ•ด ์œ ์ €์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ์‚ญ์ œ๋จ.
  • ์œ ์ € ์‚ญ์ œ: ๋ชจ๋“  ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ ํ›„, ์œ ์ € ์ž์ฒด๋ฅผ ์‚ญ์ œ.