mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-15 07:31:33 +00:00
194 lines
4.5 KiB
JavaScript
194 lines
4.5 KiB
JavaScript
var db = require('db');
|
|
var Common = require('common');
|
|
var User = require('user');
|
|
var Tags = db.tags;
|
|
var needle = require('needle');
|
|
var fs = require('fs');
|
|
var Api = require('api');
|
|
var Notebook = require('notebook');
|
|
|
|
function log(o) {
|
|
console.log(o);
|
|
}
|
|
|
|
// 同步服务
|
|
var Sync = {
|
|
// 同步的信息, 返回给调用者
|
|
_syncInfo: {
|
|
notebook: {adds: [], deletes: [], updates: []},
|
|
note: {adds: [], deletes: [], updates: [], conflicts: []},
|
|
tag: {}
|
|
},
|
|
_syncNotebookIsLastChunk: false,
|
|
_totalSyncNotebookNum: 0, // 需要同步的数量
|
|
_tocalHasSyncNotebookNum: 0, // 已同步的数量
|
|
_notebookMaxEntry: 1000,
|
|
|
|
_initSyncInfo: function() {
|
|
var me = this;
|
|
|
|
me._syncNotebookIsLastChunk = false;
|
|
me._totalSyncNotebookNum = 0;
|
|
me._tocalHasSyncNotebookNum = 0;
|
|
me._lockNotebook = 1;
|
|
|
|
me._syncInfo = {
|
|
notebook: {adds: [], deletes: [], updates: []},
|
|
note: {adds: [], deletes: [], updates: [], conflicts: []},
|
|
tag: {}
|
|
};
|
|
},
|
|
|
|
// 增加, 有锁
|
|
_lockNotebook: 1,
|
|
_addSyncNotebookNum: function() {
|
|
if(me._lock) {
|
|
me._lockNotebook = 0;
|
|
me._tocalHasSyncNotebookNum++;
|
|
me._lockNotebook = 1;
|
|
} else {
|
|
me._addSyncNotebookNum();
|
|
}
|
|
},
|
|
|
|
// 同步笔记本
|
|
_syncNotebookToLocal: function(notebooks, callback) {
|
|
function canCall() {
|
|
// 是最后一块, 且
|
|
me._addSyncNotebookNum();
|
|
if(me._syncNotebookIsLastChunk && me._tocalHasSyncNotebookNum == me._tocalSyncNotebookNum) {
|
|
callback && callback(true);
|
|
}
|
|
}
|
|
if(!notebooks || notebooks.length == 0) {
|
|
return canCall();
|
|
}
|
|
|
|
for(var i in notebooks) {
|
|
var notebook = notebooks[i];
|
|
// 得到本地的, 与之对比
|
|
|
|
var usn = notebook.Usn;
|
|
var notebookId = notebook.NotebookId;
|
|
|
|
// 1) 服务器端删除了, 本地肯定删除
|
|
if(!notebook.CreatedTime) {
|
|
// TODO
|
|
Notebook.deleteNotebookForce(notebookId, function() {
|
|
// TODO 添加到信息
|
|
canCall();
|
|
});
|
|
return;
|
|
}
|
|
// 2) 查看本地的, 与本地合并
|
|
Notebook.GetNotebook(notebookId, function(notebookLocal) {
|
|
// 2.1 本地没有, 表示是新建
|
|
if(!notebookLocal) {
|
|
// TODO
|
|
Notebook.addNotebookForce(notebook, function() {
|
|
// TODO 添加到信息
|
|
canCall();
|
|
});
|
|
} else {
|
|
// 2.2 本地是否修改了, 需要合并, 使用服务端的数据
|
|
if(notebook.isDirty) {
|
|
// 2.3 服务器是最新的, 用服务器的
|
|
} else {
|
|
}
|
|
// 这里都是用服务器端的数据, 不处理冲突
|
|
notebook.UpdateNotebookForce(notebookId, notebook.Title, notebook.ParentNotebookId, function() {
|
|
// TODO 添加到信息
|
|
canCall();
|
|
})
|
|
}
|
|
});
|
|
|
|
callback && callback(true);
|
|
}
|
|
},
|
|
|
|
syncNotebook: function(afterUsn, callback) {
|
|
var me = this;
|
|
Api.getSyncNotebooks(afterUsn, me._notebookMaxEntry, function(notebooks) {
|
|
if(notebooks) {
|
|
me._tocalSyncNotebookNum += notebooks.length;
|
|
// 证明可能还有要同步的
|
|
if(notebooks.length == me._notebookMaxEntry) {
|
|
me._syncNotebookToLocal(notebooks);
|
|
var last = notebooks[notebooks.length-1];
|
|
me.syncNotebook(last.Usn, callback);
|
|
} else {
|
|
me._syncNotebookIsLastChunk = true;
|
|
me._syncNotebookToLocal(notebooks, callback);
|
|
}
|
|
} else {
|
|
// 同步失败
|
|
me._syncInfo.notebook.ok = false;
|
|
me._syncInfo.notebook.msg = "cann't get all chunks";
|
|
callback && callback(false);
|
|
}
|
|
});
|
|
},
|
|
|
|
// 同步笔记
|
|
syncNote: function(afterUsn, callback) {
|
|
callback && callback(true);
|
|
},
|
|
// 同步标签
|
|
syncTag: function(afterUsn, callback) {
|
|
callback && callback(true);
|
|
},
|
|
|
|
|
|
// 全量同步
|
|
fullSync: function(callback) {
|
|
var me = this;
|
|
me._initSyncInfo();
|
|
|
|
// 同步笔记本
|
|
me.syncNotebook(-1, function(ok) {
|
|
if(ok) {
|
|
// 同步笔记
|
|
me.syncNote(-1, function(ok) {
|
|
if(ok) {
|
|
// 同步标签
|
|
me.syncTag(-1, function() {
|
|
callback && callback(me._syncInfo);
|
|
});
|
|
} else {
|
|
callback && callback(me._syncInfo);
|
|
}
|
|
});
|
|
} else {
|
|
callback && callback(me._syncInfo);
|
|
}
|
|
});
|
|
},
|
|
|
|
// 增量同步
|
|
incrSync: function() {
|
|
var me = this;
|
|
me._initSyncInfo();
|
|
|
|
// 得到当前LastSyncUsn
|
|
User.getLastSyncInfo(function(lastSyncUsn, lastSyncTime) {
|
|
// 同步笔记本
|
|
me.syncNotebook(-1, function() {
|
|
// 同步笔记
|
|
me.syncNote(-1, function() {
|
|
// 同步标签
|
|
me.syncTag(-1, function() {
|
|
callback && callback(me._syncInfo);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
},
|
|
|
|
// 发送改变
|
|
sendChanges: function() {
|
|
|
|
}
|
|
};
|
|
|
|
module.exports = Sync |