Files
dbgate/packages/api/src/controllers/archive.js
Jan Prochazka 37cc86f8d2 prettier
2021-01-23 07:20:44 +01:00

99 lines
2.8 KiB
JavaScript

const fs = require('fs-extra');
const stream = require('stream');
const readline = require('readline');
const path = require('path');
const { formatWithOptions } = require('util');
const { archivedir } = require('../utility/directories');
const socket = require('../utility/socket');
const JsonLinesDatastore = require('../utility/JsonLinesDatastore');
const { saveFreeTableData } = require('../utility/freeTableStorage');
module.exports = {
folders_meta: 'get',
async folders() {
const folders = await fs.readdir(archivedir());
return [
{
name: 'default',
type: 'jsonl',
},
...folders
.filter(x => x != 'default')
.map(name => ({
name,
type: 'jsonl',
})),
];
},
createFolder_meta: 'post',
async createFolder({ folder }) {
await fs.mkdir(path.join(archivedir(), folder));
socket.emitChanged('archive-folders-changed');
return true;
},
files_meta: 'get',
async files({ folder }) {
const dir = path.join(archivedir(), folder);
if (!(await fs.exists(dir))) return [];
const files = await fs.readdir(dir);
return files
.filter(name => name.endsWith('.jsonl'))
.map(name => ({
name: name.slice(0, -'.jsonl'.length),
type: 'jsonl',
}));
},
refreshFiles_meta: 'post',
async refreshFiles({ folder }) {
socket.emitChanged(`archive-files-changed-${folder}`);
},
refreshFolders_meta: 'post',
async refreshFolders() {
socket.emitChanged(`archive-folders-changed`);
},
deleteFile_meta: 'post',
async deleteFile({ folder, file }) {
await fs.unlink(path.join(archivedir(), folder, `${file}.jsonl`));
socket.emitChanged(`archive-files-changed-${folder}`);
},
deleteFolder_meta: 'post',
async deleteFolder({ folder }) {
if (!folder) throw new Error('Missing folder parameter');
await fs.rmdir(path.join(archivedir(), folder), { recursive: true });
socket.emitChanged(`archive-folders-changed`);
},
saveFreeTable_meta: 'post',
async saveFreeTable({ folder, file, data }) {
saveFreeTableData(path.join(archivedir(), folder, `${file}.jsonl`), data);
return true;
},
loadFreeTable_meta: 'post',
async loadFreeTable({ folder, file }) {
return new Promise((resolve, reject) => {
const fileStream = fs.createReadStream(path.join(archivedir(), folder, `${file}.jsonl`));
const liner = readline.createInterface({
input: fileStream,
});
let structure = null;
const rows = [];
liner.on('line', line => {
const data = JSON.parse(line);
if (structure) rows.push(data);
else structure = data;
});
liner.on('close', () => {
resolve({ structure, rows });
fileStream.close();
});
});
},
};