diff --git a/app.js b/app.js index 9dc64f6f05..0234f99fc1 100755 --- a/app.js +++ b/app.js @@ -108,9 +108,9 @@ ghost.app().get('/api/v0.1/posts/:id', authAPI, api.requestHandler(api.posts.read)); ghost.app().put('/api/v0.1/posts/:id', authAPI, api.requestHandler(api.posts.edit)); ghost.app().del('/api/v0.1/posts/:id', authAPI, api.requestHandler(api.posts.destroy)); - ghost.app().get('/api/v0.1/settings', authAPI, api.requestHandler(api.settings.browse)); - ghost.app().get('/api/v0.1/settings/:key', authAPI, api.requestHandler(api.settings.read)); - ghost.app().put('/api/v0.1/settings', authAPI, api.requestHandler(api.settings.edit)); + ghost.app().get('/api/v0.1/settings', authAPI, api.cachedSettingsRequestHandler(api.settings.browse)); + ghost.app().get('/api/v0.1/settings/:key', authAPI, api.cachedSettingsRequestHandler(api.settings.read)); + ghost.app().put('/api/v0.1/settings', authAPI, api.cachedSettingsRequestHandler(api.settings.edit)); /** * Admin routes.. diff --git a/core/ghost.js b/core/ghost.js index 79633432f3..341bd92c0e 100644 --- a/core/ghost.js +++ b/core/ghost.js @@ -87,8 +87,6 @@ // load Plugins... // var f = new FancyFirstChar(ghost).init(); - - _.extend(instance, { app: function () { return app; }, config: function () { return config; }, @@ -125,6 +123,19 @@ var self = this; return when.join(instance.dataProvider.init(), instance.getPaths()).then(function () { + return self.updateSettingsCache(); + }, errors.logAndThrowError); + }; + + + Ghost.prototype.updateSettingsCache = function (settings) { + var self = this; + + settings = settings || {}; + + if (!_.isEmpty(settings)) { + self.settingsCache = settings; + } else { // TODO: this should use api.browse return models.Settings.findAll().then(function (result) { var settings = {}; @@ -136,7 +147,7 @@ self.settingsCache = settings; }, errors.logAndThrowError); - }, errors.logAndThrowError); + } }; /** diff --git a/core/shared/api.js b/core/shared/api.js index 0e0a3f407c..69f7cc94df 100644 --- a/core/shared/api.js +++ b/core/shared/api.js @@ -11,6 +11,8 @@ var Ghost = require('../ghost'), _ = require('underscore'), + when = require('when'), + errors = require('./errorHandling'), ghost = new Ghost(), dataProvider = ghost.dataProvider, @@ -18,6 +20,7 @@ users, settings, requestHandler, + cachedSettingsRequestHandler, settingsObject, settingsCollection; @@ -25,37 +28,37 @@ posts = { // takes filter / pagination parameters // returns a page of posts in a json response - browse: function (options) { + browse: function browse(options) { return dataProvider.Post.findPage(options); }, // takes an identifier (id or slug?) // returns a single post in a json response - read: function (args) { + read: function read(args) { return dataProvider.Post.findOne(args); }, // takes a json object with all the properties which should be updated // returns the resulting post in a json response - edit: function (postData) { + edit: function edit(postData) { return dataProvider.Post.edit(postData); }, // takes a json object representing a post, // returns the resulting post in a json response - add: function (postData) { + add: function add(postData) { return dataProvider.Post.add(postData); }, // takes an identifier (id or slug?) // returns a json response with the id of the deleted post - destroy: function (args) { + destroy: function destroy(args) { return dataProvider.Post.destroy(args.id); } }; // # Users users = { - add: function (postData) { + add: function add(postData) { return dataProvider.User.add(postData); }, - check: function (postData) { + check: function check(postData) { return dataProvider.User.check(postData); } }; @@ -78,21 +81,17 @@ }; settings = { - browse: function (options) { + browse: function browse(options) { return dataProvider.Settings.browse(options).then(settingsObject); }, - read: function (options) { + read: function read(options) { return dataProvider.Settings.read(options.key).then(function (setting) { return _.pick(setting.toJSON(), 'key', 'value'); }); }, - edit: function (settings) { + edit: function edit(settings) { settings = settingsCollection(settings); return dataProvider.Settings.edit(settings).then(settingsObject); - }, - add: function (settings) { - settings = settingsCollection(settings); - return dataProvider.Settings.add(settings).then(settingsObject); } }; @@ -114,8 +113,42 @@ }; }; + cachedSettingsRequestHandler = function (apiMethod) { + if (!ghost.settings()) { + return requestHandler(apiMethod); + } + + return function (req, res) { + var options = _.extend(req.body, req.query, req.params), + promise; + + switch (apiMethod.name) { + case 'browse': + promise = when(ghost.settings()); + break; + case 'read': + promise = when(ghost.settings()[options.key]); + break; + case 'edit': + promise = apiMethod(options).then(function (result) { + ghost.updateSettingsCache(result); + return result; + }); + break; + default: + errors.logAndThrowError(new Error('Unknown method name for settings API: ' + apiMethod.name)); + } + return promise.then(function (result) { + res.json(result || {}); + }, function (error) { + res.json(400, {error: error}); + }); + }; + }; + module.exports.posts = posts; module.exports.users = users; module.exports.settings = settings; module.exports.requestHandler = requestHandler; + module.exports.cachedSettingsRequestHandler = cachedSettingsRequestHandler; }()); \ No newline at end of file diff --git a/core/test/ghost/ghost_spec.js b/core/test/ghost/ghost_spec.js index 84c27b1a85..f02282e9c6 100644 --- a/core/test/ghost/ghost_spec.js +++ b/core/test/ghost/ghost_spec.js @@ -27,19 +27,19 @@ } }, dataProviderInitSpy = sinon.spy(fakeDataProvider, "init"), - oldDataProvder = ghost.dataProvider; + oldDataProvider = ghost.dataProvider; ghost.dataProvider = fakeDataProvider; - should.not.exist(ghost.globals()); + should.not.exist(ghost.settings()); ghost.init().then(function () { - should.exist(ghost.globals()); + should.exist(ghost.settings()); dataProviderInitSpy.called.should.equal(true); - ghost.dataProvider = oldDataProvder; + ghost.dataProvider = oldDataProvider; done(); }).then(null, done);