@@ -8,6 +8,13 @@ const Group = require('../models/groupModel');
8
8
const User = require ( '../models/userModel' ) ;
9
9
const Expense = require ( '../models/expenseModel' ) ;
10
10
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
+
11
18
getGroups = ( req , res ) => {
12
19
let err = validationResult ( req ) ;
13
20
if ( ! err . isEmpty ( ) ) return res . status ( 400 ) . json ( err . errors ) ;
@@ -24,10 +31,95 @@ getGroups = (req, res) => {
24
31
default : String ( group . _id ) === String ( req . user . default_group_id ) ,
25
32
} ;
26
33
} ) ,
34
+ default_group_id : req . user . default_group_id ,
27
35
} ) ;
28
36
} ) ;
29
37
} ;
30
38
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
+
31
123
/**
32
124
* Get all groups
33
125
*/
@@ -62,11 +154,11 @@ router.post(
62
154
{ default_group_id : group . _id } ,
63
155
( err , user ) => {
64
156
if ( err ) throw err ;
65
- res . sendStatus ( 200 ) ;
157
+ res . status ( 200 ) . json ( { _id : group . _id } ) ;
66
158
}
67
159
) ;
68
160
} else {
69
- res . sendStatus ( 200 ) ;
161
+ res . status ( 200 ) . json ( { _id : group . _id } ) ;
70
162
}
71
163
}
72
164
) ;
@@ -145,4 +237,9 @@ router.delete(
145
237
}
146
238
) ;
147
239
148
- module . exports = { router : router , getGroups : getGroups } ;
240
+ module . exports = {
241
+ router : router ,
242
+ getGroups : getGroups ,
243
+ validateGetExpenseGroups : validateGetExpenseGroups ,
244
+ getExpenseGroups : getExpenseGroups ,
245
+ } ;
0 commit comments