From 6f1f66a41ba2ff5205a7f6cc2571d0e759967f82 Mon Sep 17 00:00:00 2001 From: shobhi10058 Date: Tue, 13 Dec 2022 22:21:10 +0530 Subject: [PATCH] added all APIs after testing them. --- backend/controllers/expense.js | 80 ++++++++++++++++++++++++++++++++ backend/controllers/user.js | 84 +++++++++++++++++++++++++++------- backend/routes/expense.js | 9 ++++ backend/routes/user.js | 7 ++- backend/utilities/date.js | 9 ++++ backend/utilities/general.js | 6 +++ 6 files changed, 177 insertions(+), 18 deletions(-) create mode 100644 backend/controllers/expense.js create mode 100644 backend/routes/expense.js create mode 100644 backend/utilities/date.js create mode 100644 backend/utilities/general.js diff --git a/backend/controllers/expense.js b/backend/controllers/expense.js new file mode 100644 index 0000000..2e7a544 --- /dev/null +++ b/backend/controllers/expense.js @@ -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" }); + } + } +} \ No newline at end of file diff --git a/backend/controllers/user.js b/backend/controllers/user.js index dd5a6d7..488dbd7 100644 --- a/backend/controllers/user.js +++ b/backend/controllers/user.js @@ -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) => { @@ -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" }); } } } \ No newline at end of file diff --git a/backend/routes/expense.js b/backend/routes/expense.js new file mode 100644 index 0000000..028243a --- /dev/null +++ b/backend/routes/expense.js @@ -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; \ No newline at end of file diff --git a/backend/routes/user.js b/backend/routes/user.js index 69fa54d..7637875 100644 --- a/backend/routes/user.js +++ b/backend/routes/user.js @@ -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; \ No newline at end of file diff --git a/backend/utilities/date.js b/backend/utilities/date.js new file mode 100644 index 0000000..e8c590f --- /dev/null +++ b/backend/utilities/date.js @@ -0,0 +1,9 @@ + + +const dateBeforeXFromNow = (daysBefore) => { + const date = new Date(); + date.setDate(date.getDate() - daysBefore); + return date; +} + +module.exports = { dateBeforeXFromNow }; \ No newline at end of file diff --git a/backend/utilities/general.js b/backend/utilities/general.js new file mode 100644 index 0000000..88eac55 --- /dev/null +++ b/backend/utilities/general.js @@ -0,0 +1,6 @@ +const assert = function (condition, message) { + if (!condition) + throw Error('Assert failed: ' + (message || '')); +}; + +module.exports = { assert } \ No newline at end of file