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
442 changes: 188 additions & 254 deletions controllers/account.controller.js

Large diffs are not rendered by default.

130 changes: 50 additions & 80 deletions controllers/budget.controller.js
Original file line number Diff line number Diff line change
@@ -1,100 +1,70 @@
const asyncHandler = require('../utials/asyncHandler');
const Budget = require('../model/budget.model');
const User = require('../model/user.model');
const Log = require('../model/log.model');
const Category = require('../model/category.model');
const createLog = require('../utials/log');
const ApiError = require('../utials/apiError');




//find all budget
const getAllBudget = async (req, res) => {
try {
const Budgets = await Budget.find({});
if (Budgets.length > 0) {
return res.status(200).json({ success: true, message: 'All Budget Fatch Success', data: Budgets })
}
else {
return res.status(404).json({ success: false, message: 'Budget Not Found' })
}
}
catch (error) {
console.log(error);
return res.status(500).json({ success: false, message: 'Somethng went wrong!please try again' })
const fetchAllBudgets = asyncHandler(async (req, res) => {
const budgets = await Budget.find({});
if (budgets.length === 0) {
return res.status(204).send();
}
}

res.status(200).json({ success: true, message: 'All Budgets Fatched Successfully', data: budgets });
});

//set Budget with selected category
const addNewBudget = async (req, res) => {
try {
const { categoryId, limit, date } = req.body;
const user = await User.findOne({});
if (!categoryId || !limit) {
return res.status(400).json({ success: false, message: 'All Fields are required' });
}
if (!user) {
return res.status(404).json({ success: false, message: 'user not found' })
}
// Check if budget already exists for this category
const existCategoryBudget = await Budget.findOne({ category: categoryId, date });
if (existCategoryBudget) {
existCategoryBudget.limit = limit;
await existCategoryBudget.save();
return res.status(200).json({ success: true, message: 'Budget updated', data: existCategoryBudget });
}
const budget = await Budget.create({
category: categoryId,
limit,
date,
userId: user._id
});
const createBudget = asyncHandler(async (req, res) => {
const { categoryId, limit, date } = req.body;
if (!categoryId || !limit) {
throw new ApiError(400, 'All Fields are required');
}

await Log.create({ userId: user._id, message: `${user.username} created a new monthly budget limit ₹${limit}` });
return res.status(201).json({ success: true, message: 'Budget created Successfully.!', data: budget });
} catch (err) {
console.log(err);
return res.status(500).json({ success: false, message: 'Something went wrong! Please try again' });
const category = await Category.findById(categoryId);
if (!category) {
throw new ApiError(404, 'Category not found');
}
};

const budget = await Budget.create({
category: categoryId,
limit,
date,
});
await createLog(` Created a new monthly Budget for "${category.name}" category with limit ₹${limit}`);
res.status(201).json({ success: true, message: 'Budget created Successfully.!', data: budget });
});


//Update budget by ID
const updateBudget = async (req, res) => {
try {
const budgetUpdateFormData = req.body;
const getCurrentBudget = req.params.id;
const { limit } = req.body;
if (!limit) {
return res.status(400).json({ success: false, message: 'Limit is required' });
}
const updatedBudget = await Budget.findByIdAndUpdate(getCurrentBudget, budgetUpdateFormData, { new: true }
);
if (!updatedBudget) {
return res.status(404).json({ success: false, message: 'Budget not found' });
}
return res.status(200).json({ success: true, message: 'Budget updated successfully', data: updatedBudget });
} catch (error) {
console.error(error);
return res.status(500).json({ success: false, message: 'Something went wrong' });
const updateBudgetDetails = asyncHandler(async (req, res) => {
const budgetUpdateFormData = req.body;
const getCurrentBudget = req.params.id;
const { limit } = req.body;
if (!limit) {
throw new ApiError(400, 'limit is required');
}
};


//delete
const deleteBudget = async (req, res) => {
try {
const getCurrentBudgetId = req.params.id;
const deleteBudget = await Budget.findByIdAndDelete(getCurrentBudgetId);
if (!deleteBudget) {
return res.status(404).json({ success: false, message: 'Selected ctageory budget not found' })
}
res.status(200).json({ success: true, message: 'Category Budget Delete Success', data: deleteBudget })
const updatedBudget = await Budget.findByIdAndUpdate(getCurrentBudget, budgetUpdateFormData, { new: true }
);
if (!updatedBudget) {
throw new ApiError(404, 'Budget not found');
}
catch (error) {
console.error(error);
return res.status(500).json({ success: false, message: 'something went wrong! please try again' })
await createLog(`update budget with new limit ${updatedBudget.limit}`)
res.status(200).json({ success: true, message: 'Budget updated successfully', data: updatedBudget });
});

//deleted budget
const deleteBudgetById = asyncHandler(async (req, res) => {
const getBudgetId = req.params.id;
const deletedBudget = await Budget.findByIdAndDelete(getBudgetId);
if (!deletedBudget) {
throw new ApiError(404, 'Budget not found');
}
}
await createLog(`deleted a monthly budget of limit ₹${deletedBudget.limit}`)
res.status(200).json({ success: true, message: 'Category Budget Delete Success', data: deletedBudget });

});

module.exports = { getAllBudget, addNewBudget, updateBudget, deleteBudget };
module.exports = { fetchAllBudgets, createBudget, deleteBudgetById, updateBudgetDetails };
194 changes: 74 additions & 120 deletions controllers/category.controller.js
Original file line number Diff line number Diff line change
@@ -1,139 +1,93 @@
const Category = require('../model/category.model');
const Account = require('../model/account.model');
const RecordList = require('../model/record-list.model');
const User = require('../model/user.model');
const Log = require('../model/log.model');
const Budget = require('../model/budget.model');
const asyncHandler = require('../utials/asyncHandler');
const createLog = require('../utials/log');
const ApiError = require('../utials/apiError');


//getAll Category
const getAllCategory = async (req, res) => {
try {
const getAllCategory = await Category.find({});
if (getAllCategory.length > 0) {
return res.status(200).json({ success: true, message: 'All Category Fatch Successfully', data: getAllCategory })
}
else {
return res.status(404).json({ success: false, message: 'Category Not Found' })
}
//fetch All Categories
const fetchAllCategories = asyncHandler(async (req, res) => {
const categories = await Category.find({});
if (categories.length === 0) {
return res.status(204).send();
}
catch (error) {
console.log(err);
return res.state(500).json({ success: false, message: 'Something went wrong! please try again' })
}
}
res.status(200).json({ success: true, message: 'All Categories Fatched Successfully', data: categories })

});
//create new Catgeory
const addNewCategory = async (req, res) => {
try {
const { name, type } = req.body;
if (!name || !type) {
return res.status(404).json({ success: false, message: 'All Fields are required' })
}
const user = await User.findOne({});
if (!user) {
return res.status(404).json({ success: false, message: 'User not found' });
}
const newCategoryFormData = { name, type };
const newCreatedCategory = await Category.create(newCategoryFormData);
if (newCreatedCategory) {
const message = ` ${type} Category " ${name}" Created successful By: "${user.username}"`
await Log.create({ userId: user._id, message });
return res.status(201).json({ success: true, message: 'Category Cretae Successful', data: newCreatedCategory })
}
else {
return res.status(400).json({ success: false, message: 'Failed to create Category' })
}
const createCategory = asyncHandler(async (req, res) => {
const { name, type } = req.body;
if (!name || !type) {
throw new ApiError(400, 'All Fields are required');
}
catch (error) {
return res.status(500).json({
success: false,
message: 'Something went wrong! please try again'
})
const newCategoryFormData = { name, type };
const newCreatedCategory = await Category.create(newCategoryFormData);
if (newCreatedCategory) {
await createLog(` ${type} Category " ${name}" Created successful`);
return res.status(201).json({ success: true, message: 'Category Created Successful', data: newCreatedCategory })
}
}
//delete Category
const deleteCategory = async (req, res) => {
try {
const categoryId = req.params.id;
const category = await Category.findByIdAndDelete(categoryId);
const user = await User.findOne({});
if (!user) {
return res.status(404).json({ success: false, message: 'User not found' });
}
if (!category) {
return res.status(404).json({ success: false, message: 'Category not found' });
}
//monthly budget also deleted when used category deleted
const deletedBudget = await Budget.findOneAndDelete({ category: categoryId });
if (deletedBudget) {
await Log.create({
userId: user._id,
message: `Monthly Set Budget for deleted category "${category.name}" was also Delete by ${user.username}`,
});
}
// find all transactions selected category
const findTransactionRecords = await RecordList.find({ category: categoryId });
for (const record of findTransactionRecords) {
const account = await Account.findById(record.account);
const updateAmount = record.type === 'income' ? -record.amount : record.amount;
if (account) {
account.amount += updateAmount;
await account.save();
}
//Log each transaction deletion
const message = `${record.type} transaction of ₹${record.amount} (from deleted category "${category.name}") was removed by ${user.username}`;
await Log.create({ userId: user._id, message });
await RecordList.findByIdAndDelete(record._id);
}
await Log.create({ userId: user._id, message: `${category.type} category "${category.name}" was deleted by ${user.username}` });
return res.status(200).json({ success: true, message: 'Category deleted successfully', data: { category, deletedRecords: findTransactionRecords.length } });
}
catch (error) {
console.error('Error deleting category:', error.message);
return res.status(500).json({ success: false, message: 'Something went wrong. Please try again.' });
}
};

throw new ApiError(400, 'Failed to create Category');


});

//update categoryByid
const updateCategory = async (req, res) => {
try {
const categoryUpdateFormData = req.body;
const getCurrentCategoryById = req.params.id;
const updateCategory = await Category.findByIdAndUpdate(getCurrentCategoryById, categoryUpdateFormData, { new: true });
const user = await User.findOne({});
if (!user) {
return res.status(404).json({ success: false, message: 'User not found' });
}
if (!updateCategory) {
return res.status(404).json({ success: false, message: 'Category Not Found' })
}
const message = `"${updateCategory.name} " ${updateCategory.type} Category update successfully. By: "${user.username}"`;
await Log.create({ userId: user._id, message });
return res.status(200).json({ success: true, message: 'Category Update Success', data: updateCategory })
}
catch (error) {
console.log(error);
return res.status(500).json({ success: false, message: 'something went wrong! please try again' })
const updateCategoryDetails = asyncHandler(async (req, res) => {
const categoryUpdateFormData = req.body;
const getCurrentCategoryById = req.params.id;
const updateCategory = await Category.findByIdAndUpdate(getCurrentCategoryById, categoryUpdateFormData, { new: true });
if (!updateCategory) {
throw new ApiError(404, 'Category not found');
}
}
await createLog(`"${updateCategory.name} " ${updateCategory.type} Category update successfully`);
res.status(200).json({ success: true, message: 'Category Update Success', data: updateCategory })
});

//getcategory BY Id
const getCategoryById = async (req, res) => {
try {
const getCurrentCategoryById = req.params.id;
const getCategoryDetailsById = await Category.findById(getCurrentCategoryById);
if (!getCategoryDetailsById) {
return res.status(404).json({ success: false, message: 'category not found' })
}
else {
return res.status(200).json({ success: true, message: 'Category Details Fatch Success..', data: getCategoryDetailsById })


//delete Category
const deleteCategoryById = asyncHandler(async (req, res) => {
const categoryId = req.params.id;
const category = await Category.findByIdAndDelete(categoryId);
if (!category) {
throw new ApiError(404, 'Category not found');
}
//monthly budget also deleted when used category deleted
const deletedBudget = await Budget.findOneAndDelete({ category: categoryId });
if (deletedBudget) {
await createLog(`Monthly Set Budget for deleted category "${category.name}" was also Delete`);
}
// find all transactions selected category
const findTransactionRecords = await RecordList.find({ category: categoryId });
for (const record of findTransactionRecords) {
const account = await Account.findById(record.account);
const updateAmount = record.type === 'income' ? -record.amount : record.amount;
if (account) {
account.amount += updateAmount;
await account.save();
}
//Log each transaction deletion
await createLog(`${record.type} transaction of ₹${record.amount} (from deleted category "${category.name}") was removed`)
await RecordList.findByIdAndDelete(record._id);
}
catch (error) {
console.log(error);
return res.status(500).json({ success: false, message: "something went wrong! please try again" })
await createLog(`${category.type} category "${category.name}" was deleted`)
res.status(200).json({ success: true, message: 'Category deleted successfully', data: { category, deletedRecords: findTransactionRecords.length } });
});



//getcategory BY Id
const fetchCategoryById = asyncHandler(async (req, res) => {
const getCategoryById = req.params.id;
const getCategoryDetailsById = await Category.findById(getCategoryById);
if (!getCategoryDetailsById) {
throw new ApiError(404, 'Category not found');
}
}
res.status(200).json({ success: true, message: 'Category Details Fetch Success..', data: getCategoryDetailsById })

});

module.exports = { getAllCategory, addNewCategory, updateCategory, deleteCategory, getCategoryById }
module.exports = { fetchAllCategories, createCategory,fetchCategoryById, deleteCategoryById, updateCategoryDetails }
Loading