๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[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:40728x90
๋ฐ์ํ
<๋ณธ ๋ธ๋ก๊ทธ๋ Developers Corner ์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example!
๐ท ๋ก๊ทธ์ธ ์ ๋์ค๋ token์ผ๋ก user ์ ๋ณด ํ์ธํ๊ธฐ
๐ท ๊ด๋ฆฌ์์ธ์ง ํ์ธํ๊ธฐ
role์ด admin ๊ณผ 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
๋ฐ์ํ
'๐ฉโ๐ป ๋ฐฑ์๋(Back-End) > Node js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments