forked from KoryNunn/prequelize
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparseSettings.js
99 lines (78 loc) · 2.53 KB
/
parseSettings.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
93
94
95
96
97
98
99
var ID = 'id';
var getSubModel = require('./getSubModel');
function uniqueKeys(objects){
return Object.keys(objects.reduce(function(result, object){
for(var key in object){
result[key] = true;
}
return result;
}, {}));
}
function buildQuery(settings, where, include, model, alias){
if(include && include.$fields){
include.$fields.forEach(function(field){
include[field] = true;
});
delete include.$fields;
}
var hasAttributes = include && !include['*'];
var result = {
where: {},
attributes: hasAttributes && [],
model: model,
required: false
},
keys = uniqueKeys([where, include, model.tableAttributes]);
if (alias) {
result.as = alias;
}
var includeResult = {};
keys.forEach(function(key){
var subModel = getSubModel(key, model);
if(typeof where === 'object' && key in where && !subModel){
result.where[key] = settings.transformProperty.to(where[key], model, key);
result.required = true;
}
if(hasAttributes && include && !subModel && (include === true || include[key] || include[key])){
result.attributes.push(key);
}
if(subModel && (where && where[key] || include && include[key])){
// another check here could be model.associations[key].isSelfAssociation however the as is a generic thingy that isnt limited to selfassociations
var alias = subModel.isAliased ? subModel.as : false;
result.required = true;
includeResult[key] = buildQuery(
settings,
where && where[key],
include && include[key],
subModel.target,
alias
);
}
});
var includeKeys = Object.keys(includeResult);
if(hasAttributes){
result.attributes.push(ID);
}
if(includeKeys.length) {
result.include = includeKeys.map(function(key){
return includeResult[key];
});
}
return result;
}
function parseSettings(settings, prequelizeModel){
var sequelizeSettings = buildQuery(
prequelizeModel.settings,
settings.where,
settings.include,
prequelizeModel.model
);
for(var key in settings){
if(key === 'where' || key === 'include'){
continue;
}
sequelizeSettings[key] = settings[key];
}
return sequelizeSettings;
}
module.exports = parseSettings;