UNPKG

ghost

Version:

The professional publishing platform

71 lines (58 loc) 2.02 kB
const _ = require('lodash'); const db = require('../../data/db'); const commands = require('../schema').commands; const ghostVersion = require('@tryghost/version'); const tpl = require('@tryghost/tpl'); const errors = require('@tryghost/errors'); const {sequence} = require('@tryghost/promise'); const messages = { errorExportingData: 'Error exporting data' }; const { TABLES_ALLOWLIST, SETTING_KEYS_BLOCKLIST } = require('./table-lists'); const exportTable = function exportTable(tableName, options) { if (TABLES_ALLOWLIST.includes(tableName) || (options.include && _.isArray(options.include) && options.include.indexOf(tableName) !== -1)) { const query = (options.transacting || db.knex)(tableName); return query.select(); } }; const getSettingsTableData = function getSettingsTableData(settingsData) { return settingsData && settingsData.filter((setting) => { return !SETTING_KEYS_BLOCKLIST.includes(setting.key); }); }; const doExport = async function doExport(options) { options = options || {include: []}; try { const tables = await commands.getTables(options.transacting); const tableData = await sequence(tables.map(tableName => async () => { return exportTable(tableName, options); })); const exportData = { meta: { exported_on: new Date().getTime(), version: ghostVersion.full }, data: { // Filled below } }; tables.forEach((name, i) => { if (name === 'settings') { exportData.data[name] = getSettingsTableData(tableData[i]); } else { exportData.data[name] = tableData[i]; } }); return exportData; } catch (err) { throw new errors.DataExportError({ err: err, context: tpl(messages.errorExportingData) }); } }; module.exports = doExport;