Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const ObjectID = require('mongoose').Types.ObjectId;
- const dbData = require('../models/dbData.model');
- // THE BIG STACKS
- var masterEventQueue = [];
- var eventsToPush = [];
- var isProcessingQueue = false;
- var recursionSafetyCount = 0;
- var debug = true;
- module.exports = {
- getDbData: getDbData,
- getSampleDbData: getSampleDbData,
- processEvent: processEvent,
- processSocketMessage: processSocketMessage
- };
- function processSocketMessage(io, socket) {
- console.log('a user connected');
- if ((socket.handshake.session.passport == null || socket.handshake.session.passport.user == null) && (socket.handshake.headers.origin != 'http://localhost:4200')) {
- socket.disconnect();
- console.log('Socket Auth Error - Disconnecting User')
- }
- socket.on('disconnect', function () {
- console.log('user disconnected');
- });
- // retrieve sample dbData object
- socket.on('request-sample-dbData', function (type) {
- console.log('Request dbData of type ' + type);
- getSampleDbData().then(function (dbDataObj) {
- if (!dbDataObj) {
- console.log('Error did not find a matching dbData');
- }
- dbDataObj.server = true;
- io.emit('receive-sample-dbData', {
- source: dbDataObj[1],
- target: dbDataObj[0]
- });
- });
- });
- socket.on('requestCompassCurrentProjectsList', function () {
- console.log('Received request for current projects in Compass');
- // CONNECT TO COMPASS AND GET PROJECTS LIST HERE
- //io.emit('receiveCompassCurrentProjectsList', socket);
- //getCompassCurrentProjects().then(function (projectsList) {
- // if (!projectsList) {
- // console.log('Error: did not fetch projects list');
- // } else {
- // projectsList.server = true;
- // io.emit('receiveCompassCurrentProjectsList', {
- // projectsList: projectsList
- // });
- // }
- //});
- // temp sample compass projects data
- // TODO: add other project info (client, facility, subfacility, etc....timestamps?)
- io.emit('receiveCompassCurrentProjectsList', {
- numProjects: 3,
- list: [
- {
- _id: '59361424e67f770b99e45482',
- name: 'Test Project 1',
- state: 'Current',
- system: 'Star PA',
- version: '1.3.5',
- vendor: 'McKesson',
- hasMappingServiceType: true,
- referenceNum: 1234
- },
- {
- _id: '59361424e67f770b99e45483',
- name: 'Test Project 2',
- state: 'Current',
- system: 'Eclipsys SDK PA',
- version: '5.7.0',
- vendor: 'Allscripts',
- hasMappingServiceType: true,
- referenceNum: 1235
- },
- {
- _id: '59361424e67f770b99e45484',
- name: 'Test Project 3',
- state: 'Current',
- system: 'Invision PA',
- version: '4.7.1',
- vendor: 'Siemens',
- hasMappingServiceType: true,
- referenceNum: 1236
- }
- ]
- });
- });
- //Update DB Field
- socket.on('state-change', function (event) {
- event.fromServer = true;
- event.hasID = false;
- //Emit event to all clients who are currently connected
- // By default, clients should ignore 'add' events from the server that have 'hasID = false'
- if (event != null && event.action != null && event.action != 'add') {
- socket.broadcast.emit('state-has-changed', event);
- }
- //Send Event to Queue for Processing
- processEvent(event, socket, io);
- });
- }
- function getDbData(req, res) {
- if (!req.user) {
- response.redirect('/login');
- } else {
- dbData.findOne({ _id: req.params.id }, function (err, dbDataObj) {
- if (err) {
- console.log('Error while retrieving dbData from database');
- return res.status(500).send('Internal Errors, check server logs!');
- }
- if (!dbDataObj) {
- console.log('Error did not find a matching dbData');
- return res.status(500).send('Internal Errors, check server logs!');
- }
- return res.json(dbDataObj);
- });
- }
- }
- function getSampleDbData() {
- return dbData.find({}).exec(); // only works with 2 docs in the collection; this will crash & burn if theres multiple documents
- }
- function processEvent(event, socket, io) {
- //Basic Event Validation
- if (event == null) {
- // Error, either event or event info doesn't exist.
- console.log('ERROR! Received a bad event, please check formatting of event');
- return false;
- } else {
- event.pushedToQueue = Date.now();
- masterEventQueue.push(event);
- var startTime = Date.now();
- processQueue(socket, io).then(function (qResult) {
- if (!qResult) {
- if (debug) { console.log(qResult); }
- console.log('Queue is already processing...');
- return Promise.resolve(true);
- }
- var endTime = Date.now();
- console.log('Queue completed running in ' + (endTime - startTime) + ' milliseconds!\r\n');
- });
- }
- }
- function executeEvent(event) {
- //THE MEGA SWITCH (not by nintendo)
- // This is where we decide how to handle all the different events
- // This function is probably gonna be huge lol
- function getField(doc, data) {
- if (doc == null || data == null) {
- console.log(doc);
- console.log(data);
- console.log('^^Doc or Data Null!');
- return false;
- }
- if (data.hasOwnProperty('dbSchema') && data.hasOwnProperty('dbTable') && data.hasOwnProperty('_id')) {
- // Should be able to properly search and find field!
- if (debug) { console.log('Found field named ' + doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data.dbTable._id).dbFields.id(data._id).name + ' | getField()') };
- return doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data.dbTable._id).dbFields.id(data._id);
- }
- else {
- //Received invalid data
- console.log('findField() received invalid data');
- return null;
- }
- }
- function getTable(doc, data) {
- if (doc == null || data == null) {
- console.log(doc);
- console.log(data);
- console.log('^^Doc or Data Null!');
- return false;
- }
- if (data.hasOwnProperty('dbTable')) {
- if (data.hasOwnProperty('dbSchema')) {
- // Should be able to properly search and find field!
- if (debug) {
- console.log('Found table named ' + doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data.dbTable._id).name + ' | getTable()')
- }
- ;
- return doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data.dbTable._id);
- }
- else {
- //Received invalid data
- console.log('findTable() received invalid data');
- return null;
- }
- }
- else {
- if (data.hasOwnProperty('dbSchema') && data.hasOwnProperty('_id')) {
- // Should be able to properly search and find field!
- if (debug) {
- console.log('Found table named ' + doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data._id).name + ' | getTable()')
- }
- ;
- return doc.dbSchemas.id(data.dbSchema._id).dbTables.id(data._id);
- }
- else {
- //Received invalid data
- console.log('findTable() received invalid data');
- return null;
- }
- }
- }
- function getSchema(doc, data) {
- if (doc == null || data == null) {
- console.log(doc);
- console.log(data);
- console.log('^^Doc or Data Null!');
- return false;
- }
- if (data.hasOwnProperty('dbSchema')) {
- if (data.hasOwnProperty('dbData')) {
- // Should be able to properly search and find field!
- if (debug) { console.log('Found Schema named ' + doc.dbSchemas.id(data.dbSchema._id).name + ' | getSchema()') };
- return doc.dbSchemas.id(data.dbSchema._id);
- }
- else {
- //Received invalid data
- console.log('findSchema() received invalid data');
- return null;
- }
- }
- else {
- if (data.hasOwnProperty('dbData')) {
- // Should be able to properly search and find field!
- if (debug) { console.log('Found Schema named ' + doc.dbSchemas.id(data._id).name + ' | getSchema()') };
- return doc.dbSchemas.id(data._id);
- }
- else {
- //Received invalid data
- console.log('findSchema() received invalid data');
- return null;
- }
- }
- }
- function getDbData(data) {
- if (data == null) {
- console.log(data);
- console.log('Data Null!');
- return Promise.resolve(false);
- }
- if (data.hasOwnProperty('dbData')) {
- if (debug) { console.log('Returned promise for query to get dbData (id: ' + data.dbData._id + ') | getDbData()') };
- return dbData.findById(data.dbData._id).exec();
- }
- else {
- console.log('getDbData() received invalid data');
- return Promise.resolve(false);
- }
- }
- // CATCH event.action that is not equal to map
- switch (event.action) {
- case 'map':
- switch (event.mappingAction) {
- case 'addMap':
- if (debug) { console.log('Event type: ' + event.action); }
- /**
- * =============== ADD MAP ===============
- * 1. Find senderOrigin (TARGET SIDE)
- * 2. Append mappingObject to the `mappings` property of returned doc from #1 and save it
- * ----STEPS 3 & 4 DIRECT TYPE ONLY, LOOKUPS STOP AFTER STEP 2----
- * 3. Find `mappingObject.link` (SOURCE SIDE)
- * 4. Make new mappingObject that links back to `senderOrigin` and append it to the mappings propert from #3
- *
- */
- // Step 1
- return getDbData(event.senderOrigin)
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var targetField = getField(targetDbData, event.senderOrigin);
- targetField.mappings.push(event.info.mappingObject);
- if (debug) { console.log('Pushed new mapping object onto sender. New mappings array for sender: '); console.log(targetField.mappings); }
- // Step 3
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Sender Document'); } return Promise.resolve(false); }
- //Need to decide if direct mapping, otherwise skip steps 4 and 5
- if (event.info.mappingObject.type !== 'direct') {
- if (debug) { console.log('Mapping type is not direct, skipping SOURCE SIDE steps (Ignore next few errors)') }
- return Promise.resolve(false);
- }
- // Step 4
- //Is direct, go ahead and do SOURCE SIDE logic
- return getDbData(event.info.mappingObject.link);
- })
- .then(function (sourceDbData) {
- if (!sourceDbData) { if (debug) { console.log('Possible error in getting source DbData (or skipping step)'); } return Promise.resolve(false); }
- var sourceField = getField(sourceDbData, event.info.mappingObject.link);
- sourceField.mappings.push({
- type: 'direct',
- link: event.senderOrigin,
- separator: ''
- });
- if (debug) { console.log('Pushed new mapping object onto source object. New mappings array for source: '); console.log(sourceField.mappings); }
- return sourceDbData.save();
- })
- .then(function (saveSourceResult) {
- if (!saveSourceResult) { if (debug) { console.log('Failed to Save Sender Document or Skipping Step'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Add Map logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Add Map | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'removeMap':
- if (debug) { console.log('Event type: ' + event.action); }
- //=============== REMOVE MAP ===============
- // 1. Find senderOrigin (TARGET SIDE)
- // 2. Remove from #1 the mappings[mappingIndex]
- //----STEPS 3 & 4 Need to be repeated for each KEY in a lookup ----
- // 3. Find `mappingObject.link` (SOURCE SIDE)
- // 4. Loop through all mappings from #3 to find and remove link to senderOrigin
- // Step 1
- return getDbData(event.senderOrigin)
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var targetField = getField(targetDbData, event.senderOrigin);
- targetField.mappings.splice(event.info.mappingIndex, 1);
- if (debug) { console.log('Removed mapping from target side at mapping index: ' + event.info.mappingObject + '. Revised mappings array for sender: '); console.log(targetField.mappings); }
- // Step 3
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Sender Document'); } return Promise.resolve(false); }
- // Step 4
- //If direct, need to use mappingObject.link, if lookup need to figure out which keys have values
- // and pick one to use to get the DbData property
- if (event.info.mappingObject.type === 'direct') {
- return getDbData(event.info.mappingObject.link);
- }
- // Lookup Logic
- if (event.info.mappingObject.link[0].hasOwnProperty('sourceFK')) {
- return getDbData(event.info.mappingObject.link[0].sourceFK);
- }
- else if (event.info.mappingObject.link[0].hasOwnProperty('lookupPK')) {
- return getDbData(event.info.mappingObject.link[0].lookupPK);
- }
- else if (event.info.mappingObject.link[0].hasOwnProperty('lookupFK')) {
- return getDbData(event.info.mappingObject.link[0].lookupFK);
- }
- else {
- if (debug) { console.log('Failed to find a dbData ID to use from one of the lookups. Perhaps deleting an empty mapping?'); }
- return Promise.resolve(false);
- }
- })
- .then(function (sourceDbData) {
- if (!sourceDbData) { if (debug) { console.log('Error in getting source DbData OR No mappings to delete from source.'); } return Promise.resolve(false); }
- var fieldsToScan = [];
- if (event.info.mappingObject.type === 'direct') {
- fieldsToScan.push(getField(sourceDbData, event.info.mappingObject.link));
- }
- else {
- if (event.info.mappingObject.link[0].hasOwnProperty('sourceFK')) {
- fieldsToScan.push(getField(sourceDbData, event.info.mappingObject.link[0].sourceFK));
- }
- if (event.info.mappingObject.link[0].hasOwnProperty('lookupPK')) {
- fieldsToScan.push(getField(sourceDbData, event.info.mappingObject.link[0].lookupPK));
- }
- if (event.info.mappingObject.link[0].hasOwnProperty('lookupFK')) {
- fieldsToScan.push(getField(sourceDbData, event.info.mappingObject.link[0].lookupFK));
- }
- }
- for (var i = 0; i < fieldsToScan.length; i++) {
- var sourceField = fieldsToScan[i];
- //Step 4
- for (var j = 0; j < sourceField.mappings.length; j++) {
- var linkID = sourceField.mappings[i].link._id;
- if (linkID == event.senderOrigin._id) {
- //Found a match
- if (debug) { console.log('Found a matched mapping, removing from source side'); }
- sourceField.mappings.splice(j, 1);
- break;
- }
- }
- }
- if (debug) { console.log('Finished looping through source fields to modify'); }
- return sourceDbData.save();
- })
- .then(function (saveSourceResult) {
- if (!saveSourceResult) { if (debug) { console.log('Failed to Save Sender Document or Skipping source side due to nothing needing removed.'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Remove Map logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Remove Map | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'editSeparator':
- if (debug) { console.log('Event type: ' + event.action); }
- //=============== EDIT SEPARATOR ===============
- // 1. Find senderOrigin (TARGET SIDE)
- // 2. Overwrite separator at mappings[mappingIndex] from #1
- // Step 1
- return getDbData(event.senderOrigin)
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var targetField = getField(targetDbData, event.senderOrigin);
- // Must mark as changed, since Mongoose doesn't autodetect the change
- targetField.mappings[event.info.mappingIndex].separator = event.info.separatorValue;
- targetField.markModified('mappings.' + event.info.mappingIndex + '.separator');
- if (debug) { console.log('Edited separator value: '); console.log(targetField.mappings[event.info.mappingIndex].separator); }
- // Step 3
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Sender Document'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Edit Separator logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Edit Separator | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'addLevel':
- if (debug) { console.log('Event type: ' + event.action); }
- //=============== ADD LEVEL ===============
- // 1. Find senderOrigin (TARGET SIDE)
- // 2. Override mappings[mappingIndex] of #1 with mappingObject
- // Step 1
- return getDbData(event.senderOrigin)
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var targetField = getField(targetDbData, event.senderOrigin);
- targetField.mappings[event.info.mappingIndex] = event.info.mappingObject;
- //Marking field as modified for the DB
- targetField.markModified('mappings.' + event.info.mappingIndex);
- if (debug) { console.log('Overwrote target side mapping at index ' + event.info.mappingIndex + ': '); console.log(targetField.mappings); }
- // Step 3
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Sender Document'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Add Level logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Add Level | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'removeLevel':
- if (debug) { console.log('Event type: ' + event.action); }
- //=============== Remove Level ===============
- // 1. Loop through all keys in levelObject
- // 2. For each, find source field (SOURCE SIDE)
- // 3. Loop through and remove any mappings that link back to senderOrigin
- // 4. Find senderOrigin (TARGET SIDE)
- // 5. Remove level from mapping at mappings[mappingIndex][levelIndex]
- //First, need to get a dbData object from one of the lookups...
- // Lookup Logic
- var tempObjForData;
- if (event.info.levelObject.hasOwnProperty('sourceFK')) {
- tempObjForData = event.info.levelObject.sourceFK;
- }
- else if (event.info.levelObject.hasOwnProperty('lookupPK')) {
- tempObjForData = event.info.levelObject.lookupPK;
- }
- else if (event.info.levelObject.hasOwnProperty('lookupFK')) {
- tempObjForData = event.info.levelObject.lookupFK;
- }
- else {
- if (debug) { console.log('Failed to find a dbData ID to use from one of the lookups'); }
- return Promise.resolve(false);
- }
- // Step 1
- return getDbData(tempObjForData)
- .then(function (sourceDbData) {
- if (!sourceDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- //Looping through keys to get field objects.
- var listOfSourceLookups = [];
- // Step 2
- // EXCLUDE Source FK ONLY if the level index is greater than 0, this means it is already taken care of
- // by the previous lookup FK
- if (event.info.levelIndex < 1 && event.info.levelObject.hasOwnProperty('sourceFK')) {
- listOfSourceLookups.push(getField(sourceDbData, event.info.levelObject.sourceFK));
- }
- if (event.info.levelObject.hasOwnProperty('lookupPK')) {
- listOfSourceLookups.push(getField(sourceDbData, event.info.levelObject.lookupPK));
- }
- if (event.info.levelObject.hasOwnProperty('lookupFK')) {
- listOfSourceLookups.push(getField(sourceDbData, event.info.levelObject.lookupFK));
- }
- // Step 3
- for (var i = 0; i < listOfSourceLookups.length; i++) {
- var sourceField = listOfSourceLookups[i];
- for (var j = 0; j < sourceField.mappings.length; j++) {
- var linkID = sourceField.mappings[j].link._id;
- if (linkID == event.senderOrigin._id) {
- //Found a match
- if (debug) { console.log('Found a matched mapping, removing from source side'); }
- sourceField.mappings.splice(j, 1);
- //Marking field as modified for the DB
- sourceField.markModified('mappings.' + j);
- }
- }
- }
- if (debug) { console.log('Finished looping through source fields to modify'); }
- return sourceDbData.save();
- })
- .then(function (saveSourceResult) {
- if (!saveSourceResult) { if (debug) { console.log('Failed to Save Source Document'); } return Promise.resolve(false); }
- // Step 4
- return getDbData(event.senderOrigin);
- })
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting sender DbData'); } return Promise.resolve(false); }
- var targetField = getField(targetDbData, event.senderOrigin);
- targetField.mappings[event.info.mappingIndex].link.splice(event.info.levelIndex, 1);
- //Marking field as modified for the DB
- targetField.markModified('mappings.' + event.info.mappingIndex + '.link');
- if (debug) { console.log('Removed level object from target side. New mapping array for target: '); console.log(targetField.mappings); }
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Target Document'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Remove Level logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Remove Level | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'editLevel':
- if (debug) { console.log('Event type: ' + event.action); }
- //=============== Edit Level ===============
- // 1. Find previousKeyValue (SOURCE SIDE)
- // 2. Remove old mapping linked to senderOrigin
- // 2.5 If new field is empty, removing, otherwise editing/updating
- // 3. Add new mapping linked to senderOrigin
- // 4. Find senderOrigin (TARGET SIDE)
- // 5. Overwrite #4 with mappingObject
- // Step 1
- var tempGetDbData;
- if (event.info.previousKeyValue == null) {
- tempGetDbData = event.info.key.value;
- }
- else {
- tempGetDbData = event.info.previousKeyValue;
- }
- return getDbData(tempGetDbData)
- .then(function (sourceDbData) {
- if (!sourceDbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- //Looping through keys to get field objects.
- if (event.info.previousKeyValue != null) {
- var oldSourceField = getField(sourceDbData, event.info.previousKeyValue);
- // Step 2
- for (var i = 0; i < oldSourceField.mappings.length; i++) {
- var linkID = oldSourceField.mappings[i].link._id;
- if (linkID == event.senderOrigin._id) {
- oldSourceField.mappings.splice(i, 1);
- // Just for safety, marking things as modified so the DB knows to change them
- oldSourceField.markModified('mappings');
- break;
- }
- }
- if (debug) {
- console.log('Removed old mapping from source side');
- }
- }
- // Step 3
- if (event.info.key.value != null) {
- // If adding/updating/editing a level, need to add to the source side
- var newSourceField = getField(sourceDbData, event.info.key.value);
- newSourceField.mappings.push({
- type: 'lookup',
- link: event.senderOrigin,
- separator: ''
- });
- // Mark as modified
- newSourceField.markModified('mappings');
- if (debug) { console.log('Added new lookup mapping to the new source field as follows:'); console.log(newSourceField.mappings[0].link); }
- }
- return sourceDbData.save();
- })
- .then(function (saveSourceResult) {
- if (!saveSourceResult) { if (debug) { console.log('Failed to Save Source Document'); } return Promise.resolve(false); }
- // Step 4
- return getDbData(event.senderOrigin);
- })
- .then(function (targetDbData) {
- if (!targetDbData) { if (debug) { console.log('Error in getting sender DbData'); } return Promise.resolve(false); }
- // Step 5
- var targetField = getField(targetDbData, event.senderOrigin);
- targetField.mappings[event.info.mappingIndex] = event.info.mappingObject;
- //Marking field as modified for the DB
- targetField.markModified('mappings.' + event.info.mappingIndex);
- if (debug) { console.log('Removed level object from target side. New mapping array for target: '); console.log(targetField.mappings[event.info.mappingIndex]); }
- return targetDbData.save();
- })
- .then(function (saveTargetResult) {
- if (!saveTargetResult) { if (debug) { console.log('Failed to Save Target Document'); } return Promise.resolve(false); }
- // Save was successful
- return Promise.resolve(true);
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed Edit Level logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('Edit Level | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- default:
- if (debug) { console.log('Server received map event with unknown mapping action: ' + event.mappingAction); }
- break;
- }
- break;
- case 'updateDBField':
- // find and update a dbField here
- return getDbData(event.senderOrigin)
- .then(function (dbData) {
- if (!dbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var field = getField(dbData, event.senderOrigin);
- for (var prop in event.value) {
- if (event.value.hasOwnProperty(prop)) {
- console.log('Prop Value: ' + event.value[prop]);
- // field.set(prop, event.value[prop]);
- // console.log(field);
- field[prop] = event.value[prop];
- field.markModified(prop);
- // dbData.markModified(field);
- }
- }
- if (debug) { console.log('updated dbField ' + event.senderOrigin.name); }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed updateDbField logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('updateDbField | Promise catch for uncaught errors. Error: ' + err); }
- // Is this a good idea? IDK what this will do...
- Promise.resolve(false);
- });
- break;
- case 'updateDBTable':
- // find and update a dbField here
- return getDbData(event.senderOrigin)
- .then(function (dbData) {
- if (!dbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var table = getTable(dbData, event.senderOrigin);
- for (var prop in event.value) {
- if (event.value.hasOwnProperty(prop)) {
- table[prop] = event.value[prop];
- table.markModified(prop);
- }
- }
- if (debug) { console.log('updated dbTable ' + event.senderOrigin.name); }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed updateDbTable logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('updateDbTable | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'updateDBSchema':
- // find and update a dbField here
- return getDbData(event.senderOrigin)
- .then(function (dbData) {
- if (!dbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var schema = getSchema(dbData, event.senderOrigin);
- for (var prop in event.value) {
- if (event.value.hasOwnProperty(prop)) {
- schema[prop] = event.value[prop];
- schema.markModified(prop);
- }
- }
- if (debug) { console.log('updated dbSchema ' + event.senderOrigin.name); }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed updateDbSchema logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('updateDbSchema | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'updateDBData':
- // find and update a dbData here
- return getDbData(event.senderOrigin)
- .then(function (dbData) {
- if (!dbData) { if (debug) { console.log('Error in getting dbData document'); } return Promise.resolve(false); }
- // Step 2
- var data = dbData;
- for (var prop in event.value) {
- if (event.value.hasOwnProperty(prop)) {
- data[prop] = event.value[prop];
- data.markModified(prop);
- }
- }
- if (debug) { console.log('updated dbData ' + event.senderOrigin.name); }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed updateDbData logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('updateDbData | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'add':
- switch (event.componentName) {
- case 'DBField':
- // find and update a dbField here
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- var parentTable = getTable(dbData, event.component);
- parentTable.dbFields.push({
- name: event.component.name,
- mappings: event.component.mappings,
- description: event.component.description,
- notes: event.component.notes
- });
- if (debug) {
- console.log('added new dbField ' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- var parentTable = getTable(endResult, event.component);
- event.component._id = parentTable.dbFields[parentTable.dbFields.length - 1]._id;
- event.hasID = true;
- eventsToPush.push(event);
- if (debug) { console.log('Completed addDbField logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('addDbField | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'DBTable':
- // find and update a dbField here
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- console.log('Name: ' + event.component.name);
- var parentSchema = getSchema(dbData, event.component);
- parentSchema.dbTables.push({
- name: event.component.name,
- dbFields: event.component.dbFields,
- description: event.component.description,
- notes: event.component.notes,
- done: false,
- issue: false
- });
- if (debug) {
- console.log('added new dbTable ' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- var parentSchema = getSchema(endResult, event.component);
- event.component._id = parentSchema.dbTables[parentSchema.dbTables.length - 1]._id;
- event.hasID = true;
- eventsToPush.push(event);
- if (debug) { console.log('Completed addDbTable logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('addDbTable | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'DBSchema':
- // find and update a dbField here
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- var parentData = dbData;
- parentData.dbSchemas.push({
- name: event.component.name,
- dbTables: [],
- notes: event.component.notes,
- description: event.component.description
- });
- if (debug) {
- console.log('added new dbSchema ' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- var parentData = endResult;
- event.component._id = parentData.dbSchemas[parentData.dbSchemas.length - 1]._id;
- event.hasID = true;
- eventsToPush.push(event);
- if (debug) { console.log('Completed addDbSchema logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('addDbSchema | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- default:
- if (debug) { console.log('Server received add event with unknown component name: ' + event.componentName); }
- break;
- }
- break;
- case 'remove':
- switch (event.componentName) {
- case 'DBField':
- // find and remove a dbField here
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- getTable(dbData, event.component).dbFields.remove({ _id: event.component._id });
- if (debug) {
- console.log('removed dbField ' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed removeDbField logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('removeDbField | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'DBTable':
- // find and remove a dbTablehere
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- getSchema(dbData, event.component).dbTables.remove({ _id: event.component._id });
- if (debug) {
- console.log('removed dbTable ' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed removeDbTable logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('removeDbTable | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- case 'DBSchema':
- // find and remove a dbSchema here
- return getDbData(event.component)
- .then(function (dbData) {
- if (!dbData) {
- if (debug) { console.log('Error in getting dbData document'); }
- return Promise.resolve(false);
- }
- // Step 2
- dbData.dbSchemas.remove({ _id: event.component._id });
- if (debug) {
- console.log('removed dbSchema' + event.component.name);
- }
- // Step 3
- return dbData.save();
- })
- .then(function (endResult) {
- if (debug) { console.log('Completed removeDbSchema logic. Promise is returning true!'); }
- return Promise.resolve(true);
- })
- .catch(function (err) {
- if (debug) { console.log('removeDbSchema | Promise catch for uncaught errors. Error: ' + err); }
- Promise.resolve(false);
- });
- break;
- default:
- if (debug) { console.log('Server received remove event with unknown component name: ' + event.componentName); }
- break;
- }
- break;
- default:
- if (debug) { console.log('Server received event with unknown action: ' + event.action); }
- break;
- }
- //If reach this point, something broke out of switch statement, so this event was skipped
- // Promise resolution doesn't really matter here, the value is never used in the processQueue() function
- return Promise.resolve(false);
- }
- function checkEvents(socket, io) {
- if (eventsToPush.length > 0) {
- for (var i = 0; i < eventsToPush.length; i++) {
- // console.log(eventsToPush[i]);
- // socket.emit('state-has-changed');
- io.emit('state-has-changed', eventsToPush[i]);
- eventsToPush.splice(i, 1);
- if (debug) { console.log('Pushed an event back to all clients from server'); }
- }
- }
- }
- function processQueue(socket, io, isRecursion) {
- if (typeof isRecursion == "undefined") {
- isRecursion = false;
- }
- if (isRecursion || !isProcessingQueue) {
- //Start processing queue
- isProcessingQueue = true;
- if (debug) { console.log('Queue processing has officially begun!'); }
- //First, need copy of queue so it doesn't changeeeeeee
- var localQueue = masterEventQueue.slice();
- //Safety measure to prevent server overload...
- recursionSafetyCount += 1;
- var runEventPromise = localQueue.reduce(function (promise, item) {
- return promise.then(function (result) {
- if (result === false) {
- //Event was skipped, there was some error
- console.log('[ERROR] Server skipping event, no action taken.');
- if (!debug) { console.log('To find out where the error occurred, please turn on DEBUG mode and retry'); }
- }
- checkEvents(socket, io);
- return executeEvent(item);
- })
- }, Promise.resolve());
- return runEventPromise.then(function (result) {
- if (result === false) {
- //Event was skipped, there was some error
- console.log('[ERROR] Server skipping event, no action taken.');
- if (!debug) { console.log('To find out where the error occurred, please turn on DEBUG mode and retry'); }
- }
- checkEvents(socket, io);
- //Clear queue of processed things
- masterEventQueue.splice(0, localQueue.length);
- if (debug) { console.log('Post-Run Queue Length: ' + masterEventQueue.length); console.log('Queue process cycle completed'); }
- //Check if anything was added to process in the queue??
- if (masterEventQueue.length > 0) {
- //Recur as long as there's still events to process!
- //First, be safe with recursion!
- if (recursionSafetyCount < 100) {
- return processQueue(socket, io, true);
- }
- else {
- console.log('Queue processing recurred 100 times! Something might be wrong with the system...');
- console.log('Time to take a break!');
- setTimeout(function () {
- console.log('Paused execution for 30 seconds');
- //Immediately release lock on queue
- isProcessingQueue = false;
- // Reset Recursion Count
- recursionSafetyCount = 0;
- return Promise.reject('Recursion Counter Reached!');
- }, 30000);
- }
- }
- else {
- //Immediately release lock on queue
- isProcessingQueue = false;
- // Reset Recursion Count
- recursionSafetyCount = 0;
- return Promise.resolve('Finished Processing Event');
- }
- }).catch(function (err) {
- console.log('Error: ' + event.action + ' - dbOperation catch - ' + err);
- });
- }
- else {
- return Promise.resolve(false);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement