1
+ var parseSettings = require ( './parseSettings' ) ,
2
+ transformData = require ( './transformData' ) ,
3
+ format = require ( './format' ) ,
4
+ righto = require ( 'righto' ) ,
5
+ abbott = require ( 'abbott' ) ,
6
+ errors = require ( 'generic-errors' ) ,
7
+ merge = require ( 'flat-merge' ) ,
8
+ extend = require ( 'cyclic-deep-extend' ) ,
9
+ oneResultOrError = require ( './oneResultOrError' ) ,
10
+ resultOrError = require ( './resultOrError' ) ;
11
+
12
+ function extendSettings ( settings , extendedSettings ) {
13
+ settings = merge ( { } , settings ) ;
14
+ settings . where = extend ( { } , settings . where ) ;
15
+ settings . include = extend ( { } , settings . include ) ;
16
+ return settings ;
17
+ }
18
+
19
+ /*
20
+ ## Get.
21
+
22
+ Get exactly one result by ID.
23
+
24
+ If no results are found, the call will be rejected with an Error with code 404.
25
+ */
26
+ function get ( id , settings , callback ) {
27
+ var prequelizeModel = this ;
28
+
29
+ settings = extendSettings ( settings , {
30
+ where : {
31
+ id : id
32
+ }
33
+ } ) ;
34
+
35
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
36
+
37
+ sequelizeSettings . transaction = settings . transaction ;
38
+
39
+ var result = prequelizeModel . findOne ( sequelizeSettings ) ;
40
+
41
+ callback && result ( callback ) ;
42
+
43
+ return result ;
44
+ }
45
+
46
+ /*
47
+ ## Find.
48
+
49
+ Find the first result of a query.
50
+
51
+ If no results are found, the call will be resolved no result.
52
+ */
53
+ function find ( settings , callback ) {
54
+ var prequelizeModel = this ;
55
+
56
+ settings = extendSettings ( settings ) ;
57
+
58
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
59
+
60
+ extend ( sequelizeSettings , {
61
+ limit : 1 ,
62
+ transaction : settings . transaction
63
+ } ) ;
64
+
65
+ var sequelizeResult = prequelizeModel . model . find ( sequelizeSettings ) ;
66
+
67
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
68
+
69
+ callback && result ( callback ) ;
70
+
71
+ return result ;
72
+ }
73
+
74
+ /*
75
+ ## Find All.
76
+
77
+ Find all results of a query.
78
+ */
79
+ function findAll ( settings , callback ) {
80
+ var prequelizeModel = this ;
81
+
82
+ settings = extendSettings ( settings ) ;
83
+
84
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
85
+
86
+ extend ( sequelizeSettings , {
87
+ transaction : settings . transaction
88
+ } ) ;
89
+
90
+ var sequelizeResult = prequelizeModel . model . findAll ( sequelizeSettings ) ;
91
+
92
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
93
+
94
+ callback && result ( callback ) ;
95
+
96
+ return result ;
97
+ }
98
+
99
+ /*
100
+ ## Find All.
101
+
102
+ Find and count all results of a query.
103
+ */
104
+ function findAndCountAll ( settings , callback ) {
105
+ var prequelizeModel = this ;
106
+
107
+ settings = extendSettings ( settings ) ;
108
+
109
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
110
+
111
+ extend ( sequelizeSettings , {
112
+ transaction : settings . transaction
113
+ } ) ;
114
+
115
+ var sequelizeResult = prequelizeModel . model . findAndCountAll ( sequelizeSettings ) ;
116
+
117
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
118
+
119
+ callback && result ( callback ) ;
120
+
121
+ return result ;
122
+ }
123
+
124
+ /*
125
+ ## Find one.
126
+
127
+ Find exactly one result of a query.
128
+
129
+ If no results are found, the call will be rejected with an Error with code 404.
130
+
131
+ If more than one result is found, the call will throw.
132
+ */
133
+ function findOne ( settings , callback ) {
134
+ var prequelizeModel = this ;
135
+
136
+ settings = extendSettings ( settings ) ;
137
+
138
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
139
+
140
+ extend ( sequelizeSettings , {
141
+ limit : 2 ,
142
+ transaction : settings . transaction
143
+ } ) ;
144
+
145
+ var sequelizeResult = prequelizeModel . model . findAll ( sequelizeSettings ) ;
146
+
147
+ var result = righto ( oneResultOrError , sequelizeResult , prequelizeModel ) ;
148
+
149
+ callback && result ( callback ) ;
150
+
151
+ return result ;
152
+ }
153
+
154
+ /*
155
+ ## Remove.
156
+
157
+ Remove all results of a query.
158
+ */
159
+ function remove ( settings , callback ) {
160
+ var prequelizeModel = this ;
161
+
162
+ settings = extendSettings ( settings ) ;
163
+
164
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
165
+
166
+ extend ( sequelizeSettings , {
167
+ transaction : settings . transaction
168
+ } ) ;
169
+
170
+ var sequelizeResult = prequelizeModel . model . remove ( sequelizeSettings ) ;
171
+
172
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
173
+
174
+ callback && result ( callback ) ;
175
+
176
+ return result ;
177
+ }
178
+
179
+ /*
180
+ ## Remove One.
181
+
182
+ Remove exactly one result of a query.
183
+
184
+ If no results are found, the call will be rejected with an Error with code 404.
185
+
186
+ If more than one result is found, the call will throw.
187
+ */
188
+ function removeOne ( settings , callback ) {
189
+ var prequelizeModel = this ;
190
+
191
+ settings = extendSettings ( settings ) ;
192
+
193
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ,
194
+ removeTransaction = settings . transaction ?
195
+ null :
196
+ prequelizeModel . model . sequelize . transaction ( ) ;
197
+
198
+ extend ( sequelizeSettings , {
199
+ transaction : settings . transaction || removeTransaction
200
+ } ) ;
201
+
202
+ var sequelizeResult = prequelizeModel . model . remove ( sequelizeSettings ) ;
203
+
204
+ function resolveResult ( done ) {
205
+ var deleteResult = righto ( format , sequelizeResult , prequelizeModel ) ;
206
+
207
+ deleteResult ( function ( error , result ) {
208
+ if ( error ) {
209
+ if ( removeTransaction ) {
210
+ return abbott ( removeTransaction . rollback ( ) ) ( function ( ) {
211
+ done ( error , result ) ;
212
+ } ) ;
213
+ }
214
+
215
+ return done ( error ) ;
216
+ }
217
+
218
+ if ( result > 2 ) {
219
+ throw new Error ( 'Expected only 1 affected row, instead affected ' + result ) ;
220
+ }
221
+
222
+ function checkOne ( error , result ) {
223
+ if ( error || result < 1 ) {
224
+ return done ( error || new errors . NotFound ( ) ) ;
225
+ }
226
+
227
+ done ( null , result ) ;
228
+ }
229
+
230
+ if ( removeTransaction ) {
231
+ return abbott ( removeTransaction . commit ( ) ) ( function ( commitError ) {
232
+ checkOne ( commitError , result ) ;
233
+ } ) ;
234
+ }
235
+
236
+ checkOne ( null , result ) ;
237
+ } ) ;
238
+ }
239
+
240
+ var result = righto ( resolveResult ) ;
241
+
242
+ callback && result ( callback ) ;
243
+
244
+ return result ;
245
+ }
246
+
247
+ /*
248
+ ## Create.
249
+
250
+ Create a record.
251
+ */
252
+ function create ( data , settings , callback ) {
253
+ var prequelizeModel = this ;
254
+
255
+ settings = extendSettings ( settings ) ;
256
+
257
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
258
+
259
+ extend ( sequelizeSettings , {
260
+ transaction : settings . transaction
261
+ } ) ;
262
+
263
+ var sequelizeResult = prequelizeModel . model . create (
264
+ transformData ( data , prequelizeModel , prequelizeModel . settings . transformProperty . to ) ,
265
+ sequelizeSettings
266
+ ) ;
267
+
268
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
269
+
270
+ callback && result ( callback ) ;
271
+
272
+ return result ;
273
+ }
274
+
275
+ /*
276
+ ## Update.
277
+
278
+ Update all results of a query.
279
+ */
280
+ function update ( data , settings , callback ) {
281
+ var prequelizeModel = this ;
282
+
283
+ settings = extendSettings ( settings ) ;
284
+
285
+ var sequelizeSettings = parseSettings ( settings , prequelizeModel ) ;
286
+
287
+ extend ( sequelizeSettings , {
288
+ transaction : settings . transaction
289
+ } ) ;
290
+
291
+ var sequelizeResult = prequelizeModel . model . update (
292
+ transformData ( data , prequelizeModel , prequelizeModel . settings . transformProperty . to ) ,
293
+ sequelizeSettings
294
+ ) ;
295
+
296
+ var result = righto ( format , sequelizeResult , prequelizeModel ) ;
297
+
298
+ callback && result ( callback ) ;
299
+
300
+ return result ;
301
+ }
302
+
303
+ var defaultTransformProperty = {
304
+ to : function ( data ) {
305
+ return data ;
306
+ } ,
307
+ from : function ( data ) {
308
+ return data ;
309
+ }
310
+ }
311
+
312
+ function createModelMethods ( model , modelName , settings ) {
313
+ var modelSettings = settings . modelSettings && settings . modelSettings [ modelName ] ,
314
+ prequelizeModel = {
315
+ name : modelName ,
316
+ prequelizeSettings : settings ,
317
+ settings : {
318
+ transformProperty :
319
+ settings . transformProperty ||
320
+ defaultTransformProperty
321
+ } ,
322
+ model : model
323
+ } ;
324
+
325
+ prequelizeModel . get = get . bind ( prequelizeModel ) ;
326
+ prequelizeModel . find = find . bind ( prequelizeModel ) ;
327
+ prequelizeModel . findAll = findAll . bind ( prequelizeModel ) ;
328
+ prequelizeModel . findAndCountAll = findAndCountAll . bind ( prequelizeModel ) ;
329
+ prequelizeModel . findOne = findOne . bind ( prequelizeModel ) ;
330
+ prequelizeModel . remove = remove . bind ( prequelizeModel ) ;
331
+ prequelizeModel . removeOne = removeOne . bind ( prequelizeModel ) ;
332
+ prequelizeModel . create = create . bind ( prequelizeModel ) ;
333
+ prequelizeModel . update = update . bind ( prequelizeModel ) ;
334
+
335
+ return prequelizeModel ;
336
+ }
337
+
338
+ module . exports = function ( models , settings ) {
339
+ settings = settings || { } ;
340
+ return Object . keys ( models ) . reduce ( function ( result , key ) {
341
+ result [ key ] = createModelMethods ( models [ key ] , key , settings ) ;
342
+ return result ;
343
+ } , { } ) ;
344
+ } ;
0 commit comments