This snippet is based on Everest.js and Evernote document in Synchronization spec.
I hope it would be useful.
Any comment is very welcome
evercalendar.syncNotes = function (user, needFullSync, callback){
//IF needFullSync OR a new user
if(needFullSync || !user.lastSyncTime || !user.fullSynchronized) return fullSync();
evernote.getSyncState(user, function(err, syncState) {
if(err) return callback(err);
//No need to sync
if( syncState.updateCount == user.lastUpdateCount ) return finishSync();
//Require fullSync from Evernote Server
if( syncState.fullSyncBefore > user.lastSyncTime ) return fullSync();
return incrementalSync(syncState);
});
function fullSync(){
user.fullSynchronized = false;
//================ CLEAR OLD DATA HERE =================
// Database.deleteAllNotes(user)
evernote.getSyncChunk(user, 0, 256, true, gotSyncChunk);
function gotSyncChunk(err, syncChunk){
if(err) return callback(err);
syncChunk.notes = syncChunk.notes || [];
syncChunk.notes.forEach(function(note,index) {
//Don't save note in the trash
if(!note.active) return;
//================ SAVE NOTE HERE ================
// Database.saveNote(user, note)
});
//Update User's status
user.lastUpdateCount = syncChunk.chunkHighUSN;
user.lastSyncTime = syncChunk.currentTime;
//IF have more chunk -> Recursive Loop
if(syncChunk.chunkHighUSN < syncChunk.updateCount)
return evernote.getSyncChunk(user, syncChunk.chunkHighUSN, 256, true, gotSyncChunk);
user.fullSynchronized = true;
return finishSync();
}
}
function incrementalSync(syncState){
evernote.getSyncChunk(user, user.lastUpdateCount, 256, false, gotSyncChunk);
function gotSyncChunk(err, syncChunk){
if(err) return callback(err);
syncChunk.notes = syncChunk.notes || [];
syncChunk.notes.forEach(function(note,index) {
if(note.active) {
//================ SAVE NOTE HERE ================
// Database.saveNote(user, note)
} else {
//================ DELETE NOTE HERE ================
// Database.deleteNote(user, note)
}
});
syncChunk.expungedNotes = syncChunk.expungedNotes || [];
syncChunk.expungedNotes.forEach(function(guid, index) {
//================ DELETE NOTE HERE ================
// Database.deleteNote(user, note)
});
//Update User's status
user.lastUpdateCount = syncChunk.chunkHighUSN;
user.lastSyncTime = syncChunk.currentTime;
//Load more chunk...
if(syncChunk.chunkHighUSN < syncChunk.updateCount)
return evernote.getSyncChunk(user, syncChunk.chunkHighUSN, 256, false, gotSyncChunk);
return finishSync();
}
}
function finishSync(){
//====== DONT FORGET TO SAVE USER STATUS HERE ==========
// Database.saveStatus(user)
return callback(null,true);
}
}












