Browse Source

Merge pull request 'Fix non-deletable CSV and JSON files' (#11) from fix-non-deletable-csv into master

Reviewed-on: #11
master
rozetko 1 year ago
parent
commit
1c34ee1359
  1. 17
      src/routes/tasks.ts
  2. 25
      src/services/exporter.ts

17
src/routes/tasks.ts

@ -17,6 +17,7 @@ type TRequest = {
task: ExportTask,
url: string,
timeZoneName: string,
apiKey: string,
},
};
@ -66,6 +67,11 @@ async function addTask(req: TRequest, res) {
res.status(400).send('"task" field is required');
return;
}
const apiKey = body.apiKey;
if (_.isEmpty(apiKey)) {
res.status(400).send('"apiKey" field is required');
return;
}
try {
validateGrafanaUrl(clientUrl);
@ -87,15 +93,16 @@ async function addTask(req: TRequest, res) {
}
const exporter = exporterFactory.getExporter();
exporter.export(task, datasourceUrl, body.timeZoneName);
exporter.export(task, datasourceUrl, body.timeZoneName, apiKey);
res.status(200).send(`Export process started`);
}
async function deleteTask(req, res) {
let taskId = req.body.taskId;
let csvFilePath = path.join(CSV_PATH, `${taskId}.csv`);
let jsonFilePath = path.join(CSV_PATH, `${taskId}.json`);
const taskId = req.body.taskId;
const jsonFilePath = path.join(CSV_PATH, `${taskId}.json`);
const data = fs.readFileSync(jsonFilePath, 'utf8');
const csvName = JSON.parse(data)['filename'];
const csvFilePath = path.join(CSV_PATH, `${csvName}.csv`);
if(fs.existsSync(csvFilePath)) {
fs.unlink(csvFilePath, err => console.error(err));
}

25
src/services/exporter.ts

@ -29,7 +29,7 @@ const DEFAULT_PROGRESS = {
export class Exporter {
private _task: ExportTask;
public async export(task: ExportTask, datasourceUrl: string, timeZoneName: string) {
public async export(task: ExportTask, datasourceUrl: string, timeZoneName: string, apiKey: string) {
try {
this._task = _.cloneDeep(task);
this._task.id = uuidv4();
@ -72,9 +72,6 @@ export class Exporter {
let values = [];
for(const queryConfig of queryConfigs) {
const host = new URL(datasourceUrl).origin;
const apiKey = getApiKey(host);
const datasourceMetrics = await queryByConfig(queryConfig, datasourceUrl, from, to, apiKey);
if(_.isEmpty(columns)) {
@ -117,15 +114,15 @@ export class Exporter {
const csvStream = csv.createWriteStream({ headers: true, delimiter: this._task.csvDelimiter })
.on('error', async e => await this._updateProgress({ status: ExportStatus.ERROR, errorMessage: e.message }));
const writableStream = fs.createWriteStream(this._getFilePath('csv'));
const writableStream = fs.createWriteStream(this._getCsvFilePath());
csvStream.pipe(writableStream);
writableStream.on('finish', async () => {
if(this._task.progress.status !== ExportStatus.ERROR) {
console.log(`Everything is written to ${this._getFilename('csv')}`);
console.log(`Everything is written to ${this._getCsvFilename()}`);
await this._updateProgress({ status: ExportStatus.FINISHED, progress: 1 });
} else {
console.log(`${this._getFilename('csv')} export is finished with error`);
console.log(`${this._getCsvFilename()} export is finished with error`);
}
});
@ -141,7 +138,7 @@ export class Exporter {
progress: _.assign(this._task.progress, progress, { time }),
};
await promisify(fs.writeFile)(this._getFilePath('json'), JSON.stringify(data), 'utf8');
await promisify(fs.writeFile)(this._getJsonFilePath(), JSON.stringify(data), 'utf8');
} catch(err) {
console.error(err);
throw new Error('Can`t write file');
@ -174,12 +171,16 @@ export class Exporter {
}
}
private _getFilename(extension: string): string {
return `${this._task.filename}.${extension}`;
private _getCsvFilename(): string {
return `${this._task.filename}.csv`;
}
private _getFilePath(extension: string): string {
let filename = this._getFilename(extension);
private _getCsvFilePath(): string {
let filename = this._getCsvFilename();
return path.join(CSV_PATH, filename);
}
private _getJsonFilePath(): string {
return path.join(CSV_PATH, `${this._task.id}.json`);
}
}

Loading…
Cancel
Save