From 9edee9340bba8000152892789051a27e30d6dc98 Mon Sep 17 00:00:00 2001 From: azivner Date: Fri, 30 Mar 2018 13:56:46 -0400 Subject: [PATCH] converted settings, note revisions, password change and recent changes routes --- .../javascripts/dialogs/note_revisions.js | 2 +- src/public/javascripts/dialogs/settings.js | 4 +- src/routes/api/note_revisions.js | 27 +++--------- src/routes/api/password.js | 19 +++----- src/routes/api/recent_changes.js | 14 +++--- src/routes/api/settings.js | 43 ++++++++----------- src/routes/routes.js | 25 ++++++++--- src/services/options.js | 19 ++------ 8 files changed, 61 insertions(+), 92 deletions(-) diff --git a/src/public/javascripts/dialogs/note_revisions.js b/src/public/javascripts/dialogs/note_revisions.js index d752506ab..cc2e4c436 100644 --- a/src/public/javascripts/dialogs/note_revisions.js +++ b/src/public/javascripts/dialogs/note_revisions.js @@ -25,7 +25,7 @@ async function showNoteRevisionsDialog(noteId, noteRevisionId) { $list.empty(); $content.empty(); - revisionItems = await server.get('notes-revisions/' + noteId); + revisionItems = await server.get('note-revisions/' + noteId); for (const item of revisionItems) { const dateModified = utils.parseDate(item.dateModifiedFrom); diff --git a/src/public/javascripts/dialogs/settings.js b/src/public/javascripts/dialogs/settings.js index f0d5e2ce2..9a6c086f7 100644 --- a/src/public/javascripts/dialogs/settings.js +++ b/src/public/javascripts/dialogs/settings.js @@ -105,7 +105,7 @@ addTabHandler((function() { $form.submit(() => { const protectedSessionTimeout = $protectedSessionTimeout.val(); - settings.saveSettings(settingName, protectedSessionTimeout).then(() => { + saveSettings(settingName, protectedSessionTimeout).then(() => { protectedSessionHolder.setProtectedSessionTimeout(protectedSessionTimeout); }); @@ -127,7 +127,7 @@ addTabHandler((function () { } $form.submit(() => { - settings.saveSettings(settingName, $timeInterval.val()); + saveSettings(settingName, $timeInterval.val()); return false; }); diff --git a/src/routes/api/note_revisions.js b/src/routes/api/note_revisions.js index ebf9e59f6..ec5b960eb 100644 --- a/src/routes/api/note_revisions.js +++ b/src/routes/api/note_revisions.js @@ -1,31 +1,16 @@ "use strict"; -const express = require('express'); -const router = express.Router(); const sql = require('../../services/sql'); -const auth = require('../../services/auth'); const protected_session = require('../../services/protected_session'); -const sync_table = require('../../services/sync_table'); -const wrap = require('express-promise-wrap').wrap; -router.get('/:noteId', auth.checkApiAuth, wrap(async (req, res, next) => { +async function getNoteRevisions(req) { const noteId = req.params.noteId; const revisions = await sql.getRows("SELECT * FROM note_revisions WHERE noteId = ? order by dateModifiedTo desc", [noteId]); protected_session.decryptNoteRevisions(req, revisions); - res.send(revisions); -})); + return revisions; +} -router.put('', auth.checkApiAuth, wrap(async (req, res, next) => { - const sourceId = req.headers.source_id; - - await sql.doInTransaction(async () => { - await sql.replace("note_revisions", req.body); - - await sync_table.addNoteRevisionSync(req.body.noteRevisionId, sourceId); - }); - - res.send(); -})); - -module.exports = router; \ No newline at end of file +module.exports = { + getNoteRevisions +}; \ No newline at end of file diff --git a/src/routes/api/password.js b/src/routes/api/password.js index 74e20317a..3f7f7db6e 100644 --- a/src/routes/api/password.js +++ b/src/routes/api/password.js @@ -1,16 +1,11 @@ "use strict"; -const express = require('express'); -const router = express.Router(); -const sql = require('../../services/sql'); -const changePassword = require('../../services/change_password'); -const auth = require('../../services/auth'); -const wrap = require('express-promise-wrap').wrap; +const changePasswordService = require('../../services/change_password'); -router.post('/change', auth.checkApiAuth, wrap(async (req, res, next) => { - const result = await changePassword.changePassword(req.body['current_password'], req.body['new_password'], req); +async function changePassword(req) { + return await changePasswordService.changePassword(req.body['current_password'], req.body['new_password'], req); +} - res.send(result); -})); - -module.exports = router; \ No newline at end of file +module.exports = { + changePassword +}; \ No newline at end of file diff --git a/src/routes/api/recent_changes.js b/src/routes/api/recent_changes.js index 4459010a2..b7cabbf15 100644 --- a/src/routes/api/recent_changes.js +++ b/src/routes/api/recent_changes.js @@ -1,12 +1,8 @@ "use strict"; -const express = require('express'); -const router = express.Router(); const sql = require('../../services/sql'); -const auth = require('../../services/auth'); -const wrap = require('express-promise-wrap').wrap; -router.get('/', auth.checkApiAuth, wrap(async (req, res, next) => { +async function getRecentChanges() { const recentChanges = await sql.getRows( `SELECT notes.isDeleted AS current_isDeleted, @@ -19,7 +15,9 @@ router.get('/', auth.checkApiAuth, wrap(async (req, res, next) => { dateModifiedTo DESC LIMIT 1000`); - res.send(recentChanges); -})); + return recentChanges; +} -module.exports = router; \ No newline at end of file +module.exports = { + getRecentChanges +}; \ No newline at end of file diff --git a/src/routes/api/settings.js b/src/routes/api/settings.js index 5d6ab3c8a..5090e1e7d 100644 --- a/src/routes/api/settings.js +++ b/src/routes/api/settings.js @@ -1,44 +1,35 @@ "use strict"; -const express = require('express'); -const router = express.Router(); const sql = require('../../services/sql'); const options = require('../../services/options'); -const auth = require('../../services/auth'); -const wrap = require('express-promise-wrap').wrap; // options allowed to be updated directly in settings dialog const ALLOWED_OPTIONS = ['protected_session_timeout', 'note_revision_snapshot_time_interval']; -router.get('/all', auth.checkApiAuth, wrap(async (req, res, next) => { - const settings = await sql.getMap("SELECT name, value FROM options"); +async function getAllSettings() { + return await sql.getMap("SELECT name, value FROM options"); +} - res.send(settings); -})); - -router.get('/', auth.checkApiAuth, wrap(async (req, res, next) => { +async function getAllowedSettings() { const settings = await sql.getMap("SELECT name, value FROM options WHERE name IN (" + ALLOWED_OPTIONS.map(x => '?').join(",") + ")", ALLOWED_OPTIONS); - res.send(settings); -})); + return settings; +} -router.post('/', auth.checkApiAuth, wrap(async (req, res, next) => { +async function updateSetting(req) { const body = req.body; const sourceId = req.headers.source_id; - if (ALLOWED_OPTIONS.includes(body['name'])) { - const optionName = await options.getOption(body['name']); - - await sql.doInTransaction(async () => { - await options.setOption(body['name'], body['value'], sourceId); - }); - - res.send({}); + if (!ALLOWED_OPTIONS.includes(body['name'])) { + return [400, "not allowed option to set"]; } - else { - res.send("not allowed option to set"); - } -})); -module.exports = router; \ No newline at end of file + await options.setOption(body['name'], body['value'], sourceId); +} + +module.exports = { + getAllowedSettings, + getAllSettings, + updateSetting +}; \ No newline at end of file diff --git a/src/routes/routes.js b/src/routes/routes.js index f704e36a5..cb53f458c 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -61,13 +61,17 @@ function apiRoute(method, path, handler) { } } else if (result === undefined) { - res.status(200); + res.status(200).send(); } else { res.status(200).send(result); } } catch (e) { + log.info(`${method} ${path} threw exception: ` + e.stack); + + res.send(500); + next(e); } }); @@ -106,11 +110,16 @@ function register(app) { apiRoute(GET, '/api/labels/names', labelsRoute.getAllLabelNames); apiRoute(GET, '/api/labels/values/:labelName', labelsRoute.getValuesForLabel); - app.use('/api/notes-revisions', noteRevisionsApiRoute); - app.use('/api/recent-changes', recentChangesApiRoute); - app.use('/api/settings', settingsApiRoute); - app.use('/api/password', passwordApiRoute); - app.use('/api/migration', migrationApiRoute); + apiRoute(GET, '/api/note-revisions/:noteId', noteRevisionsApiRoute.getNoteRevisions); + + apiRoute(GET, '/api/recent-changes', recentChangesApiRoute.getRecentChanges); + + apiRoute(GET, '/api/settings', settingsApiRoute.getAllowedSettings); + apiRoute(GET, '/api/settings/all', settingsApiRoute.getAllSettings); + apiRoute(POST, '/api/settings', settingsApiRoute.updateSetting); + + apiRoute(POST, '/api/password/change', passwordApiRoute.changePassword); + app.use('/api/sync', syncApiRoute); app.use('/api/login', loginApiRoute); app.use('/api/event-log', eventLogRoute); @@ -127,7 +136,11 @@ function register(app) { app.use('/api/sender', senderRoute); app.use('/api/files', filesRoute); app.use('/api/search', searchRoute); + app.use('', router); + + + app.use('/api/migration', migrationApiRoute); } module.exports = { diff --git a/src/services/options.js b/src/services/options.js index ae512f5c3..83b1ed8fe 100644 --- a/src/services/options.js +++ b/src/services/options.js @@ -23,14 +23,7 @@ async function getOption(name) { } async function setOption(name, value, sourceId = null) { - let opt; - - try { - opt = await sql.getRow("SELECT * FROM options WHERE name = ?", [name]); - } - catch (e) { - opt = await sql.getRow("SELECT * FROM options WHERE opt_name = ?", [name]); - } + const opt = await sql.getRow("SELECT * FROM options WHERE name = ?", [name]); if (!opt) { throw new Error(`Option ${name} doesn't exist`); @@ -40,14 +33,8 @@ async function setOption(name, value, sourceId = null) { await sync_table.addOptionsSync(name, sourceId); } - try { - await sql.execute("UPDATE options SET value = ?, dateModified = ? WHERE name = ?", - [value, utils.nowDate(), name]); - } - catch (e) { - await sql.execute("UPDATE options SET opt_value = ?, date_modified = ? WHERE opt_name = ?", - [value, utils.nowDate(), name]); - } + await sql.execute("UPDATE options SET value = ?, dateModified = ? WHERE name = ?", + [value, utils.nowDate(), name]); } async function createOption(name, value, isSynced, sourceId = null) {