diff --git a/core/shared/api.js b/core/shared/api.js
index 6c15dfe9ef..db32e6f835 100644
--- a/core/shared/api.js
+++ b/core/shared/api.js
@@ -16,6 +16,7 @@
ghost = new Ghost(),
posts,
users,
+ settings,
requestHandler;
// # Posts
@@ -56,9 +57,22 @@
return when.call(ghost.dataProvider().users.check, postData);
}
};
-// settings: {},
-// categories: {},
-// post_categories: {}
+
+ // # Settings
+ settings = {
+ browse: function (options) {
+ return when.call(ghost.dataProvider().settings.browse, options);
+ },
+ read: function (options) {
+ return when.call(ghost.dataProvider().settings.read, options.key);
+ },
+ edit: function (options) {
+ return when.call(ghost.dataProvider().settings.edit, options);
+ }
+ };
+
+ // categories: {};
+ // post_categories: {};
// requestHandler
@@ -78,5 +92,6 @@
module.exports.posts = posts;
module.exports.users = users;
+ module.exports.settings = settings;
module.exports.requestHandler = requestHandler;
}());
\ No newline at end of file
diff --git a/core/shared/models/dataProvider.bookshelf.js b/core/shared/models/dataProvider.bookshelf.js
index a42a145e2e..5abc72d18e 100644
--- a/core/shared/models/dataProvider.bookshelf.js
+++ b/core/shared/models/dataProvider.bookshelf.js
@@ -9,6 +9,8 @@
var knex = require('./knex_init'),
models = require('./models'),
bcrypt = require('bcrypt'),
+ when = require("when"),
+ _ = require("underscore"),
DataProvider,
instance;
@@ -123,5 +125,30 @@
});
};
+ // ## Settings
+ DataProvider.prototype.settings = function () { };
+
+ DataProvider.prototype.settings.browse = function (_args, callback) {
+ models.Settings.forge(_args).fetch().then(function (settings) {
+ callback(null, settings);
+ }, callback);
+ };
+
+ DataProvider.prototype.settings.read = function (_key, callback) {
+ models.Setting.forge({ key: _key }).fetch().then(function (setting) {
+ callback(null, setting);
+ }, callback);
+ };
+
+ DataProvider.prototype.settings.edit = function (_data, callback) {
+ when.all(_.map(_data, function (value, key) {
+ return models.Setting.forge({ key: key }).fetch().then(function (setting) {
+ return setting.set('value', value).save();
+ });
+ })).then(function (settings) {
+ callback(null, settings);
+ }, callback);
+ };
+
module.exports = DataProvider;
}());
\ No newline at end of file
diff --git a/core/shared/models/models.js b/core/shared/models/models.js
index 6592ce54c8..56dcabd16d 100644
--- a/core/shared/models/models.js
+++ b/core/shared/models/models.js
@@ -12,7 +12,8 @@
Post,
Posts,
User,
- Setting;
+ Setting,
+ Settings;
Post = Bookshelf.Model.extend({
@@ -68,15 +69,19 @@
});
Setting = Bookshelf.Model.extend({
+ tableName: 'settings',
+ hasTimestamps: true
+ });
- tableName: 'settings'
-
+ Settings = Bookshelf.Collection.extend({
+ model: Setting
});
module.exports = {
Post: Post,
Posts: Posts,
User: User,
- Setting: Setting
+ Setting: Setting,
+ Settings: Settings
};
}());
\ No newline at end of file
diff --git a/core/test/ghost/test-api.js b/core/test/ghost/test-api.js
new file mode 100644
index 0000000000..0ec5225f46
--- /dev/null
+++ b/core/test/ghost/test-api.js
@@ -0,0 +1,64 @@
+/*global require, module */
+(function () {
+ "use strict";
+
+ // Use 'testing' Ghost config
+ process.env.NODE_ENV = 'testing';
+
+ var fs = require('fs'),
+ path = require('path'),
+ _ = require('underscore'),
+ assert = require('assert'),
+ delay = require('when/delay'),
+ config = require('../../../config'),
+ fixtures = require('../../shared/data/fixtures/001'),
+ api;
+
+ function fail(err) {
+ process.nextTick(function () {
+ assert.ifError(err);
+ });
+ }
+
+ module.exports = {
+ setUp: function (done) {
+ // Clear database
+ var dbpath = path.resolve(__dirname, '../../../', config.database.testing.connection.filename);
+ fs.unlink(dbpath, function () {
+ // There is currently no way to tell when Ghost is loaded. api instantiates it's own `Ghost`
+ // which will run migrations without making the promise externally accessible
+ api = require('../../shared/api');
+ // So we just sit for a while :/
+ setTimeout(done, 3000);
+ });
+ },
+
+ 'settings:browse': function (test) {
+ test.expect(1);
+ api.settings.browse().then(function (settings) {
+ settings = _.map(settings.toJSON(), function (item) {
+ return _.omit(item, 'id', 'updated_at', 'created_at');
+ });
+ test.deepEqual(settings, fixtures.settings);
+ test.done();
+ }).then(null, fail);
+ },
+
+ 'settings:read': function (test) {
+ api.settings.read('title', function (setting) {
+ test.done();
+ }).then(null, fail);
+ },
+
+ 'settings:edit': function (test) {
+ test.expect(2);
+ api.settings.edit('title', "Jenna O'Neil").then(function (title) {
+ title = title.toJSON();
+ test.equal(title.key, 'title');
+ test.equal(title.value, "Jenna O'Neil");
+ test.done();
+ }).then(null, fail);
+ }
+ };
+
+}());
\ No newline at end of file