Hi Everyone,
I have started creating an ecommerce MERN Stack Project on youtube, you can find link of youtube playlist below
https://www.youtube.com/playlist?list=PLB_Wd4-5SGAYsxD4JGaVdXll3PnoyI-AM
Here I am sharing my day to day video code for the people who is looking for Source code
Lets start with backend Rest Api Code
I hope you are familiar with npm init command
lets continue with server code
src/index.server.js
const express = require('express');
const env = require('dotenv');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const authRoutes = require('./routes/auth');
const adminRoutes = require('./routes/admin/auth');
env.config();
mongoose.connect(
`mongodb+srv://${process.env.MONGO_DB_USER}:${process.env.MONGO_DB_PASSWORD}@cluster0.8pl1w.mongodb.net/${process.env.MONGO_DB_DATABASE}?retryWrites=true&w=majority`,
{
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
}
).then(() => {
console.log('Database connected');
});
app.use(bodyParser());
app.use('/api', authRoutes);
app.use('/api', adminRoutes);
app.listen(process.env.PORT, () => {
console.log(`Server is running on port ${process.env.PORT}`);
});
src/models/user.js
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const userSchema = new mongoose.Schema({
firstName: {
type: String,
required: true,
trim: true,
min: 3,
max: 20
},
lastName: {
type: String,
required: true,
trim: true,
min: 3,
max: 20
},
username: {
type: String,
required: true,
trim: true,
unique: true,
index: true,
lowercase: true
},
email: {
type: String,
required: true,
trim: true,
unique: true,
lowercase: true
},
hash_password: {
type: String,
required: true
},
role: {
type: String,
enum: ['user', 'admin'],
default:'user'
},
contactNumber: { type: String },
pofilePicture: { type: String }
}, { timestamps: true });
userSchema.virtual('password')
.set(function(password){
this.hash_password = bcrypt.hashSync(password, 10);
});
userSchema.virtual('fullName')
.get(function(){
return `${this.firstName} ${this.lastName}`;
});
userSchema.methods = {
authenticate: function(password){
return bcrypt.compareSync(password, this.hash_password);
}
}
module.exports = mongoose.model('User', userSchema);
src/routes/auth.js
const express = require('express');
const { signup, signin, requireSignin } = require('../controller/auth');
const router = express.Router();
router.post('/signup', signup);
router.post('/signin', signin);
module.exports = router;
src/routes/admin/auth.js
const express = require('express');
const { signup, signin, requireSignin } = require('../../controller/admin/auth');
const router = express.Router();
router.post('/admin/signup', signup);
router.post('/admin/signin', signin);
module.exports = router;
src/controller/auth.js
const User = require('../models/user');
const jwt = require('jsonwebtoken');
exports.signup = (req, res) => {
User.findOne({ email: req.body.email })
.exec((error, user) => {
if(user) return res.status(400).json({
message: 'User already registered'
});
const {
firstName,
lastName,
email,
password
} = req.body;
const _user = new User({
firstName,
lastName,
email,
password,
username: Math.random().toString()
});
_user.save((error, data) => {
if(error){
return res.status(400).json({
message: 'Something went wrong'
});
}
if(data){
return res.status(201).json({
message: 'User created Successfully..!'
})
}
});
});
}
exports.signin = (req, res) => {
User.findOne({ email: req.body.email })
.exec((error, user) => {
if(error) return res.status(400).json({ error });
if(user){
if(user.authenticate(req.body.password)){
const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET, { expiresIn: '1h' });
const { _id, firstName, lastName, email, role, fullName } = user;
res.status(200).json({
token,
user: {_id, firstName, lastName, email, role, fullName}
});
}else{
return res.status(400).json({
message: 'Invalid Password'
})
}
}else{
return res.status(400).json({message: 'Something went wrong'});
}
});
}
exports.requireSignin = (req, res, next) => {
const token = req.headers.authorization.split(" ")[1];
const user = jwt.verify(token, process.env.JWT_SECRET);
req.user = user;
next();
}
src/controller/admin/auth.js
const User = require('../../models/user');
const jwt = require('jsonwebtoken');
exports.signup = (req, res) => {
User.findOne({ email: req.body.email })
.exec((error, user) => {
if(user) return res.status(400).json({
message: 'Admin already registered'
});
const {
firstName,
lastName,
email,
password
} = req.body;
const _user = new User({
firstName,
lastName,
email,
password,
username: Math.random().toString(),
role: 'admin'
});
_user.save((error, data) => {
if(error){
return res.status(400).json({
message: 'Something went wrong'
});
}
if(data){
return res.status(201).json({
message: 'Admin created Successfully..!'
})
}
});
});
}
exports.signin = (req, res) => {
User.findOne({ email: req.body.email })
.exec((error, user) => {
if(error) return res.status(400).json({ error });
if(user){
if(user.authenticate(req.body.password) && user.role === 'admin'){
const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET, { expiresIn: '1h' });
const { _id, firstName, lastName, email, role, fullName } = user;
res.status(200).json({
token,
user: {_id, firstName, lastName, email, role, fullName}
});
}else{
return res.status(400).json({
message: 'Invalid Password'
})
}
}else{
return res.status(400).json({message: 'Something went wrong'});
}
});
}
exports.requireSignin = (req, res, next) => {
const token = req.headers.authorization.split(" ")[1];
const user = jwt.verify(token, process.env.JWT_SECRET);
req.user = user;
next();
}
Time to time i will update this page and plz do like this page and subscribe our youtube channel