mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-04-08 02:52:39 -05:00
🎨 Move settings cache & cleanup settings API (#8057)
closes #8037 🔥 Remove API-level default settings population - This is a relic! - We ALWAYS populate defaults on server start therefore this code could never run. - This was a lot of complicated code that wasn't even needed!! 🎨 Move settings cache - Move settings cache to be its own thing - Update all references - Adds TODOs for further cleanup 🎨 Create settings initialisation step - Create new settings library, which will eventually house more code - Unify the interface for initialising settings (will be more useful later) - Reduce number of calls to updateSettingsCache
This commit is contained in:
parent
56eb89659e
commit
63723aa36a
41 changed files with 189 additions and 224 deletions
|
@ -2,7 +2,7 @@
|
|||
// RESTful API for browsing the configuration
|
||||
var _ = require('lodash'),
|
||||
config = require('../config'),
|
||||
settingsCache = require('../api/settings').cache,
|
||||
settingsCache = require('../settings/cache'),
|
||||
ghostVersion = require('../utils/ghost-version'),
|
||||
models = require('../models'),
|
||||
Promise = require('bluebird'),
|
||||
|
|
|
@ -12,47 +12,36 @@ var _ = require('lodash'),
|
|||
docName = 'settings',
|
||||
settings,
|
||||
|
||||
settingsCache = require('../settings/cache'),
|
||||
|
||||
updateSettingsCache,
|
||||
settingsFilter,
|
||||
filterPaths,
|
||||
readSettingsResult,
|
||||
settingsResult,
|
||||
canEditAllSettings,
|
||||
populateDefaultSetting,
|
||||
hasPopulatedDefaults = false,
|
||||
|
||||
/**
|
||||
* ## Cache
|
||||
* Holds cached settings
|
||||
* @type {{}}
|
||||
*/
|
||||
settingsCache = {};
|
||||
|
||||
/**
|
||||
* ### Update Settings Cache
|
||||
* Maintain the internal cache of the settings object
|
||||
* @public
|
||||
* @param {Object} settings
|
||||
* @returns {Settings}
|
||||
*/
|
||||
updateSettingsCache = function (settings, options) {
|
||||
// @TODO simplify this!
|
||||
updateSettingsCache = function updateSettingsCache(settings, options) {
|
||||
options = options || {};
|
||||
settings = settings || {};
|
||||
|
||||
if (!_.isEmpty(settings)) {
|
||||
_.map(settings, function (setting, key) {
|
||||
settingsCache[key] = setting;
|
||||
settingsCache.set(key, setting);
|
||||
});
|
||||
|
||||
return Promise.resolve(settingsCache);
|
||||
return Promise.resolve(settingsCache.getAll());
|
||||
}
|
||||
|
||||
return dataProvider.Settings.findAll(options)
|
||||
.then(function (result) {
|
||||
// keep reference and update all keys
|
||||
_.extend(settingsCache, readSettingsResult(result.models));
|
||||
_.each(readSettingsResult(result.models), function (setting, key) {
|
||||
settingsCache.set(key, setting);
|
||||
});
|
||||
|
||||
return settingsCache;
|
||||
return settingsCache.getAll();
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -175,33 +164,6 @@ settingsResult = function (settings, type) {
|
|||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* ### Populate Default Setting
|
||||
* @private
|
||||
* @param {String} key
|
||||
* @returns Promise(Setting)
|
||||
*/
|
||||
populateDefaultSetting = function (key) {
|
||||
// Call populateDefault and update the settings cache
|
||||
return dataProvider.Settings.populateDefault(key).then(function (defaultSetting) {
|
||||
// Process the default result and add to settings cache
|
||||
var readResult = readSettingsResult([defaultSetting]);
|
||||
|
||||
// Add to the settings cache
|
||||
return updateSettingsCache(readResult).then(function () {
|
||||
// Get the result from the cache with permission checks
|
||||
});
|
||||
}).catch(function (err) {
|
||||
// Pass along NotFoundError
|
||||
if (typeof err === errors.NotFoundError) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
// TODO: different kind of error?
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.settings.problemFindingSetting', {key: key})}));
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* ### Can Edit All Settings
|
||||
* Check that this edit request is allowed for all settings requested to be updated
|
||||
|
@ -210,7 +172,7 @@ populateDefaultSetting = function (key) {
|
|||
* @returns {*}
|
||||
*/
|
||||
canEditAllSettings = function (settingsInfo, options) {
|
||||
var checkSettingPermissions = function (setting) {
|
||||
var checkSettingPermissions = function checkSettingPermissions(setting) {
|
||||
if (setting.type === 'core' && !(options.context && options.context.internal)) {
|
||||
return Promise.reject(
|
||||
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
|
||||
|
@ -222,14 +184,12 @@ canEditAllSettings = function (settingsInfo, options) {
|
|||
});
|
||||
},
|
||||
checks = _.map(settingsInfo, function (settingInfo) {
|
||||
var setting = settingsCache[settingInfo.key];
|
||||
var setting = settingsCache.get(settingInfo.key, {resolve: false});
|
||||
|
||||
if (!setting) {
|
||||
// Try to populate a default setting if not in the cache
|
||||
return populateDefaultSetting(settingInfo.key).then(function (defaultSetting) {
|
||||
// Get the result from the cache with permission checks
|
||||
return checkSettingPermissions(defaultSetting);
|
||||
});
|
||||
return Promise.reject(new errors.NotFoundError(
|
||||
{message: i18n.t('errors.api.settings.problemFindingSetting', {key: settingInfo.key})}
|
||||
));
|
||||
}
|
||||
|
||||
return checkSettingPermissions(setting);
|
||||
|
@ -251,17 +211,9 @@ settings = {
|
|||
* @returns {*}
|
||||
*/
|
||||
browse: function browse(options) {
|
||||
// First, check if we have populated the settings from default-settings yet
|
||||
if (!hasPopulatedDefaults) {
|
||||
return dataProvider.Settings.populateDefaults().then(function () {
|
||||
hasPopulatedDefaults = true;
|
||||
return settings.browse(options);
|
||||
});
|
||||
}
|
||||
|
||||
options = options || {};
|
||||
|
||||
var result = settingsResult(settingsCache, options.type);
|
||||
var result = settingsResult(settingsCache.getAll(), options.type);
|
||||
|
||||
// If there is no context, return only blog settings
|
||||
if (!options.context) {
|
||||
|
@ -289,40 +241,32 @@ settings = {
|
|||
options = {key: options};
|
||||
}
|
||||
|
||||
var getSettingsResult = function () {
|
||||
var setting = settingsCache[options.key],
|
||||
result = {};
|
||||
var setting = settingsCache.get(options.key, {resolve: false}),
|
||||
result = {};
|
||||
|
||||
result[options.key] = setting;
|
||||
|
||||
if (setting.type === 'core' && !(options.context && options.context.internal)) {
|
||||
return Promise.reject(
|
||||
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
|
||||
);
|
||||
}
|
||||
|
||||
if (setting.type === 'blog') {
|
||||
return Promise.resolve(settingsResult(result));
|
||||
}
|
||||
|
||||
return canThis(options.context).read.setting(options.key).then(function () {
|
||||
return settingsResult(result);
|
||||
}, function () {
|
||||
return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.api.settings.noPermissionToReadSettings')}));
|
||||
});
|
||||
};
|
||||
|
||||
// If the setting is not already in the cache
|
||||
if (!settingsCache[options.key]) {
|
||||
// Try to populate the setting from default-settings file
|
||||
return populateDefaultSetting(options.key).then(function () {
|
||||
// Get the result from the cache with permission checks
|
||||
return getSettingsResult();
|
||||
});
|
||||
if (!setting) {
|
||||
return Promise.reject(new errors.NotFoundError(
|
||||
{message: i18n.t('errors.api.settings.problemFindingSetting', {key: options.key})}
|
||||
));
|
||||
}
|
||||
|
||||
// Get the result from the cache with permission checks
|
||||
return getSettingsResult();
|
||||
result[options.key] = setting;
|
||||
|
||||
if (setting.type === 'core' && !(options.context && options.context.internal)) {
|
||||
return Promise.reject(
|
||||
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
|
||||
);
|
||||
}
|
||||
|
||||
if (setting.type === 'blog') {
|
||||
return Promise.resolve(settingsResult(result));
|
||||
}
|
||||
|
||||
return canThis(options.context).read.setting(options.key).then(function () {
|
||||
return settingsResult(result);
|
||||
}, function () {
|
||||
return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.api.settings.noPermissionToReadSettings')}));
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -375,37 +319,4 @@ settings = {
|
|||
|
||||
module.exports = settings;
|
||||
|
||||
/**
|
||||
* @TODO:
|
||||
* - move settings cache somewhere else e.q. listen on model changes
|
||||
*
|
||||
* IMPORTANT:
|
||||
* We store settings with a type and a key in the database.
|
||||
*
|
||||
* {
|
||||
* type: core
|
||||
* key: dbHash
|
||||
* value: ...
|
||||
* }
|
||||
*
|
||||
* But the settings cache does not allow requesting a value by type, only by key.
|
||||
* e.g. settings.cache.get('dbHash')
|
||||
*/
|
||||
module.exports.cache = {
|
||||
get: function get(key) {
|
||||
if (!settingsCache[key]) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
return JSON.parse(settingsCache[key].value);
|
||||
} catch (err) {
|
||||
return settingsCache[key].value;
|
||||
}
|
||||
},
|
||||
getAll: function getAll() {
|
||||
return settingsCache;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.updateSettingsCache = updateSettingsCache;
|
||||
|
|
|
@ -10,6 +10,7 @@ var Promise = require('bluebird'),
|
|||
logging = require('../logging'),
|
||||
storage = require('../storage'),
|
||||
settings = require('./settings'),
|
||||
settingsCache = require('../settings/cache'),
|
||||
apiUtils = require('./utils'),
|
||||
utils = require('./../utils'),
|
||||
i18n = require('../i18n'),
|
||||
|
@ -30,7 +31,7 @@ themes = {
|
|||
},
|
||||
|
||||
browse: function browse() {
|
||||
return Promise.resolve({themes: settings.cache.get('availableThemes')});
|
||||
return Promise.resolve({themes: settingsCache.get('availableThemes')});
|
||||
},
|
||||
|
||||
upload: function upload(options) {
|
||||
|
|
|
@ -6,7 +6,7 @@ var path = require('path'),
|
|||
|
||||
// Dirty requires
|
||||
errors = require('../../../errors'),
|
||||
settingsCache = require('../../../api/settings').cache,
|
||||
settingsCache = require('../../../settings/cache'),
|
||||
templates = require('../../../controllers/frontend/templates'),
|
||||
postLookup = require('../../../controllers/frontend/post-lookup'),
|
||||
setResponseContext = require('../../../controllers/frontend/context');
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
var api = require('../../api'),
|
||||
_ = require('lodash'),
|
||||
Promise = require('bluebird'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../../settings/cache'),
|
||||
queryDefaults,
|
||||
defaultPostQuery = {};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ var _ = require('lodash'),
|
|||
url = require('url'),
|
||||
routeMatch = require('path-match')(),
|
||||
api = require('../../api'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../../settings/cache'),
|
||||
optionsFormat = '/:options?';
|
||||
|
||||
function getOptionsFormat(linkStructure) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
var config = require('../../config'),
|
||||
settingsCache = require('../../api/settings').cache,
|
||||
settingsCache = require('../../settings/cache'),
|
||||
utils = require('../../utils');
|
||||
|
||||
function getAssetUrl(path, isAdmin, minify) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
var settingsCache = require('../../api/settings').cache,
|
||||
var settingsCache = require('../../settings/cache'),
|
||||
_ = require('lodash');
|
||||
|
||||
function getContextObject(data, context) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
var _ = require('lodash'),
|
||||
settingsCache = require('../../api/settings').cache;
|
||||
settingsCache = require('../../settings/cache');
|
||||
|
||||
function getDescription(data, root) {
|
||||
var description = '',
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
var Promise = require('bluebird'),
|
||||
settingsCache = require('../../api/settings').cache,
|
||||
settingsCache = require('../../settings/cache'),
|
||||
utils = require('../../utils'),
|
||||
getUrl = require('./url'),
|
||||
getImageDimensions = require('./image-dimensions'),
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
var _ = require('lodash'),
|
||||
settingsCache = require('../../api/settings').cache;
|
||||
settingsCache = require('../../settings/cache');
|
||||
|
||||
function getTitle(data, root) {
|
||||
var title = '',
|
||||
|
|
|
@ -7,7 +7,7 @@ var crypto = require('crypto'),
|
|||
i18n = require('../../../i18n'),
|
||||
filters = require('../../../filters'),
|
||||
processUrls = require('../../../utils/make-absolute-urls'),
|
||||
settingsCache = require('../../../api/settings').cache,
|
||||
settingsCache = require('../../../settings/cache'),
|
||||
|
||||
// Really ugly temporary hack for location of things
|
||||
fetchData = require('../../../controllers/frontend/fetch-data'),
|
||||
|
|
|
@ -18,7 +18,7 @@ var getMetaData = require('../data/meta'),
|
|||
labs = require('../utils/labs'),
|
||||
utils = require('../utils'),
|
||||
api = require('../api'),
|
||||
settingsCache = api.settings.cache;
|
||||
settingsCache = require('../settings/cache');
|
||||
|
||||
function getClient() {
|
||||
if (labs.isSet('publicAPI') === true) {
|
||||
|
|
|
@ -19,7 +19,6 @@ var debug = require('debug')('ghost:boot:init'),
|
|||
Promise = require('bluebird'),
|
||||
logging = require('./logging'),
|
||||
i18n = require('./i18n'),
|
||||
api = require('./api'),
|
||||
models = require('./models'),
|
||||
permissions = require('./permissions'),
|
||||
apps = require('./apps'),
|
||||
|
@ -29,6 +28,8 @@ var debug = require('debug')('ghost:boot:init'),
|
|||
slack = require('./data/slack'),
|
||||
GhostServer = require('./ghost-server'),
|
||||
scheduling = require('./scheduling'),
|
||||
settings = require('./settings'),
|
||||
settingsCache = require('./settings/cache'),
|
||||
themes = require('./themes'),
|
||||
utils = require('./utils');
|
||||
|
||||
|
@ -47,11 +48,8 @@ function init() {
|
|||
return dbHealth.check().then(function () {
|
||||
debug('DB health check done');
|
||||
// Populate any missing default settings
|
||||
return models.Settings.populateDefaults();
|
||||
}).then(function () {
|
||||
debug('Models & database done');
|
||||
// Refresh the API settings cache
|
||||
return api.settings.updateSettingsCache();
|
||||
return settings.init();
|
||||
}).then(function () {
|
||||
debug('Update settings cache done');
|
||||
// Initialize the permissions actions and objects
|
||||
|
@ -81,8 +79,8 @@ function init() {
|
|||
ghostAuthUrl: config.get('auth:url'),
|
||||
redirectUri: utils.url.urlFor('admin', true),
|
||||
clientUri: utils.url.urlFor('home', true),
|
||||
clientName: api.settings.cache.get('title'),
|
||||
clientDescription: api.settings.cache.get('description')
|
||||
clientName: settingsCache.get('title'),
|
||||
clientDescription: settingsCache.get('description')
|
||||
}).then(function (response) {
|
||||
parentApp.use(response.auth);
|
||||
}).catch(function onAuthError(err) {
|
||||
|
|
|
@ -5,7 +5,7 @@ var _ = require('lodash'),
|
|||
nodemailer = require('nodemailer'),
|
||||
validator = require('validator'),
|
||||
config = require('../config'),
|
||||
settingsCache = require('../api/settings').cache,
|
||||
settingsCache = require('../settings/cache'),
|
||||
i18n = require('../i18n'),
|
||||
utils = require('../utils');
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
var fs = require('fs'),
|
||||
path = require('path'),
|
||||
storage = require('../storage'),
|
||||
settingsCache = require('../api/settings').cache,
|
||||
settingsCache = require('../settings/cache'),
|
||||
utils = require('../utils'),
|
||||
crypto = require('crypto'),
|
||||
buildContentResponse,
|
||||
|
|
|
@ -3,7 +3,7 @@ var _ = require('lodash'),
|
|||
path = require('path'),
|
||||
hbs = require('express-hbs'),
|
||||
api = require('../api'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../settings/cache'),
|
||||
config = require('../config'),
|
||||
utils = require('../utils'),
|
||||
logging = require('../logging'),
|
||||
|
|
|
@ -147,23 +147,6 @@ Settings = ghostBookshelf.Model.extend({
|
|||
});
|
||||
},
|
||||
|
||||
populateDefault: function (key) {
|
||||
if (!getDefaultSettings()[key]) {
|
||||
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.models.settings.unableToFindDefaultSetting', {key: key})}));
|
||||
}
|
||||
|
||||
return this.findOne({key: key}).then(function then(foundSetting) {
|
||||
if (foundSetting) {
|
||||
return foundSetting;
|
||||
}
|
||||
|
||||
var defaultSetting = _.clone(getDefaultSettings()[key]);
|
||||
defaultSetting.value = defaultSetting.defaultValue;
|
||||
|
||||
return Settings.forge(defaultSetting).save(null, internalContext);
|
||||
});
|
||||
},
|
||||
|
||||
populateDefaults: function populateDefaults(options) {
|
||||
options = options || {};
|
||||
|
||||
|
|
67
core/server/settings/cache.js
Normal file
67
core/server/settings/cache.js
Normal file
|
@ -0,0 +1,67 @@
|
|||
// It's important to keep the requires absolutely minimal here,
|
||||
// As this cache is used in SO many other areas, we may open ourselves to
|
||||
// circular dependency bugs.
|
||||
var debug = require('debug')('ghost:settings:cache'),
|
||||
events = require('../events'),
|
||||
/**
|
||||
* ## Cache
|
||||
* Holds cached settings
|
||||
* @type {{}}
|
||||
*/
|
||||
settingsCache = {};
|
||||
|
||||
/**
|
||||
*
|
||||
* IMPORTANT:
|
||||
* We store settings with a type and a key in the database.
|
||||
*
|
||||
* {
|
||||
* type: core
|
||||
* key: dbHash
|
||||
* value: ...
|
||||
* }
|
||||
*
|
||||
* But the settings cache does not allow requesting a value by type, only by key.
|
||||
* e.g. settingsCache.get('dbHash')
|
||||
*/
|
||||
module.exports = {
|
||||
get: function get(key, options) {
|
||||
if (!settingsCache[key]) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't try to resolve to the value of the setting
|
||||
if (options && options.resolve === false) {
|
||||
return settingsCache[key];
|
||||
}
|
||||
|
||||
// Default behaviour is to try to resolve the value and return that
|
||||
try {
|
||||
return JSON.parse(settingsCache[key].value);
|
||||
} catch (err) {
|
||||
return settingsCache[key].value;
|
||||
}
|
||||
},
|
||||
set: function set(key, value) {
|
||||
settingsCache[key] = value;
|
||||
},
|
||||
getAll: function getAll() {
|
||||
return settingsCache;
|
||||
},
|
||||
init: function init() {
|
||||
var self = this,
|
||||
updateSettingFromModel = function updateSettingFromModel(settingModel) {
|
||||
debug('Auto updating', settingModel.get('key'));
|
||||
self.set(settingModel.get('key'), settingModel.toJSON());
|
||||
};
|
||||
// First, reset the cache
|
||||
settingsCache = {};
|
||||
|
||||
// Bind to events to automatically keep up-to-date
|
||||
events.on('settings.edited', updateSettingFromModel);
|
||||
events.on('settings.added', updateSettingFromModel);
|
||||
events.on('settings.deleted', updateSettingFromModel);
|
||||
|
||||
return settingsCache;
|
||||
}
|
||||
};
|
23
core/server/settings/index.js
Normal file
23
core/server/settings/index.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Settings Lib
|
||||
* A collection of utilities for handling settings including a cache
|
||||
* @TODO: eventually much of this logic will move into this lib
|
||||
* For now we are providing a unified interface
|
||||
*/
|
||||
|
||||
var SettingsModel = require('../models/settings').Settings,
|
||||
SettingsAPI = require('../api').settings,
|
||||
SettingsCache = require('./cache');
|
||||
|
||||
module.exports = {
|
||||
init: function init() {
|
||||
// Bind to events
|
||||
SettingsCache.init();
|
||||
// Update the defaults
|
||||
return SettingsModel.populateDefaults()
|
||||
.then(function () {
|
||||
// Reset the cache
|
||||
return SettingsAPI.updateSettingsCache();
|
||||
});
|
||||
}
|
||||
};
|
|
@ -3,6 +3,7 @@ var debug = require('debug')('ghost:themes:loader'),
|
|||
events = require('../events'),
|
||||
read = require('./read'),
|
||||
settingsApi = require('../api/settings'),
|
||||
settingsCache = require('../settings/cache'),
|
||||
updateConfigAndCache,
|
||||
loadThemes,
|
||||
initThemes;
|
||||
|
@ -20,7 +21,7 @@ loadThemes = function loadThemes() {
|
|||
};
|
||||
|
||||
initThemes = function initThemes() {
|
||||
debug('init themes', settingsApi.cache.get('activeTheme'));
|
||||
debug('init themes', settingsCache.get('activeTheme'));
|
||||
|
||||
// Register a listener for server-start to load all themes
|
||||
events.on('server:start', function readAllThemesOnServerStart() {
|
||||
|
@ -29,7 +30,7 @@ initThemes = function initThemes() {
|
|||
|
||||
// Just read the active theme for now
|
||||
return read
|
||||
.one(config.getContentPath('themes'), settingsApi.cache.get('activeTheme'))
|
||||
.one(config.getContentPath('themes'), settingsCache.get('activeTheme'))
|
||||
.then(updateConfigAndCache);
|
||||
};
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
var settingsCache = require('../api/settings').cache,
|
||||
var settingsCache = require('../settings/cache'),
|
||||
flagIsSet;
|
||||
|
||||
flagIsSet = function flagIsSet(flag) {
|
||||
|
|
|
@ -5,7 +5,7 @@ var moment = require('moment-timezone'),
|
|||
_ = require('lodash'),
|
||||
url = require('url'),
|
||||
config = require('./../config'),
|
||||
settingsCache = require('./../api/settings').cache,
|
||||
settingsCache = require('./../settings/cache'),
|
||||
// @TODO: unify this with the path in server/app.js
|
||||
API_PATH = '/ghost/api/v0.1/',
|
||||
STATIC_IMAGE_URL_PREFIX = 'content/images';
|
||||
|
|
|
@ -8,9 +8,11 @@ var request = require('supertest'),
|
|||
moment = require('moment'),
|
||||
sinon = require('sinon'),
|
||||
cheerio = require('cheerio'),
|
||||
_ = require('lodash'),
|
||||
testUtils = require('../../utils'),
|
||||
config = require('../../../server/config'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
origCache = _.cloneDeep(settingsCache),
|
||||
sandbox = sinon.sandbox.create(),
|
||||
ghost = testUtils.startGhost;
|
||||
|
||||
|
@ -327,14 +329,11 @@ describe('Frontend Routing', function () {
|
|||
});
|
||||
|
||||
it('should not render AMP, when AMP is disabled', function (done) {
|
||||
var originalFn = settingsCache.get;
|
||||
|
||||
sandbox.stub(settingsCache, 'get', function (key) {
|
||||
if (key !== 'amp') {
|
||||
return originalFn(key);
|
||||
sandbox.stub(settingsCache, 'get', function (key, options) {
|
||||
if (key === 'amp' && !options) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
return origCache.get(key, options);
|
||||
});
|
||||
|
||||
request.get('/welcome-to-ghost/amp/')
|
||||
|
@ -618,15 +617,6 @@ describe('Frontend Routing', function () {
|
|||
});
|
||||
|
||||
it('/blog/welcome-to-ghost/amp/ should 200', function (done) {
|
||||
var originalFn = settingsCache.get;
|
||||
|
||||
sandbox.stub(settingsCache, 'get', function (key) {
|
||||
if (key !== 'amp') {
|
||||
return originalFn(key);
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
request.get('/blog/welcome-to-ghost/amp/')
|
||||
.expect(200)
|
||||
.end(doEnd(done));
|
||||
|
@ -709,16 +699,6 @@ describe('Frontend Routing', function () {
|
|||
});
|
||||
|
||||
it('/blog/welcome-to-ghost/amp/ should 200', function (done) {
|
||||
var originalFn = settingsCache.get;
|
||||
|
||||
sandbox.stub(settingsCache, 'get', function (key) {
|
||||
if (key !== 'amp') {
|
||||
return originalFn(key);
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
request.get('/blog/welcome-to-ghost/amp/')
|
||||
.expect(200)
|
||||
.end(doEnd(done));
|
||||
|
|
|
@ -9,7 +9,7 @@ var Promise = require('bluebird'),
|
|||
db = require('../../../server/data/db'),
|
||||
models = require('../../../server/models'),
|
||||
PostAPI = require('../../../server/api/posts'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Post API', function () {
|
||||
|
|
|
@ -4,6 +4,7 @@ var testUtils = require('../../utils'),
|
|||
|
||||
// Stuff we are testing
|
||||
SettingsAPI = require('../../../server/api/settings'),
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
defaultContext = {user: 1},
|
||||
internalContext = {internal: true},
|
||||
callApiWithContext,
|
||||
|
@ -115,10 +116,10 @@ describe('Settings API', function () {
|
|||
});
|
||||
|
||||
it('can edit', function () {
|
||||
var testReference = SettingsAPI.cache.getAll();
|
||||
var testReference = settingsCache.getAll();
|
||||
|
||||
// see default-settings.json
|
||||
SettingsAPI.cache.get('title').should.eql('Ghost');
|
||||
settingsCache.get('title').should.eql('Ghost');
|
||||
testReference.title.value.should.eql('Ghost');
|
||||
|
||||
return callApiWithContext(defaultContext, 'edit', {settings: [{key: 'title', value: 'UpdatedGhost'}]}, {})
|
||||
|
@ -128,7 +129,7 @@ describe('Settings API', function () {
|
|||
response.settings.length.should.equal(1);
|
||||
testUtils.API.checkResponse(response.settings[0], 'setting');
|
||||
|
||||
SettingsAPI.cache.get('title').should.eql('UpdatedGhost');
|
||||
settingsCache.get('title').should.eql('UpdatedGhost');
|
||||
testReference.title.value.should.eql('UpdatedGhost');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -5,7 +5,7 @@ var testUtils = require('../../utils'),
|
|||
Promise = require('bluebird'),
|
||||
sinon = require('sinon'),
|
||||
sequence = require('../../../server/utils/sequence'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
ghostBookshelf = require('../../../server/models/base'),
|
||||
PostModel = require('../../../server/models/post').Post,
|
||||
TagModel = require('../../../server/models/tag').Tag,
|
||||
|
|
|
@ -3,6 +3,7 @@ var should = require('should'),
|
|||
Promise = require('bluebird'),
|
||||
// Stuff we are testing
|
||||
api = require('../../../../server/api'),
|
||||
settingsCache = require('../../../../server/settings/cache'),
|
||||
fetchData = require('../../../../server/controllers/frontend/fetch-data'),
|
||||
configUtils = require('../../../utils/configUtils'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
@ -27,7 +28,7 @@ describe('fetchData', function () {
|
|||
|
||||
describe('channel config', function () {
|
||||
beforeEach(function () {
|
||||
sandbox.stub(api.settings.cache, 'get').returns(10);
|
||||
sandbox.stub(settingsCache, 'get').returns(10);
|
||||
});
|
||||
|
||||
it('should handle no post options', function (done) {
|
||||
|
@ -154,7 +155,7 @@ describe('fetchData', function () {
|
|||
|
||||
describe('valid postsPerPage', function () {
|
||||
beforeEach(function () {
|
||||
sandbox.stub(api.settings.cache, 'get').returns(10);
|
||||
sandbox.stub(settingsCache, 'get').returns(10);
|
||||
});
|
||||
|
||||
it('Adds limit & includes to options by default', function (done) {
|
||||
|
@ -170,7 +171,7 @@ describe('fetchData', function () {
|
|||
|
||||
describe('invalid postsPerPage', function () {
|
||||
beforeEach(function () {
|
||||
sandbox.stub(api.settings.cache, 'get').returns(-1);
|
||||
sandbox.stub(settingsCache, 'get').returns(-1);
|
||||
});
|
||||
|
||||
it('Will not add limit if postsPerPage is not valid', function (done) {
|
||||
|
|
|
@ -6,7 +6,7 @@ var moment = require('moment'),
|
|||
api = require('../../../../server/api'),
|
||||
frontend = require('../../../../server/controllers/frontend'),
|
||||
configUtils = require('../../../utils/configUtils'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Frontend Controller', function () {
|
||||
|
|
|
@ -4,7 +4,7 @@ var should = require('should'),
|
|||
configUtils = require('../../../utils/configUtils'),
|
||||
api = require('../../../../server/api'),
|
||||
postLookup = require('../../../../server/controllers/frontend/post-lookup'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('postLookup', function () {
|
||||
|
|
|
@ -2,7 +2,7 @@ var should = require('should'),
|
|||
Promise = require('bluebird'),
|
||||
sinon = require('sinon'),
|
||||
mail = require('../../../server/mail'),
|
||||
api = require('../../../server/api'),
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
configUtils = require('../../utils/configUtils'),
|
||||
i18n = require('../../../server/i18n'),
|
||||
sandbox = sinon.sandbox.create(),
|
||||
|
@ -178,7 +178,7 @@ describe('Mail: Ghostmailer', function () {
|
|||
});
|
||||
|
||||
it('should fall back to [blog.title] <ghost@[blog.url]>', function () {
|
||||
sandbox.stub(api.settings.cache, 'get').returns('Test');
|
||||
sandbox.stub(settingsCache, 'get').returns('Test');
|
||||
|
||||
// Standard domain
|
||||
configUtils.set({url: 'http://default.com', mail: {from: null}});
|
||||
|
@ -207,7 +207,7 @@ describe('Mail: Ghostmailer', function () {
|
|||
});
|
||||
|
||||
it('should attach blog title if from or fromaddress are only email addresses', function () {
|
||||
sandbox.stub(api.settings.cache, 'get').returns('Test');
|
||||
sandbox.stub(settingsCache, 'get').returns('Test');
|
||||
|
||||
// from and fromaddress are both set
|
||||
configUtils.set({mail: {from: 'from@default.com', fromaddress: 'fa@default.com'}});
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
var should = require('should'),
|
||||
sinon = require('sinon'),
|
||||
getContextObject = require('../../../server/data/meta/context_object.js'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('getContextObject', function () {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
var sinon = require('sinon'),
|
||||
should = require('should'),
|
||||
getTitle = require('../../../server/data/meta/title'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
should.equal(true, true);
|
||||
|
|
|
@ -2,7 +2,7 @@ var sinon = require('sinon'),
|
|||
should = require('should'),
|
||||
express = require('express'),
|
||||
serveFavicon = require('../../../server/middleware/serve-favicon'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
configUtils = require('../../utils/configUtils'),
|
||||
path = require('path'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
|
|
@ -6,6 +6,7 @@ var should = require('should'),
|
|||
testUtils = require('../utils'),
|
||||
channelConfig = require('../../server/controllers/frontend/channel-config'),
|
||||
api = require('../../server/api'),
|
||||
settingsCache = require('../../server/settings/cache'),
|
||||
rss = rewire('../../server/data/xml/rss'),
|
||||
configUtils = require('../utils/configUtils');
|
||||
|
||||
|
@ -303,7 +304,7 @@ describe('RSS', function () {
|
|||
set: sinon.stub()
|
||||
};
|
||||
|
||||
sandbox.stub(api.settings.cache, 'get', function (key) {
|
||||
sandbox.stub(settingsCache, 'get', function (key) {
|
||||
var obj = {
|
||||
title: 'Test',
|
||||
description: 'Some Text',
|
||||
|
|
|
@ -4,7 +4,7 @@ var should = require('should'),
|
|||
utils = require('./utils'),
|
||||
configUtils = require('../../utils/configUtils'),
|
||||
helpers = require('../../../server/helpers'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
sandbox = sinon.sandbox.create(),
|
||||
handlebars = hbs.handlebars;
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ var should = require('should'),
|
|||
helpers = require('../../../server/helpers'),
|
||||
api = require('../../../server/api'),
|
||||
labs = require('../../../server/utils/labs'),
|
||||
settingsCache = api.settings.cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
handlebars = hbs.handlebars,
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ var should = require('should'),
|
|||
handlebars = hbs.handlebars,
|
||||
sandbox = sinon.sandbox.create(),
|
||||
helpers = require('../../../server/helpers'),
|
||||
settingsCache = require('../../../server/api/settings').cache;
|
||||
settingsCache = require('../../../server/settings/cache');
|
||||
|
||||
describe('{{meta_description}} helper', function () {
|
||||
before(function () {
|
||||
|
|
|
@ -6,7 +6,7 @@ var should = require('should'),
|
|||
handlebars = hbs.handlebars,
|
||||
sandbox = sinon.sandbox.create(),
|
||||
helpers = require('../../../server/helpers'),
|
||||
settingsCache = require('../../../server/api/settings').cache;
|
||||
settingsCache = require('../../../server/settings/cache');
|
||||
|
||||
describe('{{meta_title}} helper', function () {
|
||||
before(function () {
|
||||
|
|
|
@ -4,7 +4,7 @@ var should = require('should'),
|
|||
moment = require('moment'),
|
||||
sinon = require('sinon'),
|
||||
utils = require('../../../server/utils'),
|
||||
settingsCache = require('../../../server/api/settings').cache,
|
||||
settingsCache = require('../../../server/settings/cache'),
|
||||
configUtils = require('../../utils/configUtils'),
|
||||
testUtils = require('../../utils'),
|
||||
sandbox = sinon.sandbox.create(),
|
||||
|
|
|
@ -12,7 +12,7 @@ var Promise = require('bluebird'),
|
|||
db = require('../../server/data/db'),
|
||||
fixtureUtils = require('../../server/data/schema/fixtures/utils'),
|
||||
models = require('../../server/models'),
|
||||
SettingsAPI = require('../../server/api/settings'),
|
||||
SettingsLib = require('../../server/settings'),
|
||||
permissions = require('../../server/permissions'),
|
||||
sequence = require('../../server/utils/sequence'),
|
||||
themes = require('../../server/themes'),
|
||||
|
@ -434,9 +434,7 @@ toDoList = {
|
|||
'posts:mu': function insertMultiAuthorPosts() { return fixtures.insertMultiAuthorPosts(); },
|
||||
tags: function insertMoreTags() { return fixtures.insertMoreTags(); },
|
||||
apps: function insertApps() { return fixtures.insertApps(); },
|
||||
settings: function populateSettings() {
|
||||
return models.Settings.populateDefaults().then(function () { return SettingsAPI.updateSettingsCache(); });
|
||||
},
|
||||
settings: function populateSettings() { return SettingsLib.init(); },
|
||||
'users:roles': function createUsersWithRoles() { return fixtures.createUsersWithRoles(); },
|
||||
'users:no-owner': function createUsersWithoutOwner() { return fixtures.createUsersWithoutOwner(); },
|
||||
users: function createExtraUsers() { return fixtures.createExtraUsers(); },
|
||||
|
|
Loading…
Add table
Reference in a new issue