meadow
Version:
A data access library.
136 lines (124 loc) • 4.53 kB
JavaScript
// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
/**
* @license MIT
* @author <steven@velozo.com>
*/
var libAsyncWaterfall = require('async/waterfall');
/**
* Meadow Behavior - Create
*
* @function meadowBehaviorCreate
*/
var meadowBehaviorCreate = function(pMeadow, pQuery, fCallBack)
{
libAsyncWaterfall(
[
// Step 0: If GUID is specified, make sure the record does not already exist
function (fStageComplete)
{
// Make sure the user submitted a record
if (!pQuery.query.records)
{
return fStageComplete('No record submitted', pQuery, false);
}
if (pQuery.query.records[0][pMeadow.defaultGUIdentifier] &&
pQuery.query.records[0][pMeadow.defaultGUIdentifier].length >= 5) //see Foxhound mysql build create query: GUID min len must be 5
{
var tmpGUIDRecord = pQuery.query.records[0][pMeadow.defaultGUIdentifier];
var tmpQueryRead = pQuery.clone().addFilter(pMeadow.defaultGUIdentifier, tmpGUIDRecord)
.setDisableDeleteTracking(true); //this check is to guarantee uniqueness across the entire table, so always do this
if (pMeadow.rawQueries.checkQuery('Read'))
{
tmpQueryRead.parameters.queryOverride = pMeadow.rawQueries.getQuery('Read');
}
pMeadow.provider.Read(tmpQueryRead, function()
{
var tmpError = tmpQueryRead.error;
if (!tmpError &&
tmpQueryRead.result.value.length > 0)
{
tmpError = 'Record with GUID ' + tmpGUIDRecord + ' already exists!';
}
if (tmpError)
{
return fStageComplete(tmpError, tmpQueryRead, tmpQueryRead, null);
}
else
{
return fStageComplete();
}
});
}
else
{
return fStageComplete();
}
},
// Step 1: Create the record in the data source
function (fStageComplete)
{
if (!pQuery.query.IDUser)
{
// The user ID is not already set, set it magically.
if (typeof(pQuery.userID) === 'number' && (pQuery.userID % 1) === 0 && pQuery.userID >= 0)
{
pQuery.query.IDUser = pQuery.userID;
}
else
{
pQuery.query.IDUser = pMeadow.userIdentifier;
}
}
// Merge in the default record with the passed-in record for completeness
pQuery.query.records[0] = pMeadow.fable.Utility.extend({}, pMeadow.schemaFull.defaultObject, pQuery.query.records[0]);
// Create override is too complex ... punting for now
// if (pMeadow.rawQueries.checkQuery('Create'))
// pQuery.parameters.queryOverride = pMeadow.rawQueries.getQuery('Create');
pMeadow.provider.Create(pQuery, function(){ fStageComplete(pQuery.result.error, pQuery); });
},
// Step 2: Setup a read operation
function (pQuery, fStageComplete)
{
// The value is not set (it should be set to the value for our DefaultIdentifier)
if (pQuery.parameters.result.value === false)
{
return fStageComplete('Creation failed', pQuery, false);
}
var tmpIDRecord = pQuery.result.value;
fStageComplete(pQuery.result.error, pQuery, tmpIDRecord);
},
// Step 3: Read the record
function (pQuery, pIDRecord, fStageComplete)
{
var tmpQueryRead = pQuery.clone().addFilter(pMeadow.defaultIdentifier, pIDRecord)
.setDisableDeleteTracking(pQuery.parameters.query.disableDeleteTracking); //if delete tracking is disabled, we need to disable it on this Read operation
if (pMeadow.rawQueries.checkQuery('Read'))
{
tmpQueryRead.parameters.queryOverride = pMeadow.rawQueries.getQuery('Read');
}
pMeadow.provider.Read(tmpQueryRead, function(){ fStageComplete(tmpQueryRead.result.error, pQuery, tmpQueryRead); });
},
// Step 4: Marshal the record into a POJO
function (pQuery, pQueryRead, fStageComplete)
{
// Ensure there is not at least one record returned
if (pQueryRead.parameters.result.value.length < 1)
{
return fStageComplete('No record found after create.', pQuery, pQueryRead, false);
}
var tmpRecord = pMeadow.marshalRecordFromSourceToObject(pQueryRead.result.value[0]);
fStageComplete(pQuery.result.error, pQuery, pQueryRead, tmpRecord);
}
],
function(pError, pQuery, pQueryRead, pRecord)
{
if (pError)
{
pMeadow.fable.log.warn('Error during the create waterfall', {Error:pError, Message: pError.message, Query: pQuery.query, Stack: pError.stack});
}
fCallBack(pError, pQuery, pQueryRead, pRecord);
}
);
return pMeadow;
};
module.exports = meadowBehaviorCreate;