Skip to content

Commit f5816c1

Browse files
authored
Merge pull request #27 from jfabellera/bootstrap-sucks
Migrates to antd
2 parents 1a95b31 + de266b0 commit f5816c1

40 files changed

+2761
-2234
lines changed

backend/routes/expenses.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const validateGetExpenses = [
2525
check(['start_date', 'end_date'], 'Invalid date format').optional(),
2626
check('search').optional().isString(),
2727
check('group_id').optional().isMongoId(),
28+
check('category').optional(),
2829
check('per_page', 'Invalid number').optional().isInt({ min: 1, max: 100 }),
2930
check('page', 'Invalid number').optional().isInt({ min: 1 }),
3031
];
@@ -85,6 +86,11 @@ getExpenses = async (req, res) => {
8586
query.group_id = req.query.group_id;
8687
}
8788

89+
// Category
90+
if (req.query.category) {
91+
query.category = req.query.category;
92+
}
93+
8894
// handle username
8995
if (req.params.username) {
9096
query.user_id = req.user._id;
@@ -257,6 +263,7 @@ router.post(
257263
date: removeTimeZoneOffset(req.body.date),
258264
category: req.body.category,
259265
};
266+
console.log(query);
260267
if (!req.body.group_id && req.user.default_group_id)
261268
query.group_id = req.user.default_group_id;
262269
else if (req.body.group_id) query.group_id = req.body.group_id;

backend/routes/groups.js

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ const Group = require('../models/groupModel');
88
const User = require('../models/userModel');
99
const Expense = require('../models/expenseModel');
1010

11+
removeTimeZoneOffset = (inputDate) => {
12+
const date = new Date(inputDate);
13+
const serverTimezonOffset = date.getTimezoneOffset() * 60000;
14+
const utcDate = new Date(date.getTime() - serverTimezonOffset);
15+
return utcDate;
16+
};
17+
1118
getGroups = (req, res) => {
1219
let err = validationResult(req);
1320
if (!err.isEmpty()) return res.status(400).json(err.errors);
@@ -24,10 +31,95 @@ getGroups = (req, res) => {
2431
default: String(group._id) === String(req.user.default_group_id),
2532
};
2633
}),
34+
default_group_id: req.user.default_group_id,
2735
});
2836
});
2937
};
3038

39+
const validateGetExpenseGroups = [
40+
check('start_date').optional().isDate(),
41+
check('end_date').optional().isDate(),
42+
check('amounts').optional().isBoolean(),
43+
];
44+
45+
getExpenseGroups = async (req, res) => {
46+
let err = validationResult(req);
47+
if (!err.isEmpty()) {
48+
res.status(400).json(err.errors);
49+
} else {
50+
let query = {};
51+
if (req.params.username) {
52+
query.user_id = req.user._id;
53+
}
54+
55+
// Date range
56+
if (req.query.start_date) {
57+
if (!query.date) query.date = {};
58+
query.date.$gte = removeTimeZoneOffset(
59+
new Date(req.query.start_date).setHours(00, 00, 00)
60+
);
61+
}
62+
63+
if (req.query.end_date) {
64+
if (!query.date) query.date = {};
65+
query.date.$lte = removeTimeZoneOffset(
66+
new Date(req.query.end_date).setHours(23, 59, 59)
67+
);
68+
}
69+
70+
Expense.find(query).distinct('group_id', (err, group_ids) => {
71+
if (err) throw err;
72+
73+
let queries = [];
74+
if (req.query.amounts && req.query.amounts === 'true') {
75+
group_ids.forEach((group_id) => {
76+
queries.push(
77+
Expense.aggregate([
78+
{
79+
$match: { ...query, group_id: group_id },
80+
},
81+
{
82+
$group: {
83+
_id: group_id,
84+
total: {
85+
$sum: '$amount',
86+
},
87+
},
88+
},
89+
]).exec()
90+
);
91+
});
92+
}
93+
94+
Group.find({ user_id: req.user._id }, (err, groups) => {
95+
if (err) throw err;
96+
Promise.all(queries).then((results) => {
97+
let groupObjArray;
98+
if (results.length > 0)
99+
groupObjArray = results
100+
.map((result) => {
101+
const group = groups.filter((group) =>
102+
group._id.equals(result[0]._id)
103+
)[0];
104+
105+
return {
106+
_id: result[0]._id,
107+
name: group ? group.name : '',
108+
total: result[0].total,
109+
};
110+
})
111+
.filter((result) => result.name);
112+
else
113+
groupObjArray = group_ids.map((group_id) => {
114+
return { _id: group_id };
115+
});
116+
res.status(200).json({ groups: groupObjArray });
117+
});
118+
});
119+
});
120+
}
121+
};
122+
31123
/**
32124
* Get all groups
33125
*/
@@ -62,11 +154,11 @@ router.post(
62154
{ default_group_id: group._id },
63155
(err, user) => {
64156
if (err) throw err;
65-
res.sendStatus(200);
157+
res.status(200).json({ _id: group._id });
66158
}
67159
);
68160
} else {
69-
res.sendStatus(200);
161+
res.status(200).json({ _id: group._id });
70162
}
71163
}
72164
);
@@ -145,4 +237,9 @@ router.delete(
145237
}
146238
);
147239

148-
module.exports = { router: router, getGroups: getGroups };
240+
module.exports = {
241+
router: router,
242+
getGroups: getGroups,
243+
validateGetExpenseGroups: validateGetExpenseGroups,
244+
getExpenseGroups: getExpenseGroups,
245+
};

backend/routes/users.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ const {
1010
validateGetExpenseCategories,
1111
getExpenseCategories,
1212
} = require('./expenses');
13-
const { getGroups } = require('./groups');
13+
const {
14+
getGroups,
15+
validateGetExpenseGroups,
16+
getExpenseGroups,
17+
} = require('./groups');
1418

1519
const config = require('../config');
1620

@@ -109,7 +113,7 @@ router.get(
109113
router.post(
110114
'/',
111115
[
112-
check('username', 'Username is required').exists(),
116+
check('username', 'Username is required').exists().isAlphanumeric(),
113117
check('password', 'Password is required').exists(),
114118
check('name').customSanitizer((name) => {
115119
let newName = { first: '', last: '' };
@@ -256,4 +260,11 @@ router.get(
256260
getGroups
257261
);
258262

263+
router.get(
264+
'/:username/expenses/groups',
265+
auth,
266+
validateGetExpenseGroups,
267+
getExpenseGroups
268+
);
269+
259270
module.exports = router;

0 commit comments

Comments
 (0)