Comparing version 0.5.15 to 0.5.16
@@ -33,2 +33,4 @@ var async = require('async'); | ||
var fieldModel = models.get(conn, models.MODELNAMES.FIELD); | ||
var fieldRuleModel = models.get(conn, models.MODELNAMES.FIELD_RULE); | ||
var pageRuleModel = models.get(conn, models.MODELNAMES.PAGE_RULE); | ||
var form; | ||
@@ -183,3 +185,2 @@ | ||
cb(undefined, form, toDelete, toAdd, toUpdate, idSorted); | ||
}); | ||
@@ -250,14 +251,168 @@ } | ||
}, function (err) { | ||
return cb(err, form, idSorted); | ||
return cb(err); | ||
}); | ||
} | ||
/* | ||
Checking rule targets are still valid -- if not, rule is deleted | ||
*/ | ||
function updateRules(form, cb) { | ||
//Compiling a list of field and page ids to check for | ||
var fieldAndPageIds = []; | ||
var formPages = form.pages; | ||
var fieldRulesToDelete = []; | ||
var pageRulesToDelete = []; | ||
formModel.populate(form, {"path": "pages", "model": pageModel, "select": "-__v -fieldOptions._id"}, function(err, updatedForm){ | ||
if(err){ | ||
return cb(err); | ||
} | ||
async.each(formPages, function (formPage, callbackPage) { | ||
fieldAndPageIds.push(formPage._id.toString()); | ||
formPage.fields = formPage.fields ? formPage.fields : []; | ||
async.each(formPage.fields, function (pageField, callbackField) { | ||
fieldAndPageIds.push(pageField.toString()); | ||
callbackField(); | ||
}, callbackPage); | ||
}, function(){ | ||
async.parallel([ | ||
function(fieldRuleCb){ | ||
async.each(form.fieldRules, async.apply(scanForExistingFields, models.MODELNAMES.FIELD_RULE), fieldRuleCb); | ||
}, | ||
function(pageRuleCb){ | ||
async.each(form.pageRules, async.apply(scanForExistingFields, models.MODELNAMES.PAGE_RULE), pageRuleCb); | ||
} | ||
], function(err){ | ||
if(err){ | ||
return cb(err); | ||
} | ||
//Update the form object | ||
async.parallel([ | ||
updateFormRules, | ||
async.apply(deleteRules, models.MODELNAMES.FIELD_RULE), | ||
async.apply(deleteRules, models.MODELNAMES.PAGE_RULE) | ||
], cb) | ||
}); | ||
}); | ||
}); | ||
function scanForExistingFields(type, rule, callback){ | ||
var targetField = rule.targetPage ? rule.targetPage : rule.targetField; | ||
targetField = targetField ? targetField.toString() : ""; | ||
var targetExists = true; | ||
if(fieldAndPageIds.indexOf(targetField) === -1){ | ||
if(type === models.MODELNAMES.FIELD_RULE){ | ||
fieldRulesToDelete.push(rule._id); | ||
} else { | ||
pageRulesToDelete.push(rule._id); | ||
} | ||
return callback(); | ||
} else { | ||
async.each(rule.ruleConditionalStatements, function(ruleConStatement, ruleCb){ | ||
var sourceId = ruleConStatement.sourceField; | ||
sourceId = sourceId.toString(); | ||
if(fieldAndPageIds.indexOf(sourceId) === -1){ | ||
targetExists = false; | ||
} | ||
ruleCb(); | ||
}, function(){ | ||
if(targetExists === false){ | ||
if(type === models.MODELNAMES.FIELD_RULE){ | ||
fieldRulesToDelete.push(rule._id); | ||
} else { | ||
pageRulesToDelete.push(rule._id); | ||
} | ||
} | ||
return callback(); | ||
}); | ||
} | ||
} | ||
function deleteRules(type, cb){ | ||
if(type === models.MODELNAMES.FIELD_RULE){ | ||
async.eachSeries(fieldRulesToDelete, function(fieldRuleId, cb){ | ||
fieldRuleModel.findOne({"_id": fieldRuleId}, function(err, fieldRule){ | ||
if(err){ | ||
return cb(err); | ||
} | ||
if(fieldRule !== null){ | ||
fieldRule.remove(); | ||
} | ||
return cb(); | ||
}); | ||
}, cb); | ||
} else { | ||
async.eachSeries(pageRulesToDelete, function(pageRuleId, cb){ | ||
pageRuleModel.findOne({"_id": pageRuleId}, function(err, pageRule){ | ||
if(err){ | ||
return cb(err); | ||
} | ||
if(pageRule !== null){ | ||
pageRule.remove(); | ||
} | ||
return cb(); | ||
}); | ||
}, cb); | ||
} | ||
} | ||
//Need to delete any rules that are to be deleted | ||
function updateFormRules(cb){ | ||
async.series([function(cb){ | ||
async.map(form.fieldRules, function(fieldRule, cb){ | ||
if(fieldRulesToDelete.indexOf(fieldRule._id.toString()) > -1){ | ||
return cb(undefined, null); | ||
} else { | ||
return cb(undefined, fieldRule); | ||
} | ||
}, function(err, mappedFieldRules){ | ||
form.fieldRules = _.filter(mappedFieldRules, function(elem){ | ||
return elem !== null; | ||
}); | ||
cb(); | ||
}); | ||
}, | ||
function(cb){ | ||
async.map(form.pageRules, function(pageRule, cb){ | ||
if(fieldRulesToDelete.indexOf(pageRule._id.toString()) > -1){ | ||
return cb(undefined, null); | ||
} else { | ||
return cb(undefined, pageRule); | ||
} | ||
}, function(err, mappedPageRules){ | ||
form.pageRules = _.filter(mappedPageRules, function(elem){ | ||
return elem !== null; | ||
}); | ||
cb(); | ||
}); | ||
}], cb); | ||
} | ||
} | ||
function doUpdate(formData, cb) { | ||
formModel.findById(formData._id, function (err, doc) { | ||
formModel.findById(formData._id).populate("fieldRules pageRules").exec(function (err, doc) { | ||
if (err) return cb(err); | ||
var postedPages = formData.pages || []; | ||
//as this is an update and there is no doc to update bail out | ||
if(! doc){ | ||
if (!doc) { | ||
return cb(new Error("A form id was passed but not form was found for that id")); | ||
} | ||
//what to do if no form found | ||
@@ -268,5 +423,6 @@ async.waterfall([ | ||
createPages, | ||
updatePages | ||
],function (err, ok){ | ||
if(err) cb(err); | ||
updatePages, | ||
async.apply(updateRules, doc) | ||
], function (err, ok) { | ||
if (err) cb(err); | ||
@@ -280,2 +436,3 @@ doc.updatedBy = options.userEmail; | ||
}); | ||
} | ||
@@ -282,0 +439,0 @@ |
{ | ||
"name": "fh-forms", | ||
"version": "0.5.15", | ||
"version": "0.5.16", | ||
"description": "Cloud Forms API for form submission", | ||
@@ -5,0 +5,0 @@ "main": "lib/forms.js", |
@@ -1,1 +0,1 @@ | ||
0.5.15-49 | ||
0.5.16-50 |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
307691
8258