diff --git a/src/public/javascripts/dialogs/attributes.js b/src/public/javascripts/dialogs/attributes.js index 02977ab88..b27f5e261 100644 --- a/src/public/javascripts/dialogs/attributes.js +++ b/src/public/javascripts/dialogs/attributes.js @@ -97,7 +97,7 @@ function AttributesModel() { await showAttributes(attributes); // attribute might not be rendered immediatelly so could not focus - setTimeout(() => $(".attribute-type-select:last").focus(), 100); + setTimeout(() => $(".attribute-type-select:last").focus(), 1000); }; this.deleteAttribute = function(data, event) { diff --git a/src/routes/api/file_upload.js b/src/routes/api/file_upload.js index d13e23edb..73620b865 100644 --- a/src/routes/api/file_upload.js +++ b/src/routes/api/file_upload.js @@ -34,8 +34,7 @@ async function uploadFile(req) { }; } -async function downloadFile(req, res) { - const noteId = req.params.noteId; +async function downloadNoteFile(noteId, res) { const note = await repository.getNote(noteId); if (!note) { @@ -43,8 +42,7 @@ async function downloadFile(req, res) { } if (note.isProtected && !protectedSessionService.isProtectedSessionAvailable()) { - res.status(401).send("Protected session not available"); - return; + return res.status(401).send("Protected session not available"); } const originalFileName = await note.getLabel('originalFileName'); @@ -56,7 +54,15 @@ async function downloadFile(req, res) { res.send(note.content); } +async function downloadFile(req, res) { + const noteId = req.params.noteId; + + return await downloadNoteFile(noteId, res); + +} + module.exports = { uploadFile, - downloadFile + downloadFile, + downloadNoteFile }; \ No newline at end of file diff --git a/src/routes/custom.js b/src/routes/custom.js index 8f28a1aeb..e57eaefff 100644 --- a/src/routes/custom.js +++ b/src/routes/custom.js @@ -1,21 +1,27 @@ const repository = require('../services/repository'); const log = require('../services/log'); +const fileUploadService = require('./api/file_upload'); const scriptService = require('../services/script'); function register(router) { router.all('/custom/:path*', async (req, res, next) => { - const attrs = await repository.getEntities("SELECT * FROM attributes WHERE isDeleted = 0 AND type = 'label' AND ('customRequestHandler', 'customResourceProvider')"); + // express puts content after first slash into 0 index element + const path = req.params.path + req.params[0]; + + const attrs = await repository.getEntities("SELECT * FROM attributes WHERE isDeleted = 0 AND type = 'label' AND name IN ('customRequestHandler', 'customResourceProvider')"); for (const attr of attrs) { const regex = new RegExp(attr.value); try { - const m = regex.match(router.path); + const m = path.match(regex); if (m) { if (attr.name === 'customRequestHandler') { const note = await attr.getNote(); + log.info(`Handling custom request "${path}" with note ${note.noteId}`); + await scriptService.executeNote(note, { pathParams: m.slice(1), req, @@ -23,10 +29,10 @@ function register(router) { }); } else if (attr.name === 'customResourceProvider') { - + await fileUploadService.downloadNoteFile(attr.noteId, res); } - break; + return; } } catch (e) { @@ -34,7 +40,10 @@ function register(router) { } } - res.send('Hello ' + req.params.path); + const message = `No handler matched for custom ${path} request.`; + + log.info(message); + res.status(404).send(message); }); }