Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 48 additions & 24 deletions controllers/authController.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,56 @@
const userModel = require('../models/userModel');
const moment = require('moment');
const passport = require('passport');
const jwt = require('jsonwebtoken');

require('dotenv').config();
const registerUser = async (req, res) => {
const body = req.body;
body.createdAt = moment().toDate();

exports.signup = (req, res) => {
res.json({
message: 'Signup successful',
user: req.user
});
}
try {
const user = await userModel.create(body);
res.status(201).json({ message: 'Signup successful', user });
} catch (error) {
if (error.code === 11000) {
return res.status(500).json({
status: false,
error: `username ${body.username} is taken already `,
});
}

exports.login = (req, res, { err, user, info}) => {
let newMessage = Object.values(error.errors)
.map((element) => element.message)
.join(' , ');
if (newMessage) {
return res.status(500).json({ status: false, message: newMessage });
}
return res.status(500).json({ status: false, error });
}
};

if (!user) {
return res.json({ message: 'Username or password is incorrect'})
}
const loginUser = async (req, res, next) => {
passport.authenticate('login', async (err, user, info) => {
try {
if (err) return next(err);
if (!user) {
const error = new Error('Username or password is incorrect');
return next(error);
}
req.login(user, { session: false }, async (error) => {
if (error) return next(error);

// req.login is provided by passport
req.login(user, { session: false },
async (error) => {
if (error) return res.status(400).json(error)
const body = { _id: user._id, username: user.username };
//You store the id and email in the payload of the JWT.
// You then sign the token with a secret or key (JWT_SECRET), and send back the token to the user.
// DO NOT STORE PASSWORDS IN THE JWT!
const token = jwt.sign({ user: body }, process.env.JWT_SECRET);

const body = { _id: user._id, username: user.username };
//You store the id and username in the payload of the JWT.
// You then sign the token with a secret or key (JWT_SECRET), and send back the token to the user.
// DO NOT STORE PASSWORDS IN THE JWT!
const token = jwt.sign({ user: body }, process.env.JWT_SECRET || 'something_secret');
return res.json({ user: user.username, token });
});
} catch (error) {
return next(error);
}
})(req, res, next);
};

return res.status(200).json({ token });
}
);
}
module.exports = { registerUser, loginUser };
197 changes: 90 additions & 107 deletions controllers/orderController.js
Original file line number Diff line number Diff line change
@@ -1,108 +1,91 @@
const { OrderModel } = require('../models')
const moment = require('moment');

exports.createOrder = async (req, res) => {
const body = req.body;

const total_price = body.items.reduce((prev, curr) => {
prev += curr.price
return prev
}, 0);

const order = await OrderModel.create({
items: body.items,
created_at: moment().toDate(),
total_price
})

return res.json({ status: true, order })
}

exports.getOrder = async (req, res) => {
const { orderId } = req.params;
const order = await OrderModel.findById(orderId)

if (!order) {
return res.status(404).json({ status: false, order: null })
}

return res.json({ status: true, order })
}

exports.getOrders = async (req, res) => {
const { query } = req;

const {
created_at,
state,
order = 'asc',
order_by = 'created_at',
page = 1,
per_page = 10
} = query;

const findQuery = {};

if (created_at) {
findQuery.created_at = {
$gt: moment(created_at).startOf('day').toDate(),
$lt: moment(created_at).endOf('day').toDate(),
}
}

if (state) {
findQuery.state = state;
}

const sortQuery = {};

const sortAttributes = order_by.split(',')

for (const attribute of sortAttributes) {
if (order === 'asc' && order_by) {
sortQuery[attribute] = 1
}

if (order === 'desc' && order_by) {
sortQuery[attribute] = -1
}
}


const orders = await OrderModel
.find(findQuery)
.sort(sortQuery)
.skip(page)
.limit(per_page)

return res.json({ status: true, orders })
}

exports.updateOrder = async (req, res) => {
const { id } = req.params;
const { state } = req.body;

const order = await OrderModel.findById(id)

if (!order) {
return res.status(404).json({ status: false, order: null })
}

if (state < order.state) {
return res.status(422).json({ status: false, order: null, message: 'Invalid operation' })
}

order.state = state;

await order.save()

return res.json({ status: true, order })
}

exports.deleteOrder = async (req, res) => {
const { id } = req.params;

const order = await OrderModel.deleteOne({ _id: id})

return res.json({ status: true, order })
}
const orderModel = require('../models/orderModel');

const createOrder = async (req, res, next) => {
const body = req.body;

const total_price = body.items.reduce((prev, curr) => {
prev += curr.price;
return prev;
}, 0);
try {
const order = await orderModel.create({
items: body.items,
created_at: moment().toDate(),
total_price,
});

return res.json({ status: true, order });
} catch (error) {
next(error);
}
};

const getSingleOrder = async (req, res) => {
const { id } = req.params;
const order = await orderModel.findById(id);

if (!order) {
return res.status(404).json({ status: false, order: null });
}

return res.json({ status: true, order });
};

const getAllOrders = async (req, res) => {
const info = req.user;
const { sort, state } = req.query;

const queryObject = {};
if (state) {
queryObject.state = state;
}

let orders = orderModel.find(queryObject);
if (sort) {
orders = orders.sort(sort);
}
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 3;
const skip = (page - 1) * limit;

orders = await orders.skip(skip).limit(limit);
return res.json({ info, status: true, orders });
};

const updateOrder = async (req, res) => {
const { id } = req.params;
const { state } = req.body;

try {
const order = await orderModel.findOneAndUpdate(
{ _id: id },
{ state: state },
{ new: true, runValidators: true }
);

if (!order) {
return res.status(404).json({ status: false, order: null });
}

return res.json({ status: true, order });
} catch (error) {
return res.status(500).json({ status: false, error: error.message });
}
};

const deleteOrder = async (req, res) => {
const { id } = req.params;

const order = await orderModel.deleteOne({ _id: id });

return res.json({ status: true, order });
};

module.exports = {
createOrder,
getSingleOrder,
getAllOrders,
updateOrder,
deleteOrder,
};
79 changes: 55 additions & 24 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,68 @@
const express = require('express');
const BasicAuth = require('./middleware/basicAuth');
const OrderRouter = require('./routes/OrderRoutes');
const AuthRouter = require('./routes/AuthRoutes');
const Database = require('./database');
const mongoose = require('mongoose');

const PORT = 3334
//importing routers
const orderRouter = require('./routes/OrderRoutes');
const authRouter = require('./routes/AuthRoutes');
const passport = require('passport');

const app = express()
//import authentication middleware
require('./middleware/BasicAuth');

// connect to database
Database.connect();
const PORT = 3000;

// register passport
require("./passport")
const app = express();

// middleware
app.use(express.json());
// app.use(BasicAuth)
app.use(express.urlencoded({ extended: false }));

// routes
app.use('/', OrderRouter)
app.use('/', AuthRouter)
// using the routers
app.use('/user', authRouter);
app.use(
'/orders',
passport.authenticate('jwt', { session: false }),
orderRouter
);

// home route
app.get('/', (req, res) => {
return res.json({ status: true })
})
return res.json({ status: true });
});

// 404 route
app.use('*', (req, res) => {
return res.status(404).json({ message: 'route not found' })
})
app.all('*', (req, res) => {
return res.status(404).json({ status: false, msg: 'page not Found' });
});

// Handle errors.
app.use((err, req, res, next) => {
if (err.code === 11000) {
return res.status(500).json({
status: false,
error: `username ${body.username} is taken already `,
});
}

// let newMessage = Object.values(error.errors).map(element => element.message).join(' , ')
// if(newMessage){
// return res.status(500).json({ status: false, message: newMessage} )
// }

res.status(err.status || 500);
res.json({ error: err.message });
});

mongoose.connect('mongodb://localhost:27017');

mongoose.connection.on('connected', () => {
console.log('Connected to MongoDB Successfully');
});

mongoose.connection.on('error', (err) => {
console.log('An error occurred while connecting to MongoDB');
console.log(err);
});

app.listen(PORT, () => {
console.log('Listening on port, ', PORT)
})
console.log('Listening on port, ', PORT);
});

module.exports = app;
3 changes: 3 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
forceExit: true,
};
Loading