Created
June 18, 2015 15:45
-
-
Save cadecairos/3b61c81df12e9c1509e1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server.method('projects.remix', function(userId, dataToRemix, done) { | |
var remixedProject; | |
var remixedPages; | |
var remixedElements; | |
var transaction; | |
var transactionErr; | |
getTransactionClient().then(function(t) { | |
transaction = t; | |
return begin(transaction); | |
}).then(function() { | |
return executeTransaction(transaction, queries.projects.create, | |
[ | |
userId, | |
dataToRemix.id, | |
server.methods.utils.version(), | |
dataToRemix.title, | |
dataToRemix.thumbnail | |
] | |
); | |
}).then(function(result) { | |
remixedProject = result.rows[0]; | |
return Promise.resolve(dataToRemix.pages.map(function(page) { | |
return new Promise(function(resolve, reject) { | |
var remixPage; | |
executeTransaction(transaction, queries.pages.create, | |
[ | |
remixedProject.id, | |
page.x, | |
page.y, | |
page.styles | |
] | |
).then(function(result) { | |
remixPage = result.rows[0]; | |
return Promise.resolve(page.elements.map(function(element) { | |
element.attributes.targetProjectId = remixedProject.id; | |
element.attributes.targetUserId = userId; | |
return executeTransaction(transaction, queries.elements.create, | |
[ | |
remixPage.id, | |
element.type, | |
element.attributes, | |
element.styles | |
] | |
); | |
})); | |
}).then(function(elementPromises) { | |
return Promise.all(elementPromises); | |
}).then(function(newElements) { | |
remixedElements = newElements; | |
resolve(); | |
}) | |
.catch(reject); | |
}); | |
})); | |
}).then(function(pagePromises) { | |
return Promise.all(pagePromises); | |
}).then(function(newPages) { | |
remixedPages = newPages; | |
var remixLinks = remixedElements.filter(function(elem) { | |
return elem.type === 'link'; | |
}); | |
return Promise.resolve(remixLinks.map(function(link) { | |
var targetX; | |
var targetY; | |
var foundTargetPage = dataToRemix.pages.some(function(page) { | |
if ( page.id === link.attributes.targetPageId ) { | |
targetX = page.x; | |
targetY = page.y; | |
return true; | |
} | |
return false; | |
}); | |
if ( !foundTargetPage ) { | |
// Link was already broken (i.e. page was deleted and target link was never updated by creator) | |
return Promise.resolve(); | |
} | |
remixedPages.some(function(page) { | |
if ( page.x === targetX && page.y === targetY ) { | |
link.targetPageId = page.id; | |
return true; | |
} | |
return false; | |
}); | |
return executeTransaction(transaction, queries.elements.update, | |
[ | |
link.styles, | |
link.attributes, | |
link.id | |
] | |
); | |
})); | |
}).then(function(linkPromises) { | |
return Promise.all(linkPromises); | |
}).then(function() { | |
return commit(transaction); | |
}) | |
.then(function() { | |
done(null, remixedProject); | |
}).catch(function(err) { | |
transactionErr = err; | |
return rollback(transaction); | |
}).then(function() { | |
done(transactionErr); | |
}).catch(function(err) { | |
done(err); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment