From a5735961a47570a8e0d1b1ac9f6fe0b10481d393 Mon Sep 17 00:00:00 2001 From: azivner Date: Wed, 1 Nov 2017 23:16:21 -0400 Subject: [PATCH] don't push changes to server which have been pulled from it --- routes/api/login.js | 5 +++- services/sync.js | 64 ++++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/routes/api/login.js b/routes/api/login.js index 7a4c5d966..5373f80ce 100644 --- a/routes/api/login.js +++ b/routes/api/login.js @@ -5,6 +5,7 @@ const router = express.Router(); const sql = require('../../services/sql'); const utils = require('../../services/utils'); const migration = require('../../services/migration'); +const SOURCE_ID = require('../../services/source_id'); router.post('', async (req, res, next) => { const timestamp = req.body.timestamp; @@ -35,7 +36,9 @@ router.post('', async (req, res, next) => { req.session.loggedIn = true; - res.send({}); + res.send({ + sourceId: SOURCE_ID + }); }); module.exports = router; \ No newline at end of file diff --git a/services/sync.js b/services/sync.js index 1f6c62a3e..abc8fbec0 100644 --- a/services/sync.js +++ b/services/sync.js @@ -15,7 +15,7 @@ const isSyncSetup = !!SYNC_SERVER; let syncInProgress = false; -async function pullSync(cookieJar, syncLog) { +async function pullSync(syncContext, syncLog) { const lastSyncedPull = parseInt(await sql.getOption('last_synced_pull')); let syncRows; @@ -25,7 +25,7 @@ async function pullSync(cookieJar, syncLog) { syncRows = await rp({ uri: SYNC_SERVER + '/api/sync/changed?lastSyncId=' + lastSyncedPull + "&sourceId=" + SOURCE_ID, - jar: cookieJar, + jar: syncContext.cookieJar, json: true, timeout: 5 * 1000 }); @@ -43,7 +43,7 @@ async function pullSync(cookieJar, syncLog) { resp = await rp({ uri: SYNC_SERVER + "/api/sync/" + sync.entity_name + "/" + sync.entity_id, json: true, - jar: cookieJar + jar: syncContext.cookieJar }); } catch (e) { @@ -69,7 +69,7 @@ async function pullSync(cookieJar, syncLog) { logSync("Finished pull"); } -async function pushEntity(entity, entityName, cookieJar, syncLog) { +async function sendEntity(entity, entityName, cookieJar, syncLog) { try { const payload = { sourceId: SOURCE_ID, @@ -94,7 +94,28 @@ async function pushEntity(entity, entityName, cookieJar, syncLog) { } } -async function pushSync(cookieJar, syncLog) { +async function readAndPushEntity(sync, syncLog, syncContext) { + let entity; + + if (sync.entity_name === 'notes') { + entity = await sql.getSingleResult('SELECT * FROM notes WHERE note_id = ?', [sync.entity_id]); + } + else if (sync.entity_name === 'notes_tree') { + entity = await sql.getSingleResult('SELECT * FROM notes_tree WHERE note_id = ?', [sync.entity_id]); + } + else if (sync.entity_name === 'notes_history') { + entity = await sql.getSingleResult('SELECT * FROM notes_history WHERE note_history_id = ?', [sync.entity_id]); + } + else { + logSyncError("Unrecognized entity type " + sync.entity_name, null, syncLog); + } + + logSync("Pushing changes in " + sync.entity_name + " " + sync.entity_id); + + await sendEntity(entity, sync.entity_name, syncContext.cookieJar, syncLog); +} + +async function pushSync(syncContext, syncLog) { let lastSyncedPush = parseInt(await sql.getOption('last_synced_push')); while (true) { @@ -108,25 +129,15 @@ async function pushSync(cookieJar, syncLog) { break; } - let entity; + console.log("sync: ", sync); - if (sync.entity_name === 'notes') { - entity = await sql.getSingleResult('SELECT * FROM notes WHERE note_id = ?', [sync.entity_id]); - } - else if (sync.entity_name === 'notes_tree') { - entity = await sql.getSingleResult('SELECT * FROM notes_tree WHERE note_id = ?', [sync.entity_id]); - } - else if (sync.entity_name === 'notes_history') { - entity = await sql.getSingleResult('SELECT * FROM notes_history WHERE note_history_id = ?', [sync.entity_id]); + if (sync.sourceId === syncContext.sourceId) { + logSync("Skipping sync " + sync.entity_name + " " + sync.entity_id + " because it originates from sync target", syncLog); } else { - logSyncError("Unrecognized entity type " + sync.entity_name, null, syncLog); + await readAndPushEntity(sync, syncLog, syncContext); } - logSync("Pushing changes in " + sync.entity_name + " " + sync.entity_id); - - await pushEntity(entity, sync.entity_name, cookieJar, syncLog); - lastSyncedPush = sync.id; await sql.setOption('last_synced_push', lastSyncedPush); @@ -142,7 +153,7 @@ async function login(syncLog) { const cookieJar = rp.jar(); try { - await rp({ + const resp = await rp({ method: 'POST', uri: SYNC_SERVER + '/api/login', body: { @@ -155,7 +166,10 @@ async function login(syncLog) { jar: cookieJar }); - return cookieJar; + return { + cookieJar: cookieJar, + sourceId: resp.sourceId + }; } catch (e) { logSyncError("Can't login to API for sync, inner exception: ", e, syncLog); @@ -180,11 +194,13 @@ async function sync() { return syncLog; } - const cookieJar = await login(syncLog); + const syncContext = await login(syncLog); - await pullSync(cookieJar, syncLog); + console.log("sync context: ", syncContext); - await pushSync(cookieJar, syncLog); + await pullSync(syncContext, syncLog); + + await pushSync(syncContext, syncLog); } catch (e) { logSync("sync failed: " + e.stack, syncLog);