-
Notifications
You must be signed in to change notification settings - Fork 601
/
composite.js
92 lines (72 loc) · 2.4 KB
/
composite.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
* Composite Queries
*/
var _ = require('@sailshq/lodash');
var usageError = require('../utils/usageError');
var utils = require('../utils/helpers');
var normalize = require('../utils/normalize');
var Deferred = require('./deferred');
var hasOwnProperty = utils.object.hasOwnProperty;
module.exports = {
/**
* Find or Create a New Record
*
* @param {Object} search criteria
* @param {Object} values to create if no record found
* @param {Function} callback
* @return Deferred object if no callback
*/
findOrCreate: function(criteria, values, cb, metaContainer) {
var self = this;
if (typeof values === 'function') {
cb = values;
values = null;
}
// If no criteria is specified, bail out with a vengeance.
var usage = utils.capitalize(this.identity) + '.findOrCreate([criteria], values, callback)';
if (typeof cb == 'function' && (!criteria || criteria.length === 0)) {
return usageError('No criteria option specified!', usage, cb);
}
// Normalize criteria
criteria = normalize.criteria(criteria);
// If no values were specified, use criteria
if (!values) values = criteria.where ? criteria.where : criteria;
// Return Deferred or pass to adapter
if (typeof cb !== 'function') {
return new Deferred(this, this.findOrCreate, {
method: 'findOrCreate',
criteria: criteria,
values: values
});
}
// This is actually an implicit call to findOrCreateEach
if (Array.isArray(criteria) && Array.isArray(values)) {
return this.findOrCreateEach(criteria, values, cb);
}
if (typeof cb !== 'function') return usageError('Invalid callback specified!', usage, cb);
// Try a find first.
var q = this.find(criteria);
if(metaContainer) {
q.meta(metaContainer);
}
q.exec(function(err, results) {
if (err) return cb(err);
if (results && results.length !== 0) {
// Unserialize values
results = self._transformer.unserialize(results[0]);
// Return an instance of Model
var model = new self._model(results);
return cb(null, model);
}
// Create a new record if nothing is found.
var q2 = self.create(values);
if(metaContainer) {
q2.meta(metaContainer);
}
q2.exec(function(err, result) {
if (err) return cb(err);
return cb(null, result);
});
});
}
};