Skip to content

Commit

Permalink
added all APIs after testing them.
Browse files Browse the repository at this point in the history
  • Loading branch information
shobhit10058 committed Dec 13, 2022
1 parent 3821394 commit 6f1f66a
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 18 deletions.
80 changes: 80 additions & 0 deletions backend/controllers/expense.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
const Expense = require('../models/expense');
const User = require('../models/user')
const { dateBeforeXFromNow } = require('../utilities/date');

module.exports = {
addNewExpense: async (req, res) => {
const { body } = req;
try {
const user = await User.findById(body.userID);
const { userID, category, amount } = body;
if (!user.categories.includes(category)) {
return res.status(400).json({ message: "invalid category" });
}
if (amount > user.amountLeft) {
return res.status(400).json({ message: "budget not enough" });
}
const expense = new Expense({ userID, category, amount });
user.currentExpensesIDs.push(expense._id);
user.amountLeft = user.amountLeft - amount;
await expense.save();
await user.save();
res.status(200).json({ message: "expense saved", id: expense._id });
} catch (e) {
console.log(e);
res.status(400).json({ message: "expense not saved" });
}
},

// only update amount or deleted
updateExpense: async (req, res) => {
const { body } = req;
try {
const { userID, amount, deleted } = body;
const { id } = req.params;
const user = await User.findById(userID);
const expense = await Expense.findById(id);
if (deleted != undefined) {
if (expense.deleted !== deleted) {
let newAmount = user.amountLeft + ((2 * deleted - 1) * expense.amount);
if (newAmount >= 0) {
expense.deleted = deleted;
user.amountLeft = newAmount;
await expense.save();
await user.save();
return res.status(200).json({ message: "expense updated" });
}
return res.status(400).json({ message: "budget not enough" });
}
}
else if ((amount !== undefined) && (!expense.deleted)) {
let newAmount = user.amountLeft + (expense.amount - amount);
if (newAmount >= 0) {
expense.amount = amount;
user.amountLeft = newAmount;
await expense.save();
await user.save();
return res.status(200).json({ message: "expense updated" });
}
return res.status(400).json({ message: "budget not enough" });
}
} catch (e) {
console.log(e);
res.status(400).json({ message: "expense not updated" });
}
},

// gives expense data upto x days from now
getSummaryUptoXDays: async (req, res) => {
const { body } = req;
try {
const { userID } = body;
const { days } = req.query;
const expenses = await Expense.find({ userID }).where('date').gt(dateBeforeXFromNow(days)).sort('date');
res.status(200).json({ data: expenses, message: "data retrieved" });
} catch (e) {
console.log(e);
res.status(400).json({ message: "data could not be retrieved" });
}
}
}
84 changes: 68 additions & 16 deletions backend/controllers/user.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const User = require('../models/user')
const User = require('../models/user');
const Expense = require('../models/expense');
const { hashPassword, verifyPassword } = require('../utilities/managePasswords')
const { genJWT, verifyJWT } = require('../utilities/jwtAuth');
const expense = require('../models/expense');

module.exports = {
signUp: async (req, res) => {
Expand All @@ -11,31 +13,81 @@ module.exports = {
const newUser = new User({ username: username, password: secPassword });
await newUser.save();

const token = genJWT({userId: newUser.id});
res.status(200).json({token: token, message: "user details saved"});
const token = genJWT({ userID: newUser.id });
res.status(200).json({ token: token, message: "user details saved" });
} catch (e) {
console.log("error occured", e);
res.status(500).json({message: "server error occurred"})
res.status(400).json({ message: "user details not saved" });
}
},
login: async (req, res) => {
const { username, password } = req.body;
try{
const user = await User.findOne({username});
if(!user){
res.status(401).json({message: "please login with correct credentials"});
}else{
try {
const user = await User.findOne({ username });
if (!user) {
res.status(401).json({ message: "please login with correct credentials" });
} else {
const isCorrPass = await verifyPassword(password, user.password);
if(!isCorrPass){
res.status(401).json({message: "please login with correct credentials"});
}else{
const token = genJWT({userId: user.id});
res.status(200).json({token: token, message: "user logged in successfully"});
if (!isCorrPass) {
res.status(401).json({ message: "please login with correct credentials" });
} else {
const token = genJWT({ userID: user.id });
res.status(200).json({ token: token, message: "user logged in successfully" });
}
}
}catch(e){
} catch (e) {
console.log("error occured", e);
res.status(500).json({message: "server error occurred"})
res.status(500).json({ message: "server error occurred" })
}
},
updateSetting: async (req, res) => {
const { body } = req;
try {
const { budget, categories, userID} = body;
console.log({userID})
const user = await User.findById(userID);
user.budget = budget;
user.amountLeft = budget;
user.categories = categories;
await Expense.deleteMany({ "_id": { "$in": user.currentExpensesIDs } });
user.currentExpensesIDs = [];
await user.save();
res.status(200).json({ message: "setting updated" });
} catch (e) {
console.log(e);
res.status(400).json({ message: "setting not updated" });
}
},
currentExpenses: async (req, res) => {
const { body } = req;
try {
const user = await User.
findById(body.userID).
populate("currentExpensesIDs")
let data = [];
if (user.currentExpensesIDs.length > 0 && user.currentExpensesIDs[0].date.toDateString() != new Date().toDateString()) {
user.currentExpensesIDs = [];
user.amountLeft = user.budget;
user.save();
} else {
data = user.currentExpensesIDs.map(expense => {
return { "amount": expense.amount, "category": expense.category, "deleted": expense.deleted, "id": expense._id}
})
}
res.status(200).json({ data: data, message: "current expenses retrieved" });
} catch (e) {
console.log(e);
res.status(400).json({ message: "could not get current expenses" });
}
},
getDetails: async (req, res) => {
const { body } = req;
try {
const { userID } = body;
const user = await User.findById(userID).select("-_id username budget amountLeft categories");
return res.status(200).json({ data: user, message: "user details retrieved" });
} catch (e) {
res.status(400).json({ message: "could not retrieve user details" });
}
}
}
9 changes: 9 additions & 0 deletions backend/routes/expense.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const router = require('express').Router()
const { addNewExpense, updateExpense, getSummaryUptoXDays } = require('../controllers/expense');
const getUserFromJWT = require('../middlewares/validateUser');

router.post('/new', getUserFromJWT, addNewExpense);
router.put('/update/:id', getUserFromJWT, updateExpense);
router.get("/summaryUpto", getUserFromJWT, getSummaryUptoXDays)

module.exports = router;
7 changes: 5 additions & 2 deletions backend/routes/user.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
const router = require('express').Router()
const { signUp, login } = require('../controllers/user')

const { signUp, login, updateSetting, currentExpenses, getDetails} = require('../controllers/user')
const getUserFromJWT = require('../middlewares/validateUser');

router.post('/signUp', signUp);
router.post('/login', login);
router.put('/updateSetting', getUserFromJWT, updateSetting);
router.get('/currentExpenses', getUserFromJWT, currentExpenses);
router.get('/getDetails', getUserFromJWT, getDetails);

module.exports = router;
9 changes: 9 additions & 0 deletions backend/utilities/date.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@


const dateBeforeXFromNow = (daysBefore) => {
const date = new Date();
date.setDate(date.getDate() - daysBefore);
return date;
}

module.exports = { dateBeforeXFromNow };
6 changes: 6 additions & 0 deletions backend/utilities/general.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const assert = function (condition, message) {
if (!condition)
throw Error('Assert failed: ' + (message || ''));
};

module.exports = { assert }

0 comments on commit 6f1f66a

Please sign in to comment.