@unclepaul/allcountjs
Version:
The open source framework for rapid business application development with Node.js
66 lines (62 loc) • 2.87 kB
JavaScript
var _ = require('underscore');
var Q = require('q');
module.exports = function (storageDriver, entityDescriptionService, referenceService) {
var service = {};
var migrations = [];
var migrationsTableDescription = {
entityTypeId: "migrations",
tableName: "migrations",
fields: {
name: {
fieldType: {
id: 'text'
}
}
}
};
service.compile = function (objects, errors) {
migrations = _.chain(objects).map(function (obj) {
return obj.propertyValue('migrations') || [];
}).flatten().map(function (m) { return m.evaluateProperties() }).value();
return storageDriver.addOnConnectListener(function () {
return storageDriver.findAll(migrationsTableDescription,
{
filtering: {
op: "in",
value: migrations.map(function (migration) {
return migration.name;
})
}
}
).then(function (alreadyRun) {
var alreadyRunHash = {};
alreadyRun.forEach(function (migration) {
alreadyRunHash[migration.name] = migration;
});
var toRun = migrations.filter(function (m) {
return !alreadyRunHash[m.name];
});
return toRun.map(function (migration) {
return function () {
var promise;
if (migration.operation.id === "insert") {
promise = Q.all(migration.operation.entities.map(function (entity) {
var crudId = entityDescriptionService.entityTypeIdCrudId(migration.operation.entityTypeId);
return referenceService.resolveReferenceValues(crudId, entity).then(function () { //TODO could remove because already done in beforeSave ?
return storageDriver.createEntity(entityDescriptionService.tableDescription(crudId), entity);
});
}))
}
if (promise) {
return promise.then(function () {
return storageDriver.createEntity(migrationsTableDescription, {name: migration.name}); //TODO save/check checksums
})
}
throw new Error("Undefined operation id: '" + migration.operation.id + "'");
}
}).reduce(Q.when, Q(null));
});
});
};
return service;
};