-
Notifications
You must be signed in to change notification settings - Fork 47
/
resource-creator.js
59 lines (52 loc) · 2.02 KB
/
resource-creator.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
const _ = require('lodash');
const P = require('bluebird');
const Interface = require('forest-express');
const { ErrorHTTP422 } = require('./errors');
const ResourceGetter = require('./resource-getter');
const CompositeKeysManager = require('./composite-keys-manager');
function ResourceCreator(model, params) {
const schema = Interface.Schemas.schemas[model.name];
this.perform = function perform() {
const promises = [];
const recordCreated = model.build(params);
if (model.associations) {
_.forOwn(model.associations, (association, name) => {
if (association.associationType === 'BelongsTo') {
promises.push(recordCreated[`set${_.upperFirst(name)}`](params[name], { save: false }));
}
});
}
return P.all(promises)
.then(() => recordCreated.validate()
.catch((error) => {
throw new ErrorHTTP422(error.message);
}))
.then(() => recordCreated.save())
.then((record) => {
const promisesAfterSave = [];
// NOTICE: Many to many associations have to be set after the record creation in order to
// have an id.
if (model.associations) {
_.forOwn(model.associations, (association, name) => {
if (association.associationType === 'HasOne') {
promisesAfterSave.push(record[`set${_.upperFirst(name)}`](params[name]));
} else if (['BelongsToMany', 'HasMany'].indexOf(association.associationType) > -1) {
promisesAfterSave.push(record[`add${_.upperFirst(name)}`](params[name]));
}
});
}
return P.all(promisesAfterSave)
.thenReturn(record);
})
.then((record) => {
if (schema.isCompositePrimary) {
record.forestCompositePrimary = new CompositeKeysManager(model, schema, record)
.createCompositePrimary();
}
return new ResourceGetter(model, {
recordId: record[schema.idField],
}).perform();
});
};
}
module.exports = ResourceCreator;