1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/src/lib/routes/admin-api/state.js

100 lines
3.1 KiB
JavaScript
Raw Normal View History

'use strict';
const mime = require('mime');
const YAML = require('js-yaml');
const moment = require('moment');
const multer = require('multer');
const Controller = require('../controller');
const { ADMIN } = require('../../permissions');
const extractUser = require('../../extract-user');
const { handleErrors } = require('./util');
const upload = multer({ limits: { fileSize: 5242880 } });
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);
};
class StateController extends Controller {
2020-12-17 19:43:01 +01:00
constructor(config, services) {
super(config);
this.logger = config.getLogger('/admin-api/state.js');
2020-12-17 19:43:01 +01:00
this.stateService = services.stateService;
this.fileupload('/import', upload.single('file'), this.import, ADMIN);
this.get('/export', this.export, ADMIN);
}
async import(req, res) {
const userName = extractUser(req);
const { drop, keep } = req.query;
try {
let data;
if (req.file) {
if (mime.getType(req.file.originalname) === 'text/yaml') {
data = YAML.safeLoad(req.file.buffer);
} else {
data = JSON.parse(req.file.buffer);
}
} else {
data = req.body;
}
2020-12-17 19:43:01 +01:00
await this.stateService.import({
data,
userName,
dropBeforeImport: paramToBool(drop),
keepExisting: paramToBool(keep),
});
res.sendStatus(202);
} catch (err) {
handleErrors(res, this.logger, err);
}
}
async export(req, res) {
const { format } = req.query;
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);
try {
2020-12-17 19:43:01 +01:00
const data = await this.stateService.export({
includeStrategies,
includeFeatureToggles,
includeProjects,
includeTags,
});
const timestamp = moment().format('YYYY-MM-DD_HH-mm-ss');
if (format === 'yaml') {
if (downloadFile) {
res.attachment(`export-${timestamp}.yml`);
}
res.type('yaml').send(
YAML.safeDump(data, { skipInvalid: true }),
);
} else {
if (downloadFile) {
res.attachment(`export-${timestamp}.json`);
}
res.json(data);
}
} catch (err) {
handleErrors(res, this.logger, err);
}
}
}
module.exports = StateController;