forked from toonote/desktop-legacy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcloud.js
More file actions
136 lines (124 loc) · 4.08 KB
/
Copy pathcloud.js
File metadata and controls
136 lines (124 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import logger from './logger';
import RestfulModel from 'tn-restful-model';
import meta from './meta';
import note from './note';
import {getConfig, setConfig} from './config';
// import Store from '../api/store/index';
// const store = new Store();
let _modelCache = {};
const getModel = async function(modelName){
if(!_modelCache[modelName]){
let model = new RestfulModel({
model: modelName,
baseUrl: 'https://api.xiaotu.io/api/v1/',
headers: {
'X-TooNote-Token': await getConfig('cloudToken')
},
});
_modelCache[modelName] = model;
}
return _modelCache[modelName];
};
// 同步所有笔记
export async function syncAllNotes(context, options = {}){
let noteApi = await getModel('note');
let allNotes = [];
var localMap = {};
var remoteMap = {};
let metaData = await meta.data;
metaData.notebooks.forEach((notebook) => {
notebook.notes.forEach((noteItem) => {
allNotes.push(noteItem);
localMap[noteItem.id] = noteItem;
});
});
logger.debug(`local note count: ${allNotes.length}`);
// balili压缩有bug,用let会导致作用域不对
var remoteNotes = [];
let limit = 100;
let page = 1;
for(;;page++){
let remotePageNotes = await noteApi.read(0, {
page,
limit
});
remoteNotes = remoteNotes.concat(remotePageNotes);
if(remotePageNotes.length < limit) break;
}
logger.debug(`remote note count: ${remoteNotes.length}`);
remoteNotes.forEach((noteItem)=>{
remoteMap[noteItem.id] = noteItem;
});
// 手工写数据双向diff啊……
// 先下载
for(let noteId in remoteMap){
if(!localMap[noteId]){
logger.debug(`id:${noteId}, title:${remoteMap[noteId].title} 本地不存在,准备下载`);
// 如果本地不存在,则下载
let newNote = note.createNewNote(await noteApi.read(noteId));
await note.saveNote(newNote);
await meta.addNote(context.state.currentNotebook.id, newNote);
// let metaData = await meta.data;
context.commit('newNote', newNote);
logger.debug('下载成功');
}else{
let localVersion = localMap[noteId].localVersion;
let remoteVersion = remoteMap[noteId].version;
// 如果本地存在,比较版本号
logger.debug(`id:${noteId}, title:${remoteMap[noteId].title},本地版本号${localVersion},远程版本号${remoteVersion}`);
if(localVersion > remoteVersion){
// 如果本地比较新,更新远程
await noteApi.update({
...localMap[noteId],
content: await note.getNoteContent(noteId),
version: localMap[noteId].localVersion
});
logger.debug('上传成功');
}else if(localVersion < remoteVersion){
// 如果本地比较旧,更新本地
let newNote = note.createNewNote(await noteApi.read(noteId));
// 保存笔记
await note.saveNote(newNote);
// 保存meta信息
await meta.updateNote(newNote);
context.commit('updateNote', newNote);
logger.debug('newNote:', newNote);
logger.debug('下载成功');
}else{
if(!options.noUpdate){
// 如果版本号相同,此时应该有个备份机制,万一覆盖了有后悔药
await noteApi.update({...localMap[noteId], version: localMap[noteId].localVersion});
logger.debug('上传成功');
}
}
}
}
for(let i = 0; i < allNotes.length; i++){
let noteItem = allNotes[i];
if(!remoteMap[noteItem.id]){
logger.debug(`id:${noteItem.id}, title:${noteItem.title},远程不存在,准备上传`);
let data = {};
data.id = noteItem.id;
data.content = await note.getNoteContent(noteItem.id);
data.title = note.getTitleFromContent(data.content);
data.createdAt = noteItem.createdAt;
await noteApi.create(data);
logger.debug(`id:${noteItem.id}, title:${noteItem.title},上传成功`);
}
}
}
// 同步单条笔记
export async function updateNote(note){
let noteApi = await getModel('note');
await noteApi.update({...note, version: note.localVersion});
}
// 新建单条笔记
export async function createNote(note){
let noteApi = await getModel('note');
await noteApi.create({...note, version: note.localVersion});
}
// 删除单条笔记
export async function deleteNote(id){
let noteApi = await getModel('note');
await noteApi.delete(id);
}