Backend πŸ“š/Node.js

[Node]Instagram Clone - 14. κ΄€λ¦¬μž νšŒμ›κ°€μž… API

leejaejae 2024. 11. 12. 21:12

1. κ΄€λ¦¬μž νšŒμ›κ°€μž… API

  • 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” κ΄€λ¦¬μž νšŒμ›κ°€μž… API κΈ°λŠ₯을 κ΅¬ν˜„ν•¨.
  • μ΄ˆλŒ€ μ½”λ“œλ₯Ό μ‚¬μš©ν•΄ νŠΉμ • μ‚¬μš©μžκ°€ κ΄€λ¦¬μž κΆŒν•œμ„ 가지고 κ°€μž…ν•  수 μžˆλ„λ‘ ν–ˆμœΌλ©°, κ°€μž… μ‹œ 이메일 인증 κΈ°λŠ₯도 ν•¨κ»˜ 제곡됨.

1) κ΄€λ¦¬μž νšŒμ›κ°€μž… API μ„€μ • (adminSignup.js)

  • adminSignup.js νŒŒμΌμ—μ„œλŠ” μ΄ˆλŒ€ μ½”λ“œκ°€ μ˜¬λ°”λ₯Έ κ²½μš°μ—λ§Œ κ΄€λ¦¬μžλ‘œ νšŒμ›κ°€μž…μ΄ μ§„ν–‰λ˜λ„λ‘ ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŒ
  • λ˜ν•œ 이메일 인증 절차λ₯Ό 포함해, 인증 μ½”λ“œκ°€ ν¬ν•¨λœ 이메일을 μ‚¬μš©μžκ°€ μˆ˜μ‹ ν•˜λ„λ‘ ν–ˆμŒ(기쑴의 νšŒμ›κ°€μž…κ³Ό 동일)
const express = require("express");
const router = express.Router();
const { User } = require("../../models/User");
const crypto = require("crypto");
const { sendVerificationEmail } = require("../../utils/sendEmail");

const ADMIN_INVITE_CODE = process.env.ADMIN_INVITE_CODE; // ν™˜κ²½λ³€μˆ˜λ‘œ 뢈러였기

router.use(express.json());

// νšŒμ›κ°€μž… 처리 및 이메일 인증 μ½”λ“œ λ°œμ†‘
router.post("/", async (req, res) => {
  const { email, inviteCode } = req.body;

  try {
    // console.log("Received inviteCode:", inviteCode);

    // μ΄ˆλŒ€ μ½”λ“œ 검증
    if (inviteCode !== ADMIN_INVITE_CODE) {
      return res.status(400).json({
        success: false,
        message: "잘λͺ»λœ μ΄ˆλŒ€ μ½”λ“œμž…λ‹ˆλ‹€. κ΄€λ¦¬μž μ΄ˆλŒ€ μ½”λ“œκ°€ ν•„μš”ν•©λ‹ˆλ‹€.",
      });
    }

    // μ΄ˆλŒ€ μ½”λ“œκ°€ 맞으면 κ΄€λ¦¬μž κΆŒν•œ λΆ€μ—¬
    const role = inviteCode === ADMIN_INVITE_CODE ? "admin" : "user";

    const existingUser = await User.findOne({ email });
    if (existingUser) {
      if (existingUser.isEmailVerified) {
        return res
          .status(400)
          .json({ success: false, message: "이미 κ°€μž…λœ μ‚¬μš©μžμž…λ‹ˆλ‹€." });
      }

      const emailVerificationCode = crypto.randomBytes(3).toString("hex");
      existingUser.emailVerificationCode = emailVerificationCode;
      existingUser.emailVerificationCodeExpires = Date.now() + 300000;

      const emailSent = await sendVerificationEmail(
        email,
        emailVerificationCode
      );
      if (!emailSent) {
        return res
          .status(500)
          .json({ success: false, message: "이메일 전솑 μ‹€νŒ¨" });
      }

      await existingUser.save();
      return res
        .status(200)
        .json({ success: true, message: "μΈμ¦μ½”λ“œκ°€ μž¬μ „μ†‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€." });
    }

    const emailVerificationCode = crypto.randomBytes(3).toString("hex");

    const user = new User({
      ...req.body,
      role, // μ„€μ •λœ μ—­ν•  μ €μž₯
      emailVerificationCode,
      emailVerificationCodeExpires: Date.now() + 300000,
    });

    console.log("Role:", role); // 역할이 μ œλŒ€λ‘œ μ„€μ •λλŠ”μ§€ 확인

    const emailSent = await sendVerificationEmail(email, emailVerificationCode);
    if (!emailSent) {
      return res
        .status(500)
        .json({ success: false, message: "이메일 전솑 μ‹€νŒ¨" });
    }

    await user.save(); // μ‚¬μš©μž 정보 μ €μž₯
    res.status(200).json({ success: true, message: "이메일 전솑 성곡" });
  } catch (err) {
    res.status(500).json({ success: false, err });
  }
});

// 이메일 인증 처리
...

module.exports = router;


2) User μŠ€ν‚€λ§ˆ μˆ˜μ • (User.js)

  • User μŠ€ν‚€λ§ˆμ— role ν•„λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬, μ‚¬μš©μžκ°€ 일반 μ‚¬μš©μž(user)인지 κ΄€λ¦¬μž(admin)인지 ꡬ뢄
  • 기본값은 user둜 μ„€μ •.
// User.js

role: {
  type: String, // λ¬Έμžμ—΄λ‘œ λ³€κ²½
  enum: ["user", "admin"], // κ°€λŠ₯ν•œ κ°’ μ„€μ •
  default: "user", // κΈ°λ³Έκ°’: 일반 μ‚¬μš©μž
},

 

2. κ²°κ³Ό πŸŽ‰