1
1
"use strict" ;
2
2
var _ = {
3
- clone : require ( "lodash.clone" ) ,
4
3
omit : require ( "lodash.omit" )
5
4
} ;
6
5
var async = require ( "async" ) ;
@@ -30,7 +29,7 @@ MongoStore._isRelationshipAttribute = function(attribute) {
30
29
31
30
32
31
MongoStore . _toMongoDocument = function ( resource ) {
33
- var document = _ . clone ( resource , true ) ;
32
+ var document = _ . omit ( resource , function ( value ) { return value === undefined ; } ) ;
34
33
document . _id = MongoStore . _mongoUuid ( document . id ) ;
35
34
return document ;
36
35
} ;
@@ -49,18 +48,46 @@ MongoStore._getRelationshipAttributeNames = function(attributes) {
49
48
} ;
50
49
51
50
52
- MongoStore . _getSearchCriteria = function ( relationships ) {
53
- if ( ! relationships ) return { } ;
51
+ MongoStore . prototype . _getSearchCriteria = function ( request ) {
52
+ var self = this ;
53
+ if ( ! request . params . filter ) return { } ;
54
+
55
+ var criteria = Object . keys ( request . params . filter ) . map ( function ( attribute ) {
56
+ var attributeConfig = self . resourceConfig . attributes [ attribute ] ;
57
+ // If the filter attribute doens't exist, skip it
58
+ if ( ! attributeConfig ) return null ;
59
+
60
+ var values = request . params . filter [ attribute ] ;
61
+ // Relationships need to be queried via .id
62
+ if ( attributeConfig . _settings ) {
63
+ attribute += ".id" ;
64
+ // Filters on nested resources should be skipped
65
+ if ( values instanceof Object ) return null ;
66
+ }
54
67
55
- var relationshipNames = Object . getOwnPropertyNames ( relationships ) ;
56
- var criteria = relationshipNames . reduce ( function ( partialCriteria , relationshipName ) {
57
- var relationshipId = relationships [ relationshipName ] ;
58
- partialCriteria [ relationshipName + ".id" ] = relationshipId ;
59
- return partialCriteria ;
60
- } , { } ) ;
61
- debug ( "criteria>" , JSON . stringify ( criteria , null , 2 ) ) ;
68
+ // Coerce values to an array to simplify the logic
69
+ if ( ! ( values instanceof Array ) ) values = [ values ] ;
70
+ values = values . map ( function ( value ) {
71
+ if ( value [ 0 ] === "<" ) return { $lt : value . substring ( 1 ) } ;
72
+ if ( value [ 0 ] === ">" ) return { $gt : value . substring ( 1 ) } ;
73
+ if ( value [ 0 ] === "~" ) return new RegExp ( "^" + value . substring ( 1 ) + "$" , "i" ) ;
74
+ if ( value [ 0 ] === ":" ) return new RegExp ( value . substring ( 1 ) ) ;
75
+ return value ;
76
+ } ) . map ( function ( value ) {
77
+ var tmp = { } ;
78
+ tmp [ attribute ] = value ;
79
+ return tmp ;
80
+ } ) ;
81
+
82
+ return { $or : values } ;
83
+ } ) . filter ( function ( value ) {
84
+ return value !== null ;
85
+ } ) ;
62
86
63
- return criteria ;
87
+ if ( criteria . length === 0 ) {
88
+ return { } ;
89
+ }
90
+ return { $and : criteria } ;
64
91
} ;
65
92
66
93
@@ -95,7 +122,6 @@ MongoStore.prototype._applySort = function(request, cursor) {
95
122
}
96
123
var sortParam = { } ;
97
124
sortParam [ attribute ] = order ;
98
- debug ( "sort>" , sortParam ) ;
99
125
100
126
return cursor . sort ( sortParam ) ;
101
127
} ;
@@ -104,7 +130,6 @@ MongoStore.prototype._applySort = function(request, cursor) {
104
130
MongoStore . prototype . _applyPagination = function ( request , cursor ) {
105
131
if ( ! request . params . page ) return cursor ;
106
132
107
- debug ( "pagination>" , request . params . page . offset , request . params . page . limit ) ;
108
133
return cursor . skip ( request . params . page . offset ) . limit ( request . params . page . limit ) ;
109
134
} ;
110
135
@@ -125,7 +150,6 @@ MongoStore.prototype.initialise = function(resourceConfig) {
125
150
return console . error ( "error connecting to MongoDB:" , err . message ) ;
126
151
} ) . then ( function ( ) {
127
152
var resourceName = resourceConfig . resource ;
128
- debug ( "initialising resource [" + resourceName + "]" ) ;
129
153
var collection = self . _db . collection ( resourceName ) ;
130
154
self . _createIndexesForRelationships ( collection , self . relationshipAttributeNames ) ;
131
155
self . ready = true ;
@@ -156,7 +180,8 @@ MongoStore.prototype.populate = function(callback) {
156
180
MongoStore . prototype . search = function ( request , callback ) {
157
181
var self = this ;
158
182
var collection = self . _db . collection ( request . params . type ) ;
159
- var criteria = MongoStore . _getSearchCriteria ( request . params . relationships ) ;
183
+ var criteria = self . _getSearchCriteria ( request ) ;
184
+ debug ( "search" , JSON . stringify ( criteria ) ) ;
160
185
161
186
async . parallel ( {
162
187
resultSet : function ( asyncCallback ) {
@@ -180,6 +205,8 @@ MongoStore.prototype.search = function(request, callback) {
180
205
MongoStore . prototype . find = function ( request , callback ) {
181
206
var collection = this . _db . collection ( request . params . type ) ;
182
207
var documentId = MongoStore . _mongoUuid ( request . params . id ) ;
208
+
209
+ debug ( "findOne" , JSON . stringify ( { _id : documentId } ) ) ;
183
210
collection . findOne ( { _id : documentId } , { _id : 0 } , function ( err , result ) {
184
211
if ( err || ! result ) {
185
212
return callback ( MongoStore . _notFoundError ( request . params . type , request . params . id ) ) ;
@@ -195,6 +222,7 @@ MongoStore.prototype.find = function(request, callback) {
195
222
MongoStore . prototype . create = function ( request , newResource , callback ) {
196
223
var collection = this . _db . collection ( newResource . type ) ;
197
224
var document = MongoStore . _toMongoDocument ( newResource ) ;
225
+ debug ( "insert" , JSON . stringify ( document ) ) ;
198
226
collection . insertOne ( document , function ( err ) {
199
227
if ( err ) return callback ( err ) ;
200
228
collection . findOne ( document , { _id : 0 } , callback ) ;
@@ -226,7 +254,7 @@ MongoStore.prototype.update = function(request, partialResource, callback) {
226
254
var collection = this . _db . collection ( request . params . type ) ;
227
255
var documentId = MongoStore . _mongoUuid ( request . params . id ) ;
228
256
var partialDocument = _ . omit ( partialResource , function ( value ) { return value === undefined ; } ) ;
229
- debug ( "partialDocument> " , JSON . stringify ( partialDocument , null , 2 ) ) ;
257
+ debug ( "findOneAndUpdate " , JSON . stringify ( partialDocument ) ) ;
230
258
collection . findOneAndUpdate ( {
231
259
_id : documentId
232
260
} , {
@@ -235,12 +263,16 @@ MongoStore.prototype.update = function(request, partialResource, callback) {
235
263
returnOriginal : false ,
236
264
projection : { _id : 0 }
237
265
} , function ( err , result ) {
238
- debug ( "err>" , JSON . stringify ( err , null , 2 ) ) ;
239
- debug ( "result>" , JSON . stringify ( result , null , 2 ) ) ;
240
- if ( err ) return callback ( err ) ;
266
+ if ( err ) {
267
+ debug ( "err" , JSON . stringify ( err ) ) ;
268
+ return callback ( err ) ;
269
+ }
270
+
241
271
if ( ! result || ! result . value ) {
242
272
return callback ( MongoStore . _notFoundError ( request . params . type , request . params . id ) ) ;
243
273
}
274
+
275
+ debug ( "result" , JSON . stringify ( result ) ) ;
244
276
return callback ( null , result . value ) ;
245
277
} ) ;
246
278
} ;
0 commit comments