2017-12-03 10:48:22 +08:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const express = require('express');
|
|
|
|
const router = express.Router();
|
|
|
|
const sql = require('../../services/sql');
|
2018-02-25 23:55:21 +08:00
|
|
|
const attributes = require('../../services/attributes');
|
2017-12-03 22:19:48 +08:00
|
|
|
const html = require('html');
|
2017-12-23 22:57:20 +08:00
|
|
|
const auth = require('../../services/auth');
|
2018-01-07 22:35:44 +08:00
|
|
|
const wrap = require('express-promise-wrap').wrap;
|
2018-02-25 23:55:21 +08:00
|
|
|
const tar = require('tar-stream');
|
|
|
|
const sanitize = require("sanitize-filename");
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
router.get('/:noteId/', auth.checkApiAuth, wrap(async (req, res, next) => {
|
2017-12-03 10:48:22 +08:00
|
|
|
const noteId = req.params.noteId;
|
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const noteTreeId = await sql.getValue('SELECT noteTreeId FROM note_tree WHERE noteId = ?', [noteId]);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const pack = tar.pack();
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const name = await exportNote(noteTreeId, '', pack);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
pack.finalize();
|
2017-12-03 13:10:43 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
res.setHeader('Content-Disposition', 'attachment; filename="' + name + '.tar"');
|
|
|
|
res.setHeader('Content-Type', 'application/tar');
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
pack.pipe(res);
|
2018-01-07 22:35:44 +08:00
|
|
|
}));
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
async function exportNote(noteTreeId, directory, pack) {
|
2018-01-30 06:41:59 +08:00
|
|
|
const noteTree = await sql.getRow("SELECT * FROM note_tree WHERE noteTreeId = ?", [noteTreeId]);
|
|
|
|
const note = await sql.getRow("SELECT * FROM notes WHERE noteId = ?", [noteTree.noteId]);
|
2017-12-03 13:10:43 +08:00
|
|
|
|
2018-02-26 13:07:43 +08:00
|
|
|
if (note.isProtected) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const content = note.type === 'text' ? html.prettyPrint(note.content, {indent_size: 2}) : note.content;
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const childFileName = directory + sanitize(note.title);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
console.log(childFileName);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
pack.entry({ name: childFileName + ".dat", size: content.length }, content);
|
|
|
|
|
|
|
|
const metadata = await getMetadata(note);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
pack.entry({ name: childFileName + ".meta", size: metadata.length }, metadata);
|
2017-12-03 10:48:22 +08:00
|
|
|
|
2018-02-25 23:55:21 +08:00
|
|
|
const children = await sql.getRows("SELECT * FROM note_tree WHERE parentNoteId = ? AND isDeleted = 0", [note.noteId]);
|
|
|
|
|
|
|
|
if (children.length > 0) {
|
2017-12-03 10:48:22 +08:00
|
|
|
for (const child of children) {
|
2018-02-25 23:55:21 +08:00
|
|
|
await exportNote(child.noteTreeId, childFileName + "/", pack);
|
2017-12-03 10:48:22 +08:00
|
|
|
}
|
|
|
|
}
|
2018-02-25 23:55:21 +08:00
|
|
|
|
|
|
|
return childFileName;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function getMetadata(note) {
|
|
|
|
const meta = {
|
|
|
|
title: note.title,
|
|
|
|
type: note.type,
|
|
|
|
mime: note.mime,
|
|
|
|
attributes: await attributes.getNoteAttributeMap(note.noteId)
|
|
|
|
};
|
|
|
|
|
|
|
|
return JSON.stringify(meta, null, '\t')
|
2017-12-03 10:48:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = router;
|