You've already forked joplin
							
							
				mirror of
				https://github.com/laurent22/joplin.git
				synced 2025-10-31 00:07:48 +02:00 
			
		
		
		
	Clean up
This commit is contained in:
		| @@ -31,7 +31,7 @@ async function localItemsSameAsRemote(locals, expect) { | ||||
| 			expect(remote.updated_time).toBe(dbItem.updated_time); | ||||
|  | ||||
| 			let remoteContent = await fileApi().get(path); | ||||
| 			remoteContent = dbItem.type_ == BaseModel.ITEM_TYPE_NOTE ? Note.unserialize(remoteContent) : Folder.unserialize(remoteContent); | ||||
| 			remoteContent = dbItem.type_ == BaseModel.MODEL_TYPE_NOTE ? Note.unserialize(remoteContent) : Folder.unserialize(remoteContent); | ||||
| 			expect(remoteContent.title).toBe(dbItem.title); | ||||
| 		} | ||||
| 	} catch (error) { | ||||
| @@ -48,139 +48,139 @@ describe('Synchronizer', function() { | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	// it('should create remote items', async (done) => { | ||||
| 	// 	let folder = await Folder.save({ title: "folder1" }); | ||||
| 	// 	await Note.save({ title: "un", parent_id: folder.id }); | ||||
| 	it('should create remote items', async (done) => { | ||||
| 		let folder = await Folder.save({ title: "folder1" }); | ||||
| 		await Note.save({ title: "un", parent_id: folder.id }); | ||||
|  | ||||
| 	// 	let all = await Folder.all(true); | ||||
| 		let all = await Folder.all(true); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	await localItemsSameAsRemote(all, expect); | ||||
| 		await localItemsSameAsRemote(all, expect); | ||||
|  | ||||
| 	// 	done(); | ||||
| 	// }); | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	// it('should update remote item', async (done) => { | ||||
| 	// 	let folder = await Folder.save({ title: "folder1" }); | ||||
| 	// 	let note = await Note.save({ title: "un", parent_id: folder.id }); | ||||
| 	// 	await synchronizer().start(); | ||||
| 	it('should update remote item', async (done) => { | ||||
| 		let folder = await Folder.save({ title: "folder1" }); | ||||
| 		let note = await Note.save({ title: "un", parent_id: folder.id }); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	await sleep(0.1); | ||||
| 		await sleep(0.1); | ||||
|  | ||||
| 	// 	await Note.save({ title: "un UPDATE", id: note.id }); | ||||
| 		await Note.save({ title: "un UPDATE", id: note.id }); | ||||
|  | ||||
| 	// 	let all = await Folder.all(true); | ||||
| 	// 	await synchronizer().start(); | ||||
| 		let all = await Folder.all(true); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	await localItemsSameAsRemote(all, expect); | ||||
| 		await localItemsSameAsRemote(all, expect); | ||||
|  | ||||
| 	// 	done(); | ||||
| 	// }); | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	// it('should create local items', async (done) => { | ||||
| 	// 	let folder = await Folder.save({ title: "folder1" }); | ||||
| 	// 	await Note.save({ title: "un", parent_id: folder.id }); | ||||
| 	// 	await synchronizer().start(); | ||||
| 	it('should create local items', async (done) => { | ||||
| 		let folder = await Folder.save({ title: "folder1" }); | ||||
| 		await Note.save({ title: "un", parent_id: folder.id }); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	switchClient(2); | ||||
| 		switchClient(2); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	let all = await Folder.all(true); | ||||
| 	// 	await localItemsSameAsRemote(all, expect); | ||||
| 		let all = await Folder.all(true); | ||||
| 		await localItemsSameAsRemote(all, expect); | ||||
|  | ||||
| 	// 	done(); | ||||
| 	// }); | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	// it('should update local items', async (done) => { | ||||
| 	// 	let folder1 = await Folder.save({ title: "folder1" }); | ||||
| 	// 	let note1 = await Note.save({ title: "un", parent_id: folder1.id }); | ||||
| 	// 	await synchronizer().start(); | ||||
| 	it('should update local items', async (done) => { | ||||
| 		let folder1 = await Folder.save({ title: "folder1" }); | ||||
| 		let note1 = await Note.save({ title: "un", parent_id: folder1.id }); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	switchClient(2); | ||||
| 		switchClient(2); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	await sleep(0.1); | ||||
| 		await sleep(0.1); | ||||
|  | ||||
| 	// 	let note2 = await Note.load(note1.id); | ||||
| 	// 	note2.title = "Updated on client 2"; | ||||
| 	// 	await Note.save(note2); | ||||
| 		let note2 = await Note.load(note1.id); | ||||
| 		note2.title = "Updated on client 2"; | ||||
| 		await Note.save(note2); | ||||
|  | ||||
| 	// 	note2 = await Note.load(note2.id); | ||||
| 		note2 = await Note.load(note2.id); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	let files = await fileApi().list(); | ||||
| 		let files = await fileApi().list(); | ||||
|  | ||||
| 	// 	switchClient(1); | ||||
| 		switchClient(1); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	note1 = await Note.load(note1.id); | ||||
| 		note1 = await Note.load(note1.id); | ||||
|  | ||||
| 	// 	expect(!!note1).toBe(true); | ||||
| 	// 	expect(note1.title).toBe(note2.title); | ||||
| 	// 	expect(note1.body).toBe(note2.body); | ||||
| 		expect(!!note1).toBe(true); | ||||
| 		expect(note1.title).toBe(note2.title); | ||||
| 		expect(note1.body).toBe(note2.body); | ||||
|  | ||||
| 	// 	done(); | ||||
| 	// }); | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	// it('should resolve note conflicts', async (done) => { | ||||
| 	// 	let folder1 = await Folder.save({ title: "folder1" }); | ||||
| 	// 	let note1 = await Note.save({ title: "un", parent_id: folder1.id }); | ||||
| 	// 	await synchronizer().start(); | ||||
| 	it('should resolve note conflicts', async (done) => { | ||||
| 		let folder1 = await Folder.save({ title: "folder1" }); | ||||
| 		let note1 = await Note.save({ title: "un", parent_id: folder1.id }); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	switchClient(2); | ||||
| 		switchClient(2); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	await sleep(0.1); | ||||
| 		await sleep(0.1); | ||||
|  | ||||
| 	// 	let note2 = await Note.load(note1.id); | ||||
| 	// 	note2.title = "Updated on client 2"; | ||||
| 	// 	await Note.save(note2); | ||||
| 	// 	note2 = await Note.load(note2.id); | ||||
| 		let note2 = await Note.load(note1.id); | ||||
| 		note2.title = "Updated on client 2"; | ||||
| 		await Note.save(note2); | ||||
| 		note2 = await Note.load(note2.id); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	switchClient(1); | ||||
| 		switchClient(1); | ||||
|  | ||||
| 	// 	await sleep(0.1); | ||||
| 		await sleep(0.1); | ||||
|  | ||||
| 	// 	let note2conf = await Note.load(note1.id); | ||||
| 	// 	note2conf.title = "Updated on client 1"; | ||||
| 	// 	await Note.save(note2conf); | ||||
| 	// 	note2conf = await Note.load(note1.id); | ||||
| 		let note2conf = await Note.load(note1.id); | ||||
| 		note2conf.title = "Updated on client 1"; | ||||
| 		await Note.save(note2conf); | ||||
| 		note2conf = await Note.load(note1.id); | ||||
|  | ||||
| 	// 	await synchronizer().start(); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 	// 	let conflictFolder = await Folder.conflictFolder(); | ||||
| 	// 	let conflictedNotes = await Note.all(conflictFolder.id); | ||||
| 		let conflictFolder = await Folder.conflictFolder(); | ||||
| 		let conflictedNotes = await Note.all(conflictFolder.id); | ||||
|  | ||||
| 	// 	expect(conflictedNotes.length).toBe(1); | ||||
| 		expect(conflictedNotes.length).toBe(1); | ||||
|  | ||||
| 	// 	// Other than the id (since the conflicted note is a duplicate), parent_id (which is now the Conflicts folder) and sync_time, | ||||
| 	// 	// the note must be the same in every way, to make sure no data has been lost. | ||||
| 	// 	let conflictedNote = conflictedNotes[0]; | ||||
| 	// 	expect(conflictedNote.id == note2conf.id).toBe(false); | ||||
| 	// 	expect(conflictedNote.parent_id == note2conf.parent_id).toBe(false); | ||||
| 	// 	for (let n in conflictedNote) { | ||||
| 	// 		if (!conflictedNote.hasOwnProperty(n)) continue; | ||||
| 	// 		if (n == 'id' || n == 'parent_id') continue; | ||||
| 	// 		expect(conflictedNote[n]).toBe(note2conf[n], 'Property: ' + n); | ||||
| 	// 	} | ||||
| 		// Other than the id (since the conflicted note is a duplicate), parent_id (which is now the Conflicts folder) and sync_time, | ||||
| 		// the note must be the same in every way, to make sure no data has been lost. | ||||
| 		let conflictedNote = conflictedNotes[0]; | ||||
| 		expect(conflictedNote.id == note2conf.id).toBe(false); | ||||
| 		expect(conflictedNote.parent_id == note2conf.parent_id).toBe(false); | ||||
| 		for (let n in conflictedNote) { | ||||
| 			if (!conflictedNote.hasOwnProperty(n)) continue; | ||||
| 			if (n == 'id' || n == 'parent_id') continue; | ||||
| 			expect(conflictedNote[n]).toBe(note2conf[n], 'Property: ' + n); | ||||
| 		} | ||||
|  | ||||
| 	// 	let noteUpdatedFromRemote = await Note.load(note1.id); | ||||
| 	// 	for (let n in noteUpdatedFromRemote) { | ||||
| 	// 		if (!noteUpdatedFromRemote.hasOwnProperty(n)) continue; | ||||
| 	// 		if (n == 'sync_time') continue; | ||||
| 	// 		expect(noteUpdatedFromRemote[n]).toBe(note2[n], 'Property: ' + n); | ||||
| 	// 	} | ||||
| 		let noteUpdatedFromRemote = await Note.load(note1.id); | ||||
| 		for (let n in noteUpdatedFromRemote) { | ||||
| 			if (!noteUpdatedFromRemote.hasOwnProperty(n)) continue; | ||||
| 			if (n == 'sync_time') continue; | ||||
| 			expect(noteUpdatedFromRemote[n]).toBe(note2[n], 'Property: ' + n); | ||||
| 		} | ||||
|  | ||||
| 	// 	done(); | ||||
| 	// }); | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	it('should resolve folders conflicts', async (done) => { | ||||
| 		let folder1 = await Folder.save({ title: "folder1" }); | ||||
| @@ -214,29 +214,6 @@ describe('Synchronizer', function() { | ||||
| 		let folder1_final = await Folder.load(folder1.id); | ||||
| 		expect(folder1_final.title).toBe(folder1_modRemote.title); | ||||
|  | ||||
| 		// let conflictFolder = await Folder.conflictFolder(); | ||||
| 		// let conflictedNotes = await Note.all(conflictFolder.id); | ||||
|  | ||||
| 		// expect(conflictedNotes.length).toBe(1); | ||||
|  | ||||
| 		// // Other than the id (since the conflicted note is a duplicate), parent_id (which is now the Conflicts folder) and sync_time, | ||||
| 		// // the note must be the same in every way, to make sure no data has been lost. | ||||
| 		// let conflictedNote = conflictedNotes[0]; | ||||
| 		// expect(conflictedNote.id == note2conf.id).toBe(false); | ||||
| 		// expect(conflictedNote.parent_id == note2conf.parent_id).toBe(false); | ||||
| 		// for (let n in conflictedNote) { | ||||
| 		// 	if (!conflictedNote.hasOwnProperty(n)) continue; | ||||
| 		// 	if (n == 'id' || n == 'parent_id') continue; | ||||
| 		// 	expect(conflictedNote[n]).toBe(note2conf[n], 'Property: ' + n); | ||||
| 		// } | ||||
|  | ||||
| 		// let noteUpdatedFromRemote = await Note.load(note1.id); | ||||
| 		// for (let n in noteUpdatedFromRemote) { | ||||
| 		// 	if (!noteUpdatedFromRemote.hasOwnProperty(n)) continue; | ||||
| 		// 	if (n == 'sync_time') continue; | ||||
| 		// 	expect(noteUpdatedFromRemote[n]).toBe(note2[n], 'Property: ' + n); | ||||
| 		// } | ||||
|  | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
|   | ||||
| @@ -67,8 +67,8 @@ class BaseModel { | ||||
|  | ||||
| 	static identifyItemType(item) { | ||||
| 		if (!item) throw new Error('Cannot identify undefined item'); | ||||
| 		if ('body' in item || ('parent_id' in item && !!item.parent_id)) return BaseModel.ITEM_TYPE_NOTE; | ||||
| 		if ('sync_time' in item) return BaseModel.ITEM_TYPE_FOLDER; | ||||
| 		if ('body' in item || ('parent_id' in item && !!item.parent_id)) return BaseModel.MODEL_TYPE_NOTE; | ||||
| 		if ('sync_time' in item) return BaseModel.MODEL_TYPE_FOLDER; | ||||
| 		throw new Error('Cannot identify item: ' + JSON.stringify(item)); | ||||
| 	} | ||||
|  | ||||
| @@ -268,8 +268,9 @@ class BaseModel { | ||||
|  | ||||
| } | ||||
|  | ||||
| BaseModel.ITEM_TYPE_NOTE = 1; | ||||
| BaseModel.ITEM_TYPE_FOLDER = 2; | ||||
| BaseModel.MODEL_TYPE_NOTE = 1; | ||||
| BaseModel.MODEL_TYPE_FOLDER = 2; | ||||
| BaseModel.MODEL_TYPE_SETTING = 3; | ||||
| BaseModel.tableInfo_ = null; | ||||
| BaseModel.tableKeys_ = null; | ||||
| BaseModel.db_ = null; | ||||
|   | ||||
| @@ -22,10 +22,10 @@ class BaseItem extends BaseModel { | ||||
|  | ||||
| 		if (typeof item === 'object') { | ||||
| 			if (!('type_' in item)) throw new Error('Item does not have a type_ property'); | ||||
| 			return item.type_ == BaseModel.ITEM_TYPE_NOTE ? Note : Folder; | ||||
| 			return item.type_ == BaseModel.MODEL_TYPE_NOTE ? Note : Folder; | ||||
| 		} else { | ||||
| 			if (Number(item) === BaseModel.ITEM_TYPE_NOTE) return Note; | ||||
| 			if (Number(item) === BaseModel.ITEM_TYPE_FOLDER) return Folder; | ||||
| 			if (Number(item) === BaseModel.MODEL_TYPE_NOTE) return Note; | ||||
| 			if (Number(item) === BaseModel.MODEL_TYPE_FOLDER) return Folder; | ||||
| 			throw new Error('Unknown type: ' + item); | ||||
| 		} | ||||
| 	} | ||||
| @@ -119,7 +119,7 @@ class BaseItem extends BaseModel { | ||||
| 		if (!output.type_) throw new Error('Missing required property: type_: ' + content); | ||||
| 		output.type_ = Number(output.type_); | ||||
|  | ||||
| 		if (output.type_ == BaseModel.ITEM_TYPE_NOTE) output.body = body.join("\n"); | ||||
| 		if (output.type_ == BaseModel.MODEL_TYPE_NOTE) output.body = body.join("\n"); | ||||
|  | ||||
| 		for (let n in output) { | ||||
| 			if (!output.hasOwnProperty(n)) continue; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ class Folder extends BaseItem { | ||||
| 	} | ||||
|  | ||||
| 	static itemType() { | ||||
| 		return BaseModel.ITEM_TYPE_FOLDER; | ||||
| 		return BaseModel.MODEL_TYPE_FOLDER; | ||||
| 	} | ||||
|  | ||||
| 	static trackChanges() { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ class Note extends BaseItem { | ||||
| 	} | ||||
|  | ||||
| 	static itemType() { | ||||
| 		return BaseModel.ITEM_TYPE_NOTE; | ||||
| 		return BaseModel.MODEL_TYPE_NOTE; | ||||
| 	} | ||||
|  | ||||
| 	static trackChanges() { | ||||
|   | ||||
| @@ -8,6 +8,10 @@ class Setting extends BaseModel { | ||||
| 		return 'settings'; | ||||
| 	} | ||||
|  | ||||
| 	static itemType() { | ||||
| 		return BaseModel.MODEL_TYPE_SETTING; | ||||
| 	} | ||||
|  | ||||
| 	static defaultSetting(key) { | ||||
| 		if (!(key in this.defaults_)) throw new Error('Unknown key: ' + key); | ||||
| 		let output = Object.assign({}, this.defaults_[key]); | ||||
| @@ -26,8 +30,9 @@ class Setting extends BaseModel { | ||||
| 	} | ||||
|  | ||||
| 	static load() { | ||||
| 		this.cancelScheduleUpdate(); | ||||
| 		this.cache_ = []; | ||||
| 		return this.db().selectAll('SELECT * FROM settings').then((rows) => { | ||||
| 		return this.modelSelectAll('SELECT * FROM settings').then((rows) => { | ||||
| 			this.cache_ = rows; | ||||
| 		}); | ||||
| 	} | ||||
| @@ -113,6 +118,11 @@ class Setting extends BaseModel { | ||||
| 		}, 500); | ||||
| 	} | ||||
|  | ||||
| 	static cancelScheduleUpdate() { | ||||
| 		if (this.updateTimeoutId_) clearTimeout(this.updateTimeoutId_); | ||||
| 		this.updateTimeoutId_ = null; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| Setting.defaults_ = { | ||||
|   | ||||
| @@ -54,7 +54,7 @@ class Synchronizer { | ||||
| 						// Since, in this loop, we are only dealing with notes that require sync, if the | ||||
| 						// remote has been modified after the sync time, it means both notes have been | ||||
| 						// modified and so there's a conflict. | ||||
| 						action = local.type_ == BaseModel.ITEM_TYPE_NOTE ? 'noteConflict' : 'folderConflict'; | ||||
| 						action = local.type_ == BaseModel.MODEL_TYPE_NOTE ? 'noteConflict' : 'folderConflict'; | ||||
| 					} else { | ||||
| 						action = 'updateRemote'; | ||||
| 					} | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class Synchronizer { | ||||
| 	} | ||||
|  | ||||
| 	loadParentAndItem(change) { | ||||
| 		if (change.item_type == BaseModel.ITEM_TYPE_NOTE) { | ||||
| 		if (change.item_type == BaseModel.MODEL_TYPE_NOTE) { | ||||
| 			return Note.load(change.item_id).then((note) => { | ||||
| 				return Folder.load(note.parent_id).then((folder) => { | ||||
| 					return Promise.resolve({ parent: folder, item: note }); | ||||
| @@ -52,10 +52,10 @@ class Synchronizer { | ||||
|  | ||||
| 					let ItemClass = null;					 | ||||
| 					let path = null; | ||||
| 					if (c.item_type == BaseModel.ITEM_TYPE_FOLDER) { | ||||
| 					if (c.item_type == BaseModel.MODEL_TYPE_FOLDER) { | ||||
| 						ItemClass = Folder; | ||||
| 						path = 'folders'; | ||||
| 					} else if (c.item_type == BaseModel.ITEM_TYPE_NOTE) { | ||||
| 					} else if (c.item_type == BaseModel.MODEL_TYPE_NOTE) { | ||||
| 						ItemClass = Note; | ||||
| 						path = 'notes'; | ||||
| 					} | ||||
|   | ||||
| @@ -38,7 +38,7 @@ class Synchronizer { | ||||
| 	} | ||||
|  | ||||
| 	loadParentAndItem(change) { | ||||
| 		if (change.item_type == BaseModel.ITEM_TYPE_NOTE) { | ||||
| 		if (change.item_type == BaseModel.MODEL_TYPE_NOTE) { | ||||
| 			return Note.load(change.item_id).then((note) => { | ||||
| 				if (!note) return { parent:null, item: null }; | ||||
|  | ||||
| @@ -107,7 +107,7 @@ class Synchronizer { | ||||
| 		if (!dbItem) return null; | ||||
|  | ||||
| 		return { | ||||
| 			type: dbItem.type_ == BaseModel.ITEM_TYPE_FOLDER ? 'folder' : 'note', | ||||
| 			type: dbItem.type_ == BaseModel.MODEL_TYPE_FOLDER ? 'folder' : 'note', | ||||
| 			path: Folder.systemPath(dbItem), | ||||
| 			syncTime: dbItem.sync_time, | ||||
| 			updated_time: dbItem.updated_time, | ||||
| @@ -119,7 +119,7 @@ class Synchronizer { | ||||
| 		if (!remoteItem) return null; | ||||
|  | ||||
| 		return { | ||||
| 			type: remoteItem.content.type_ == BaseModel.ITEM_TYPE_FOLDER ? 'folder' : 'note', | ||||
| 			type: remoteItem.content.type_ == BaseModel.MODEL_TYPE_FOLDER ? 'folder' : 'note', | ||||
| 			path: remoteItem.path, | ||||
| 			syncTime: 0, | ||||
| 			updated_time: remoteItem.updated_time, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user