Skip to content

Instantly share code, notes, and snippets.

@cadecairos
Created June 18, 2015 15:45
Show Gist options
  • Save cadecairos/3b61c81df12e9c1509e1 to your computer and use it in GitHub Desktop.
Save cadecairos/3b61c81df12e9c1509e1 to your computer and use it in GitHub Desktop.
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