Notes/src/routes/api/note_revisions.js

145 lines
4.2 KiB
JavaScript
Raw Normal View History

2017-10-21 21:10:33 -04:00
"use strict";
const repository = require('../../services/repository');
2019-09-07 10:11:59 +02:00
const noteCacheService = require('../../services/note_cache');
2019-11-09 08:53:13 +01:00
const protectedSessionService = require('../../services/protected_session');
const utils = require('../../services/utils');
const path = require('path');
async function getNoteRevisions(req) {
return await repository.getEntities(`
2019-11-09 15:21:14 +01:00
SELECT * FROM note_revisions
WHERE noteId = ? AND isErased = 0
ORDER BY utcDateCreated DESC`, [req.params.noteId]);
}
2019-11-01 19:21:48 +01:00
async function getNoteRevision(req) {
2019-11-01 20:00:56 +01:00
const noteRevision = await repository.getNoteRevision(req.params.noteRevisionId);
2019-11-09 13:01:05 +01:00
if (noteRevision.type === 'file') {
if (noteRevision.isStringNote()) {
noteRevision.content = (await noteRevision.getContent()).substr(0, 10000);
2019-11-09 13:01:05 +01:00
}
}
else {
noteRevision.content = await noteRevision.getContent();
2019-11-01 20:00:56 +01:00
2019-11-09 08:53:13 +01:00
if (noteRevision.content && noteRevision.type === 'image') {
noteRevision.content = noteRevision.content.toString('base64');
}
2019-11-08 23:09:57 +01:00
}
2019-11-01 20:00:56 +01:00
return noteRevision;
}
2019-11-09 08:53:13 +01:00
/**
* @param {NoteRevision} noteRevision
* @return {string}
*/
function getRevisionFilename(noteRevision) {
let filename = noteRevision.title || "untitled";
if (noteRevision.type === 'text') {
filename += '.html';
} else if (['relation-map', 'search'].includes(noteRevision.type)) {
filename += '.json';
}
const extension = path.extname(filename);
const date = noteRevision.dateCreated
.substr(0, 19)
.replace(' ', '_')
.replace(/[^0-9_]/g, '');
if (extension) {
filename = filename.substr(0, filename.length - extension.length)
+ '-' + date + extension;
}
else {
filename += '-' + date;
}
return filename;
}
async function downloadNoteRevision(req, res) {
const noteRevision = await repository.getNoteRevision(req.params.noteRevisionId);
if (noteRevision.noteId !== req.params.noteId) {
return res.status(400).send(`Note revision ${req.params.noteRevisionId} does not belong to note ${req.params.noteId}`);
}
if (noteRevision.isProtected && !protectedSessionService.isProtectedSessionAvailable()) {
return res.status(401).send("Protected session not available");
}
const filename = getRevisionFilename(noteRevision);
res.setHeader('Content-Disposition', utils.getContentDisposition(filename));
res.setHeader('Content-Type', noteRevision.mime);
res.send(await noteRevision.getContent());
}
2019-11-09 16:51:51 +01:00
/**
* @param {NoteRevision} noteRevision
*/
2019-11-09 15:21:14 +01:00
async function eraseOneNoteRevision(noteRevision) {
noteRevision.isErased = true;
noteRevision.title = null;
await noteRevision.setContent(null);
await noteRevision.save();
}
async function eraseAllNoteRevisions(req) {
const noteRevisionsToErase = await repository.getEntities(
'SELECT * FROM note_revisions WHERE isErased = 0 AND noteId = ?',
[req.params.noteId]);
for (const noteRevision of noteRevisionsToErase) {
await eraseOneNoteRevision(noteRevision);
}
}
async function eraseNoteRevision(req) {
const noteRevision = await repository.getNoteRevision(req.params.noteRevisionId);
if (noteRevision && !noteRevision.isErased) {
await eraseOneNoteRevision(noteRevision);
}
}
2019-09-07 10:11:59 +02:00
async function getEditedNotesOnDate(req) {
const date = utils.sanitizeSql(req.params.date);
2019-09-07 10:11:59 +02:00
const notes = await repository.getEntities(`
2019-12-01 14:30:59 +01:00
SELECT notes.*
FROM notes
WHERE noteId IN (
SELECT noteId FROM notes
WHERE notes.dateCreated LIKE '${date}%'
OR notes.dateModified LIKE '${date}%'
UNION ALL
SELECT noteId FROM note_revisions
WHERE note_revisions.dateLastEdited LIKE '${date}%'
)
ORDER BY isDeleted
LIMIT 50`);
2019-09-07 10:11:59 +02:00
for (const note of notes) {
const notePath = noteCacheService.getNotePath(note.noteId);
note.notePath = notePath ? notePath.notePath : null;
}
return notes;
}
module.exports = {
2019-09-07 10:11:59 +02:00
getNoteRevisions,
2019-11-01 19:21:48 +01:00
getNoteRevision,
2019-11-09 08:53:13 +01:00
downloadNoteRevision,
2019-11-09 15:21:14 +01:00
getEditedNotesOnDate,
eraseAllNoteRevisions,
eraseNoteRevision
};