๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[E-Commerce App with REST API] (5) token๋กœ user ์ •๋ณด ํ™•์ธ & ๊ด€๋ฆฌ์ž ๊ฒ€์ฆ & MongoDB์˜ ID ์œ ํšจํ•œ๊ฐ€ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[E-Commerce App with REST API] (5) token๋กœ user ์ •๋ณด ํ™•์ธ & ๊ด€๋ฆฌ์ž ๊ฒ€์ฆ & MongoDB์˜ ID ์œ ํšจํ•œ๊ฐ€

์ง•์ง•์•ŒํŒŒ์นด 2023. 3. 22. 19:40
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” Developers Corner ์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example!

 

๐ŸŒท ๋กœ๊ทธ์ธ ์‹œ ๋‚˜์˜ค๋Š” token์œผ๋กœ user ์ •๋ณด ํ™•์ธํ•˜๊ธฐ 

๋กœ๊ทธ์ธ ํ•ด์„œ token ๋‚˜์˜จ๊ฑธ auth bearer ์„ค์ •ํ•ด์„œ ์ž…๋ ฅํ•˜๊ธฐ!!!!!!!!!!! ๊ทธ๋ฆฌ๊ณ , id๋กœ ์กฐํšŒํ•˜๊ธฐ

 

๐ŸŒท ๊ด€๋ฆฌ์ž์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

role์ด admin ๊ณผ user๋กœ ๋‚˜๋‰œ๋‹ค

 

๋„ˆ๋Š” user๊ตฌ๋‚˜! ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹ˆ์–!

 

๐ŸŒท ๊ด€๋ฆฌ์ž์—์„œ block ์ธ์ง€ unblock ์ธ์ง€

 

๐ŸŒท ์ฝ”๋“œ

โœ… controllers/useCtrl.js

const User = require("../models/User");
const bcrypt = require("bcrypt");
const asyncHandler = require("express-async-handler");
const { generateToken } = require("../config/jwtToken");
const { validateMongodbID } = require("../utils/validateMongodbID");

const createUser = asyncHandler(async (req, res) => {
  const { firstname, lastname, email, mobile, password } = req.body;
  const findUser = await User.findOne({ email: email });

  // email์ด db์— ์—†๋‹ค๋ฉด
  if (!findUser) {
    // Create a new User
    // 1) ์šฐ์„  ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‰ฌํ™”(์•”ํ˜ธํ™”)
    const hashedPassword = await bcrypt.hash(password, 10);
    // 2) ์ƒˆ User ์ •๋ณด ๋งŒ๋“ค๊ธฐ
    const newUser = await User.create({
      firstname, lastname, email, mobile, password: hashedPassword
    });

    res.json(newUser);
  } else {
    // User already exists
    throw new Error("User already exists");
  }
});

const loginCheck = asyncHandler(async (req, res) => {
  const { email, password } = req.body;
  // check if user exists or not
  const findUser = await User.findOne({ email: email });

  // user ๊ฐ€ ์—†๋‹ค๋ฉด done
  if (!findUser) {
    throw new Error("That email is not registered!");
  }
  // Match password (๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฒดํฌ)
  bcrypt.compare(password, findUser.password, (err, isMatch) => {
    if (err) throw err;
    if (isMatch) {
      res.json({
        _id: findUser?._id,
        firstname: findUser?.firstname,
        lastname: findUser?.lastname,
        email: findUser?.email,
        mobile: findUser?.mobile,
        token: generateToken(findUser?._id)
      });
    } else {
      throw new Error("Email or Password is incorrect!");
    }
  });
})

// Update a user
const updateUser = asyncHandler(async (req, res) => {
  const { _id } = req.user;
  validateMongodbID(_id);

  try {
    const updateUser = await User.findByIdAndUpdate(
      _id,
      {
        firstname: req?.body?.firstname,
        lastname: req?.body?.lastname,
        email: req?.body?.email,
        mobile: req?.body?.mobile,
      }, {
      new: true,
    }
    );
    res.json(updateUser);
  } catch (error) {
    throw new Error(error);
  }
});


// get all users
const getAllUsers = asyncHandler(async (req, res) => {
  try {
    const getUser = await User.find();
    res.json({ getUser });
  } catch (error) {
    throw new Error(error);
  }
});

// get a single users
const getAUsers = asyncHandler(async (req, res) => {
  const { id } = req.params;
  validateMongodbID(id);

  try {
    const getUser = await User.findById(id);
    res.json({ getUser });
  } catch (error) {
    throw new Error(error);
  }
});

// delete a user
const deleteAUser = asyncHandler(async (req, res) => {
  const { id } = req.params;
  validateMongodbID(id);

  try {
    const deleteAUser = await User.findByIdAndDelete(id);
    res.json({ deleteAUser });
  } catch (error) {
    throw new Error(error);
  }
});

// block user
const blockUser = asyncHandler(async (req, res) => {
  const { id } = req.params;
  validateMongodbID(id);

  try {
    const block = await User.findByIdAndUpdate(
      id,
      {
        isBlocked: true,
      },
      {
        new: true,
      }
    );
    res.json(block);
    // res.json({
    //   message : "User blocked"
    // });
  } catch (error) {
    throw new Error(error);
  }
});

const unblockUser = asyncHandler(async (req, res) => {
  const { id } = req.params;
  validateMongodbID(id);

  try {
    const unblock = await User.findByIdAndUpdate(
      id,
      {
        isBlocked: false,
      },
      {
        new: true,
      }
    );
    res.json({
      message : "User unblocked"
    });
  } catch (error) {
    throw new Error(error);
  }
});


module.exports = {
  createUser,
  loginCheck,
  getAllUsers,
  getAUsers,
  deleteAUser,
  updateUser,
  blockUser,
  unblockUser
};

 

โœ… middlewares/authMiddleware.js

const User = require("../models/User");
const jwt = require("jsonwebtoken");
const asyncHandler = require("express-async-handler");

const authMiddleware = asyncHandler(async (req, res, next) => {
  let token;
  if (req?.headers?.authorization?.startsWith("Bearer")) {
    token = req.headers.authorization.split(" ")[1];
    try {
      if (token) {
        const decoded = jwt.verify(token, process.env.SECRET);
        const user = await User.findById(decoded?.id);
        req.user = user;
        next();
      }
    } catch (error) {
      throw new Error("Not authorized token expired. Plz login again!");
    }
  } else {
    throw new Error("No token attached to header!");
  }
});

const isAdmin = asyncHandler(async (req, res, next) => {
  const {email} = req.user;
  const adminUser = await User.findOne({email});

  // ๊ด€๋ฆฌ์ž์ธ์ง€ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๊ธฐ
  if (adminUser.role !== "admin") {
    throw new Error ("You are not an admin!!");
  } else {
    next();
  }
});

module.exports = {
  authMiddleware,
  isAdmin
};

 

โœ… models/User.js

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  firstname: {
    type: String,
    required: true
  },
  lastname: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  mobile: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
  },
  role: {
    type: String,
    default: "user",
  },
  isBlocked : {
    type : Boolean,
    default : false,
  },
  cart: {
    type: Array,
    default: [],
  },
  address: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "Address"
  }],
  wishList: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "Product"
  }]
}, {
  timestamps: true,
  collection: 'users'
});

const User = mongoose.model("User", UserSchema);
module.exports = User;

 

โœ… routes/authRoute.js

const express = require("express");
const router = express.Router();
const { createUser, loginCheck, getAllUsers, getAUsers, deleteAUser, updateUser, blockUser, unblockUser } = require("../controllers/userCtrl");
const { authMiddleware, isAdmin } = require("../middlewares/authMiddleware");

router.post("/register", createUser);
router.post("/login", loginCheck);

router.get("/all-users", getAllUsers);
router.get("/:id", authMiddleware, isAdmin, getAUsers);
router.delete("/:id", deleteAUser);
router.put("/edit-user", authMiddleware, updateUser);
router.put("/block-user/:id", authMiddleware, isAdmin, blockUser);
router.put("/unblock-user/:id", authMiddleware, isAdmin, unblockUser);

module.exports = router;

 

โœ… utils/validateMongodbID.js

const mongoose = require("mongoose");

const validateMongodbID = (id) => {
    const isValid = mongoose.Types.ObjectId.isValid(id);
    if (!isValid) {
        throw new Error("This id is not valid or not found!");   
    }
};

module.exports = {
    validateMongodbID
};

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments