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.
101 lines
2.7 KiB
101 lines
2.7 KiB
import { Target } from '../types/target'; |
|
import { exporterFactory } from '../services/exporter.factory'; |
|
import { EXPORTED_PATH } from '../config'; |
|
|
|
import { Task, TaskTableRowConfig } from '../types'; |
|
|
|
import * as express from 'express'; |
|
|
|
import * as path from 'path'; |
|
import * as fs from 'fs'; |
|
|
|
type TRequest = { |
|
body: { |
|
from: string, |
|
to: string, |
|
username: string, |
|
tasks: Task[], |
|
url: string, |
|
}, |
|
}; |
|
|
|
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); |
|
resp.push({ |
|
timestamp: status.time, |
|
username: status.username, |
|
datasourceRef: status.datasourceRef, |
|
rowsCount: status.exportedRows, |
|
progress: status.progress, |
|
status: status.status, |
|
filename: file.name, |
|
}); |
|
} |
|
|
|
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`; |
|
|
|
if(isNaN(from) || isNaN(to)) { |
|
res.status(400).send('Range error: please fill both "from" and "to" fields'); |
|
} else if(from >= to) { |
|
res.status(400).send('Range error: "from" should be less than "to"'); |
|
} 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); |
|
res.status(200).send(`Exporting ${names} data from ${new Date(from).toLocaleString()} to ${new Date(to).toLocaleString()}`); |
|
} |
|
} |
|
|
|
async function deleteTask(req, res) { |
|
let filename = req.body.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' }); |
|
} |
|
|
|
export const router = express.Router(); |
|
|
|
router.get('/', getTasks); |
|
router.post('/', addTask); |
|
router.delete('/', deleteTask);
|
|
|