ghost
Version:
The professional publishing platform
121 lines (107 loc) • 4.19 kB
JavaScript
const ObjectId = require('bson-objectid').default;
const logging = require('@tryghost/logging');
const {createTransactionalMigration} = require('./migrations');
const {MIGRATION_USER} = require('./constants');
/**
* Creates a migration which will insert a new setting in settings table
* @param {object} settingSpec - setting type and group
* @param {string} settingSpec.key - settings key
* @param {*} settingSpec.value - settings value
* @param {'array' | 'string' | 'number' | 'boolean' | 'object'} settingSpec.type - settings type
* @param {string} settingSpec.group - settings group
* @param {'PUBLIC' | 'RO' | 'PUBLIC,RO'} [settingSpec.flags] - settings flag
* @returns {Object} migration object returning config/up/down properties
*/
function addSetting({key, value, type, group, flags = null}) {
return createTransactionalMigration(
async function up(connection) {
const settingExists = await connection('settings')
.where('key', '=', key)
.first();
if (settingExists) {
logging.warn(`Skipping adding setting: ${key} - setting already exists`);
return;
}
logging.info(`Adding setting: ${key}`);
const now = connection.raw('CURRENT_TIMESTAMP');
return connection('settings')
.insert({
id: ObjectId().toHexString(),
key,
value,
group,
type,
flags,
created_at: now,
created_by: MIGRATION_USER
});
},
async function down(connection) {
const settingExists = await connection('settings')
.where('key', '=', key)
.first();
if (!settingExists) {
logging.warn(`Skipping dropping setting: ${key} - setting does not exist`);
return;
}
logging.info(`Dropping setting: ${key}`);
return connection('settings')
.where('key', '=', key)
.del();
}
);
}
/**
* @param {string} key - The key of the setting to remove
* @returns {Object} - A migration object with up and down functions
*/
function removeSetting(key) {
let originalSetting = null;
return createTransactionalMigration(
async function up(connection) {
const settingExists = await connection('settings')
.where('key', '=', key)
.first();
if (!settingExists) {
logging.warn(`Skipping removing setting: ${key} - setting does not exist`);
return;
}
// Store the original setting data for the down migration
originalSetting = settingExists;
logging.info(`Removing setting: ${key}`);
return connection('settings')
.where('key', '=', key)
.del();
},
async function down(connection) {
const settingExists = await connection('settings')
.where('key', '=', key)
.first();
if (settingExists) {
logging.warn(`Skipping restoring setting: ${key} - setting already exists`);
return;
}
if (!originalSetting) {
logging.warn(`Skipping restoring setting: ${key} - no original setting data found`);
return;
}
logging.info(`Restoring setting: ${key}`);
const now = connection.raw('CURRENT_TIMESTAMP');
return connection('settings')
.insert({
id: ObjectId().toHexString(),
key,
value: originalSetting.value,
group: originalSetting.group,
type: originalSetting.type,
flags: originalSetting.flags,
created_at: now,
created_by: MIGRATION_USER
});
}
);
}
module.exports = {
addSetting,
removeSetting
};