You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.8 KiB

import { Target } from '../types/target';
import { exporterFactory } from '../services/exporter.factory';
import { EXPORTED_PATH } from '../config';
6 years ago
import { Task, TaskTableRowConfig } from '../types';
import * as express from 'express';
import * as path from 'path';
import * as fs from 'fs';
6 years ago
type TRequest = {
body: {
from: string,
to: string,
username: string,
tasks: Task[],
url: string,
},
};
6 years ago
async function getTasks(req, res) {
const resp: TaskTableRowConfig[] = [];
fs.readdir(EXPORTED_PATH, (err, items) => {
if(err) {
console.error(err);
res.status(500).send('Something went wrong');
} else {
for(let item of items) {
let file = path.parse(item);
if(file.ext !== '.json') {
continue;
}
// TODO: read async
let data = fs.readFileSync(path.join(EXPORTED_PATH, item), 'utf8');
let status = JSON.parse(data);
2 years ago
let filename = '';
if(status.status === 'finished') {
2 years ago
filename = file.name;
}
resp.push({
timestamp: status.time,
2 years ago
username: status.user,
datasourceRef: status.datasourceRef,
rowsCount: status.exportedRows,
progress: status.progress,
status: status.status,
2 years ago
filename,
});
}
res.status(200).send(resp);
}
});
}
async function addTask(req: TRequest, res) {
const body = req.body;
const clientUrl = body.url;
const from = parseInt(body.from);
const to = parseInt(body.to);
const username = body.username;
const tasks = body.tasks;
const datasourceUrl = `${new URL(clientUrl).origin}/api/ds/query`;
6 years ago
if(isNaN(from) || isNaN(to)) {
res.status(400).send('Range error: please fill both "from" and "to" fields');
6 years ago
} else if(from >= to) {
res.status(400).send('Range error: "from" should be less than "to"');
6 years ago
} else {
const names = tasks.map(item => item.datasource.name).join(', ');
const targets = tasks.map((task: Task) => new Target(
task.panel,
task.datasource,
));
const exporter = exporterFactory.getExporter();
exporter.export(targets, datasourceUrl, username, from, to);
2 years ago
res.status(200).send(`Exporting ${names} data from ${new Date(from).toLocaleString()} to ${new Date(to).toLocaleString()}`);
6 years ago
}
}
async function deleteTask(req, res) {
let filename = req.query.filename;
let csvFilePath = path.join(EXPORTED_PATH, `${filename}.csv`);
let jsonFilePath = path.join(EXPORTED_PATH, `${filename}.json`);
if(fs.existsSync(csvFilePath)) {
fs.unlink(csvFilePath, err => console.error(err));
}
if(fs.existsSync(jsonFilePath)) {
fs.unlink(jsonFilePath, err => console.error(err));
}
res.status(200).send({ status: 'OK' });
}
6 years ago
export const router = express.Router();
router.get('/', getTasks);
6 years ago
router.post('/', addTask);
router.delete('/', deleteTask);