From ae23f2ea846f8886a65138e1d3efdeebc571e0c6 Mon Sep 17 00:00:00 2001 From: azivner Date: Sun, 5 Nov 2017 00:16:02 -0400 Subject: [PATCH] added sync for recent notes --- .../0027__is_deleted_in_recent_notes.sql | 1 + routes/api/recent_notes.js | 13 +++++++++---- routes/api/sync.js | 12 ++++++++++++ services/migration.js | 2 +- services/sql.js | 7 ++++++- services/sync.js | 19 +++++++++++++++++++ 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 migrations/0027__is_deleted_in_recent_notes.sql diff --git a/migrations/0027__is_deleted_in_recent_notes.sql b/migrations/0027__is_deleted_in_recent_notes.sql new file mode 100644 index 000000000..ddf4d293c --- /dev/null +++ b/migrations/0027__is_deleted_in_recent_notes.sql @@ -0,0 +1 @@ +ALTER TABLE recent_notes ADD COLUMN is_deleted INT; \ No newline at end of file diff --git a/routes/api/recent_notes.js b/routes/api/recent_notes.js index 22056db84..8ea6dec7d 100644 --- a/routes/api/recent_notes.js +++ b/routes/api/recent_notes.js @@ -13,14 +13,19 @@ router.get('', auth.checkApiAuth, async (req, res, next) => { router.put('/:noteId', auth.checkApiAuth, async (req, res, next) => { await sql.replace('recent_notes', { note_id: req.params.noteId, - date_accessed: utils.nowTimestamp() + date_accessed: utils.nowTimestamp(), + is_deleted: 0 }); + await sql.addRecentNoteSync(req.params.noteId); + res.send(await getRecentNotes()); }); router.delete('/:noteId', auth.checkApiAuth, async (req, res, next) => { - await sql.remove('recent_notes', req.params.noteId); + await sql.execute('UPDATE recent_notes SET is_deleted = 1 WHERE note_id = ?', [req.params.noteId]); + + await sql.addRecentNoteSync(req.params.noteId); res.send(await getRecentNotes()); }); @@ -28,11 +33,11 @@ router.delete('/:noteId', auth.checkApiAuth, async (req, res, next) => { async function getRecentNotes() { await deleteOld(); - return await sql.getResults("SELECT * FROM recent_notes ORDER BY date_accessed DESC"); + return await sql.getResults("SELECT * FROM recent_notes WHERE is_deleted = 0 ORDER BY date_accessed DESC"); } async function deleteOld() { - const cutoffDateAccessed = await sql.getSingleValue("SELECT date_accessed FROM recent_notes ORDER BY date_accessed DESC LIMIT 100, 1"); + const cutoffDateAccessed = await sql.getSingleValue("SELECT date_accessed FROM recent_notes WHERE is_deleted = 0 ORDER BY date_accessed DESC LIMIT 100, 1"); if (cutoffDateAccessed) { await sql.execute("DELETE FROM recent_notes WHERE date_accessed < ?", [cutoffDateAccessed]); diff --git a/routes/api/sync.js b/routes/api/sync.js index 2d3b3b9e7..55fa0365b 100644 --- a/routes/api/sync.js +++ b/routes/api/sync.js @@ -59,6 +59,12 @@ router.get('/notes_reordering/:noteParentId', auth.checkApiAuth, async (req, res }); }); +router.get('/recent_notes/:noteId', auth.checkApiAuth, async (req, res, next) => { + const noteId = req.params.noteId; + + res.send(await sql.getSingleResult("SELECT * FROM recent_notes WHERE note_id = ?", [noteId])); +}); + router.put('/notes', auth.checkApiAuth, async (req, res, next) => { await sync.updateNote(req.body.entity, req.body.links, req.body.sourceId); @@ -89,4 +95,10 @@ router.put('/options', auth.checkApiAuth, async (req, res, next) => { res.send({}); }); +router.put('/recent_notes', auth.checkApiAuth, async (req, res, next) => { + await sync.updateRecentNotes(req.body.entity, req.body.sourceId); + + res.send({}); +}); + module.exports = router; \ No newline at end of file diff --git a/services/migration.js b/services/migration.js index a6076ba44..1358f9c3c 100644 --- a/services/migration.js +++ b/services/migration.js @@ -4,7 +4,7 @@ const options = require('./options'); const fs = require('fs-extra'); const log = require('./log'); -const APP_DB_VERSION = 26; +const APP_DB_VERSION = 27; const MIGRATIONS_DIR = "./migrations"; async function migrate() { diff --git a/services/sql.js b/services/sql.js index 33ad1a7a3..8f15dfcd3 100644 --- a/services/sql.js +++ b/services/sql.js @@ -148,6 +148,10 @@ async function addOptionsSync(optName, sourceId) { await addEntitySync("options", optName, sourceId); } +async function addRecentNoteSync(noteId, sourceId) { + await addEntitySync("recent_notes", noteId, sourceId); +} + async function addEntitySync(entityName, entityId, sourceId) { await replace("sync", { entity_name: entityName, @@ -210,5 +214,6 @@ module.exports = { addNoteTreeSync, addNoteReorderingSync, addNoteHistorySync, - addOptionsSync + addOptionsSync, + addRecentNoteSync }; \ No newline at end of file diff --git a/services/sync.js b/services/sync.js index 94b53fd01..f931724d8 100644 --- a/services/sync.js +++ b/services/sync.js @@ -67,6 +67,9 @@ async function pullSync(syncContext) { else if (sync.entity_name === 'options') { await updateOptions(resp, syncContext.sourceId); } + else if (sync.entity_name === 'recent_notes') { + await updateRecentNotes(resp, syncContext.sourceId); + } else { logSyncError("Unrecognized entity type " + sync.entity_name, e); } @@ -123,6 +126,9 @@ async function readAndPushEntity(sync, syncContext) { else if (sync.entity_name === 'options') { entity = await sql.getSingleResult('SELECT * FROM options WHERE opt_name = ?', [sync.entity_id]); } + else if (sync.entity_name === 'recent_notes') { + entity = await sql.getSingleResult('SELECT * FROM recent_notes WHERE note_id = ?', [sync.entity_id]); + } else { logSyncError("Unrecognized entity type " + sync.entity_name, null); } @@ -358,6 +364,18 @@ async function updateOptions(entity, sourceId) { } } +async function updateRecentNotes(entity, sourceId) { + const orig = await sql.getSingleResultOrNull("select * from recent_notes where note_id = ?", [entity.note_id]); + + if (orig === null || orig.date_accessed < entity.date_accessed) { + await sql.doInTransaction(async () => { + await sql.replace('recent_notes', entity); + + await sql.addRecentNoteSync(entity.note_id, sourceId); + }); + } +} + if (SYNC_SERVER) { log.info("Setting up sync"); @@ -377,5 +395,6 @@ module.exports = { updateNoteHistory, updateNoteReordering, updateOptions, + updateRecentNotes, isSyncSetup }; \ No newline at end of file