2019-03-13 19:10:13 +01:00
|
|
|
'use strict';
|
|
|
|
|
2019-03-15 16:18:33 +01:00
|
|
|
const mime = require('mime');
|
2019-03-13 19:10:13 +01:00
|
|
|
const YAML = require('js-yaml');
|
|
|
|
const moment = require('moment');
|
|
|
|
const multer = require('multer');
|
2020-04-14 22:29:11 +02:00
|
|
|
const Controller = require('../controller');
|
|
|
|
const { ADMIN } = require('../../permissions');
|
|
|
|
const extractUser = require('../../extract-user');
|
|
|
|
const { handleErrors } = require('./util');
|
|
|
|
|
2019-03-13 19:10:13 +01:00
|
|
|
const upload = multer({ limits: { fileSize: 5242880 } });
|
2021-03-12 11:08:10 +01:00
|
|
|
const paramToBool = (param, def) => {
|
|
|
|
if (param === null || param === undefined) {
|
|
|
|
return def;
|
|
|
|
}
|
|
|
|
const nu = Number.parseInt(param, 10);
|
|
|
|
if (Number.isNaN(nu)) {
|
|
|
|
return param.toLowerCase() === 'true';
|
|
|
|
}
|
|
|
|
return Boolean(nu);
|
|
|
|
};
|
2019-03-14 17:56:02 +01:00
|
|
|
class StateController extends Controller {
|
2020-12-17 19:43:01 +01:00
|
|
|
constructor(config, services) {
|
2019-03-13 19:10:13 +01:00
|
|
|
super(config);
|
2019-04-30 21:14:23 +02:00
|
|
|
this.logger = config.getLogger('/admin-api/state.js');
|
2020-12-17 19:43:01 +01:00
|
|
|
this.stateService = services.stateService;
|
2019-03-13 19:10:13 +01:00
|
|
|
this.fileupload('/import', upload.single('file'), this.import, ADMIN);
|
|
|
|
this.get('/export', this.export, ADMIN);
|
|
|
|
}
|
|
|
|
|
|
|
|
async import(req, res) {
|
|
|
|
const userName = extractUser(req);
|
2020-11-03 14:56:07 +01:00
|
|
|
const { drop, keep } = req.query;
|
2019-03-13 19:10:13 +01:00
|
|
|
|
2019-03-15 16:18:33 +01:00
|
|
|
try {
|
|
|
|
let data;
|
|
|
|
if (req.file) {
|
2019-04-26 10:36:17 +02:00
|
|
|
if (mime.getType(req.file.originalname) === 'text/yaml') {
|
2019-03-15 16:18:33 +01:00
|
|
|
data = YAML.safeLoad(req.file.buffer);
|
|
|
|
} else {
|
|
|
|
data = JSON.parse(req.file.buffer);
|
|
|
|
}
|
2019-03-13 19:10:13 +01:00
|
|
|
} else {
|
2019-03-15 16:18:33 +01:00
|
|
|
data = req.body;
|
2019-03-13 19:10:13 +01:00
|
|
|
}
|
|
|
|
|
2020-12-17 19:43:01 +01:00
|
|
|
await this.stateService.import({
|
2019-03-13 19:10:13 +01:00
|
|
|
data,
|
|
|
|
userName,
|
2021-03-12 11:08:10 +01:00
|
|
|
dropBeforeImport: paramToBool(drop),
|
|
|
|
keepExisting: paramToBool(keep),
|
2019-03-13 19:10:13 +01:00
|
|
|
});
|
|
|
|
res.sendStatus(202);
|
|
|
|
} catch (err) {
|
2019-04-30 21:14:23 +02:00
|
|
|
handleErrors(res, this.logger, err);
|
2019-03-13 19:10:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async export(req, res) {
|
|
|
|
const { format } = req.query;
|
|
|
|
|
2021-03-12 11:08:10 +01:00
|
|
|
const downloadFile = paramToBool(req.query.download, false);
|
|
|
|
const includeStrategies = paramToBool(req.query.strategies, true);
|
|
|
|
const includeFeatureToggles = paramToBool(
|
|
|
|
req.query.featureToggles,
|
|
|
|
true,
|
|
|
|
);
|
|
|
|
const includeProjects = paramToBool(req.query.projects, true);
|
|
|
|
const includeTags = paramToBool(req.query.tags, true);
|
2019-03-13 19:10:13 +01:00
|
|
|
|
|
|
|
try {
|
2020-12-17 19:43:01 +01:00
|
|
|
const data = await this.stateService.export({
|
2019-03-14 17:56:02 +01:00
|
|
|
includeStrategies,
|
|
|
|
includeFeatureToggles,
|
2021-03-12 11:08:10 +01:00
|
|
|
includeProjects,
|
|
|
|
includeTags,
|
2019-03-13 19:10:13 +01:00
|
|
|
});
|
|
|
|
const timestamp = moment().format('YYYY-MM-DD_HH-mm-ss');
|
|
|
|
if (format === 'yaml') {
|
2019-03-14 17:56:02 +01:00
|
|
|
if (downloadFile) {
|
2019-03-13 19:10:13 +01:00
|
|
|
res.attachment(`export-${timestamp}.yml`);
|
|
|
|
}
|
2020-07-30 23:57:13 +02:00
|
|
|
res.type('yaml').send(
|
|
|
|
YAML.safeDump(data, { skipInvalid: true }),
|
|
|
|
);
|
2019-03-13 19:10:13 +01:00
|
|
|
} else {
|
2019-03-14 17:56:02 +01:00
|
|
|
if (downloadFile) {
|
2019-03-13 19:10:13 +01:00
|
|
|
res.attachment(`export-${timestamp}.json`);
|
|
|
|
}
|
|
|
|
res.json(data);
|
|
|
|
}
|
|
|
|
} catch (err) {
|
2019-04-30 21:14:23 +02:00
|
|
|
handleErrors(res, this.logger, err);
|
2019-03-13 19:10:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-14 17:56:02 +01:00
|
|
|
module.exports = StateController;
|