diff --git a/core/server/api/configuration.js b/core/server/api/configuration.js index 00d33d4a9d..cd20146112 100644 --- a/core/server/api/configuration.js +++ b/core/server/api/configuration.js @@ -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'), diff --git a/core/server/api/settings.js b/core/server/api/settings.js index 22636d207a..cf03c26ccd 100644 --- a/core/server/api/settings.js +++ b/core/server/api/settings.js @@ -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; diff --git a/core/server/api/themes.js b/core/server/api/themes.js index 88a3e28ee5..0afb11e3ef 100644 --- a/core/server/api/themes.js +++ b/core/server/api/themes.js @@ -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) { diff --git a/core/server/apps/amp/lib/router.js b/core/server/apps/amp/lib/router.js index 335e986f14..4e0cdbbe40 100644 --- a/core/server/apps/amp/lib/router.js +++ b/core/server/apps/amp/lib/router.js @@ -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'); diff --git a/core/server/controllers/frontend/fetch-data.js b/core/server/controllers/frontend/fetch-data.js index 4d6a118abc..03f01b0005 100644 --- a/core/server/controllers/frontend/fetch-data.js +++ b/core/server/controllers/frontend/fetch-data.js @@ -5,7 +5,7 @@ var api = require('../../api'), _ = require('lodash'), Promise = require('bluebird'), - settingsCache = api.settings.cache, + settingsCache = require('../../settings/cache'), queryDefaults, defaultPostQuery = {}; diff --git a/core/server/controllers/frontend/post-lookup.js b/core/server/controllers/frontend/post-lookup.js index f73dc020d9..09f8b0e8fe 100644 --- a/core/server/controllers/frontend/post-lookup.js +++ b/core/server/controllers/frontend/post-lookup.js @@ -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) { diff --git a/core/server/data/meta/asset_url.js b/core/server/data/meta/asset_url.js index b5b8871c13..9fa0b775bb 100644 --- a/core/server/data/meta/asset_url.js +++ b/core/server/data/meta/asset_url.js @@ -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) { diff --git a/core/server/data/meta/context_object.js b/core/server/data/meta/context_object.js index 0407fd1db2..eaeae28706 100644 --- a/core/server/data/meta/context_object.js +++ b/core/server/data/meta/context_object.js @@ -1,4 +1,4 @@ -var settingsCache = require('../../api/settings').cache, +var settingsCache = require('../../settings/cache'), _ = require('lodash'); function getContextObject(data, context) { diff --git a/core/server/data/meta/description.js b/core/server/data/meta/description.js index fc9e8901c7..d40e0da290 100644 --- a/core/server/data/meta/description.js +++ b/core/server/data/meta/description.js @@ -1,5 +1,5 @@ var _ = require('lodash'), - settingsCache = require('../../api/settings').cache; + settingsCache = require('../../settings/cache'); function getDescription(data, root) { var description = '', diff --git a/core/server/data/meta/index.js b/core/server/data/meta/index.js index 798eb5660e..7a2c5b3be2 100644 --- a/core/server/data/meta/index.js +++ b/core/server/data/meta/index.js @@ -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'), diff --git a/core/server/data/meta/title.js b/core/server/data/meta/title.js index 2ca6e4d80e..5565ec8c4c 100644 --- a/core/server/data/meta/title.js +++ b/core/server/data/meta/title.js @@ -1,5 +1,5 @@ var _ = require('lodash'), - settingsCache = require('../../api/settings').cache; + settingsCache = require('../../settings/cache'); function getTitle(data, root) { var title = '', diff --git a/core/server/data/xml/rss/index.js b/core/server/data/xml/rss/index.js index 10c3ec0a4b..ea337c4d15 100644 --- a/core/server/data/xml/rss/index.js +++ b/core/server/data/xml/rss/index.js @@ -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'), diff --git a/core/server/helpers/ghost_head.js b/core/server/helpers/ghost_head.js index 7d365295fc..9196fb1c45 100644 --- a/core/server/helpers/ghost_head.js +++ b/core/server/helpers/ghost_head.js @@ -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) { diff --git a/core/server/index.js b/core/server/index.js index f866f25c41..57be680aff 100644 --- a/core/server/index.js +++ b/core/server/index.js @@ -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) { diff --git a/core/server/mail/GhostMailer.js b/core/server/mail/GhostMailer.js index 8ec1b78166..9e0513ac94 100644 --- a/core/server/mail/GhostMailer.js +++ b/core/server/mail/GhostMailer.js @@ -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'); diff --git a/core/server/middleware/serve-favicon.js b/core/server/middleware/serve-favicon.js index 51451d1a22..ea6edf3f0c 100644 --- a/core/server/middleware/serve-favicon.js +++ b/core/server/middleware/serve-favicon.js @@ -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, diff --git a/core/server/middleware/theme-handler.js b/core/server/middleware/theme-handler.js index 9d59f3e103..2426594dcb 100644 --- a/core/server/middleware/theme-handler.js +++ b/core/server/middleware/theme-handler.js @@ -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'), diff --git a/core/server/models/settings.js b/core/server/models/settings.js index d84dd2ed74..ad0570301c 100644 --- a/core/server/models/settings.js +++ b/core/server/models/settings.js @@ -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 || {}; diff --git a/core/server/settings/cache.js b/core/server/settings/cache.js new file mode 100644 index 0000000000..7ff7f15e87 --- /dev/null +++ b/core/server/settings/cache.js @@ -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; + } +}; diff --git a/core/server/settings/index.js b/core/server/settings/index.js new file mode 100644 index 0000000000..306019eff4 --- /dev/null +++ b/core/server/settings/index.js @@ -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(); + }); + } +}; diff --git a/core/server/themes/loader.js b/core/server/themes/loader.js index 38ff7f67e3..552a76d08a 100644 --- a/core/server/themes/loader.js +++ b/core/server/themes/loader.js @@ -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); }; diff --git a/core/server/utils/labs.js b/core/server/utils/labs.js index b7ac182d27..d5b04ae2a3 100644 --- a/core/server/utils/labs.js +++ b/core/server/utils/labs.js @@ -1,4 +1,4 @@ -var settingsCache = require('../api/settings').cache, +var settingsCache = require('../settings/cache'), flagIsSet; flagIsSet = function flagIsSet(flag) { diff --git a/core/server/utils/url.js b/core/server/utils/url.js index 3c23c3acb8..a65e6ab984 100644 --- a/core/server/utils/url.js +++ b/core/server/utils/url.js @@ -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'; diff --git a/core/test/functional/routes/frontend_spec.js b/core/test/functional/routes/frontend_spec.js index 83d9f589b5..b526b25dd9 100644 --- a/core/test/functional/routes/frontend_spec.js +++ b/core/test/functional/routes/frontend_spec.js @@ -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)); diff --git a/core/test/integration/api/api_posts_spec.js b/core/test/integration/api/api_posts_spec.js index 164ae283b2..9aceb58732 100644 --- a/core/test/integration/api/api_posts_spec.js +++ b/core/test/integration/api/api_posts_spec.js @@ -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 () { diff --git a/core/test/integration/api/api_settings_spec.js b/core/test/integration/api/api_settings_spec.js index 0ddd2d7a15..f5b5ff7abc 100644 --- a/core/test/integration/api/api_settings_spec.js +++ b/core/test/integration/api/api_settings_spec.js @@ -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'); }); }); diff --git a/core/test/integration/model/model_posts_spec.js b/core/test/integration/model/model_posts_spec.js index b667a73259..284ddcb351 100644 --- a/core/test/integration/model/model_posts_spec.js +++ b/core/test/integration/model/model_posts_spec.js @@ -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, diff --git a/core/test/unit/controllers/frontend/fetch-data_spec.js b/core/test/unit/controllers/frontend/fetch-data_spec.js index 62b3c796c1..71ba2c0041 100644 --- a/core/test/unit/controllers/frontend/fetch-data_spec.js +++ b/core/test/unit/controllers/frontend/fetch-data_spec.js @@ -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) { diff --git a/core/test/unit/controllers/frontend/index_spec.js b/core/test/unit/controllers/frontend/index_spec.js index 6ad27e7391..cc1546c91c 100644 --- a/core/test/unit/controllers/frontend/index_spec.js +++ b/core/test/unit/controllers/frontend/index_spec.js @@ -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 () { diff --git a/core/test/unit/controllers/frontend/post-lookup_spec.js b/core/test/unit/controllers/frontend/post-lookup_spec.js index df05b7e987..07b26cf8ee 100644 --- a/core/test/unit/controllers/frontend/post-lookup_spec.js +++ b/core/test/unit/controllers/frontend/post-lookup_spec.js @@ -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 () { diff --git a/core/test/unit/mail/GhostMailer_spec.js b/core/test/unit/mail/GhostMailer_spec.js index d11e09ec8a..3074b2b438 100644 --- a/core/test/unit/mail/GhostMailer_spec.js +++ b/core/test/unit/mail/GhostMailer_spec.js @@ -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] ', 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'}}); diff --git a/core/test/unit/metadata/context_object_spec.js b/core/test/unit/metadata/context_object_spec.js index 0f6cf4ddce..ebde69975c 100644 --- a/core/test/unit/metadata/context_object_spec.js +++ b/core/test/unit/metadata/context_object_spec.js @@ -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 () { diff --git a/core/test/unit/metadata/title_spec.js b/core/test/unit/metadata/title_spec.js index ae62644f3c..f9c7a5d0fa 100644 --- a/core/test/unit/metadata/title_spec.js +++ b/core/test/unit/metadata/title_spec.js @@ -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); diff --git a/core/test/unit/middleware/serve-favicon_spec.js b/core/test/unit/middleware/serve-favicon_spec.js index 650bfdf640..77db328ac3 100644 --- a/core/test/unit/middleware/serve-favicon_spec.js +++ b/core/test/unit/middleware/serve-favicon_spec.js @@ -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(); diff --git a/core/test/unit/rss_spec.js b/core/test/unit/rss_spec.js index ae91a344b9..e6f4f52f01 100644 --- a/core/test/unit/rss_spec.js +++ b/core/test/unit/rss_spec.js @@ -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', diff --git a/core/test/unit/server_helpers/asset_spec.js b/core/test/unit/server_helpers/asset_spec.js index b27a55ff43..b5ecebacef 100644 --- a/core/test/unit/server_helpers/asset_spec.js +++ b/core/test/unit/server_helpers/asset_spec.js @@ -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; diff --git a/core/test/unit/server_helpers/ghost_head_spec.js b/core/test/unit/server_helpers/ghost_head_spec.js index 8a706527ef..461ad905ab 100644 --- a/core/test/unit/server_helpers/ghost_head_spec.js +++ b/core/test/unit/server_helpers/ghost_head_spec.js @@ -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(); diff --git a/core/test/unit/server_helpers/meta_description_spec.js b/core/test/unit/server_helpers/meta_description_spec.js index 294e74cfae..82d36bbb70 100644 --- a/core/test/unit/server_helpers/meta_description_spec.js +++ b/core/test/unit/server_helpers/meta_description_spec.js @@ -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 () { diff --git a/core/test/unit/server_helpers/meta_title_spec.js b/core/test/unit/server_helpers/meta_title_spec.js index 809e657917..7899724c2d 100644 --- a/core/test/unit/server_helpers/meta_title_spec.js +++ b/core/test/unit/server_helpers/meta_title_spec.js @@ -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 () { diff --git a/core/test/unit/utils/url_spec.js b/core/test/unit/utils/url_spec.js index 8a2b8f5264..b76943f1dc 100644 --- a/core/test/unit/utils/url_spec.js +++ b/core/test/unit/utils/url_spec.js @@ -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(), diff --git a/core/test/utils/index.js b/core/test/utils/index.js index f4f904d1c0..3d4786145e 100644 --- a/core/test/utils/index.js +++ b/core/test/utils/index.js @@ -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(); },