From a204a96cdabf36b8f466c681846d75ec463027f6 Mon Sep 17 00:00:00 2001 From: Tim Griesser Date: Mon, 27 May 2013 13:24:14 -0400 Subject: [PATCH 1/4] a bit of organizing/simplifying/fattening the models --- config.js | 10 ++ core/frontend/controllers/index.js | 4 +- core/ghost.js | 16 +-- core/shared/api.js | 23 +-- core/shared/data/migration/001.js | 3 +- core/shared/models/base.js | 98 +++++++++++++ .../models/dataProvider.bookshelf.base.js | 74 ---------- core/shared/models/dataProvider.bookshelf.js | 39 ----- .../models/dataProvider.bookshelf.posts.js | 91 ------------ .../models/dataProvider.bookshelf.settings.js | 37 ----- .../models/dataProvider.bookshelf.users.js | 59 -------- core/shared/models/dataProvider.json.js | 51 ------- core/shared/models/index.js | 26 ++++ core/shared/models/knex_init.js | 11 -- core/shared/models/models.js | 95 ------------- core/shared/models/post.js | 134 ++++++++++++++++++ core/shared/models/setting.js | 46 ++++++ core/shared/models/user.js | 72 ++++++++++ core/test/ghost/api_posts_spec.js | 34 +++-- core/test/ghost/api_settings_spec.js | 31 ++-- core/test/ghost/api_users_spec.js | 27 ++-- core/test/ghost/dataProvider.json_spec.js | 20 --- core/test/ghost/helpers.js | 2 +- 23 files changed, 449 insertions(+), 554 deletions(-) create mode 100644 core/shared/models/base.js delete mode 100644 core/shared/models/dataProvider.bookshelf.base.js delete mode 100644 core/shared/models/dataProvider.bookshelf.js delete mode 100644 core/shared/models/dataProvider.bookshelf.posts.js delete mode 100644 core/shared/models/dataProvider.bookshelf.settings.js delete mode 100644 core/shared/models/dataProvider.bookshelf.users.js delete mode 100644 core/shared/models/dataProvider.json.js create mode 100644 core/shared/models/index.js delete mode 100644 core/shared/models/knex_init.js delete mode 100644 core/shared/models/models.js create mode 100644 core/shared/models/post.js create mode 100644 core/shared/models/setting.js create mode 100644 core/shared/models/user.js delete mode 100644 core/test/ghost/dataProvider.json_spec.js diff --git a/config.js b/config.js index 5e6813f00a..6d4551e57e 100644 --- a/config.js +++ b/config.js @@ -76,6 +76,16 @@ production: {} }; + config.globals = { + + url: 'http://localhost:3333', //'http://john.onolan.org', + + title: "John O'Nolan", + + description: "Interactive designer, public speaker, startup advisor and writer. Living in Austria, attempting world domination via keyboard." + + }; + /** * @property {Object} exports */ diff --git a/core/frontend/controllers/index.js b/core/frontend/controllers/index.js index cf42783778..69a96044d2 100644 --- a/core/frontend/controllers/index.js +++ b/core/frontend/controllers/index.js @@ -16,14 +16,14 @@ 'homepage': function (req, res) { api.posts.browse().then(function (posts) { ghost.doFilter('prePostsRender', posts.toJSON(), function (posts) { - res.render('index', {posts: posts, ghostGlobals: ghost.globals()}); + res.render('index', {posts: posts, ghostGlobals: ghost.globalConfig}); }); }); }, 'single': function (req, res) { api.posts.read({'slug': req.params.slug}).then(function (post) { ghost.doFilter('prePostsRender', post.toJSON(), function (post) { - res.render('single', {post: post, ghostGlobals: ghost.globals()}); + res.render('single', {post: post, ghostGlobals: ghost.globalConfig}); }); }); } diff --git a/core/ghost.js b/core/ghost.js index a38c99f061..ebb9553d0c 100644 --- a/core/ghost.js +++ b/core/ghost.js @@ -12,11 +12,7 @@ hbs = require('express-hbs'), _ = require('underscore'), Polyglot = require('node-polyglot'), - - JsonDataProvider = require('./shared/models/dataProvider.json'), - jsonDataProvider = new JsonDataProvider(), - BookshelfDataProvider = require('./shared/models/dataProvider.bookshelf'), - bookshelfDataProvider = new BookshelfDataProvider(), + models = require('./shared/models'), Ghost, instance, filterCallbacks = {}, @@ -44,17 +40,11 @@ */ Ghost = function () { var app, - globals, polyglot; if (!instance) { instance = this; - // Temporary loading of settings - jsonDataProvider.globals.findAll(function (error, data) { - globals = data; - }); - app = express(); polyglot = new Polyglot(); @@ -66,8 +56,8 @@ _.extend(instance, { app: function () { return app; }, config: function () { return config; }, - globals: function () { return globals; }, // there's no management here to be sure this has loaded - dataProvider: function () { return bookshelfDataProvider; }, + globalConfig: config.globals, + dataProvider: models, statuses: function () { return statuses; }, polyglot: function () { return polyglot; }, paths: function () { diff --git a/core/shared/api.js b/core/shared/api.js index 98f913b81e..7959822818 100644 --- a/core/shared/api.js +++ b/core/shared/api.js @@ -13,6 +13,7 @@ _ = require('underscore'), ghost = new Ghost(), + dataProvider = ghost.dataProvider, posts, users, settings, @@ -23,56 +24,56 @@ // takes filter / pagination parameters // returns a list of posts in a json response browse: function (options) { - return ghost.dataProvider().posts.findAll(options); + return dataProvider.Post.findAll(options); }, // takes an identifier (id or slug?) // returns a single post in a json response read: function (args) { - return ghost.dataProvider().posts.findOne(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) { - return ghost.dataProvider().posts.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) { - return ghost.dataProvider().posts.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) { - return ghost.dataProvider().posts.destroy(args.id); + return dataProvider.Post.destroy(args.id); } }; // # Users users = { add: function (postData) { - return ghost.dataProvider().users.add(postData); + return dataProvider.Users.add(postData); }, check: function (postData) { - return ghost.dataProvider().users.check(postData); + return dataProvider.Users.check(postData); } }; // # Settings settings = { browse: function (options) { - return ghost.dataProvider().settings.browse(options); + return dataProvider.Settings.browse(options); }, read: function (options) { - return ghost.dataProvider().settings.read(options.key); + return dataProvider.Settings.read(options.key); }, edit: function (options) { - return ghost.dataProvider().settings.edit(options); + return dataProvider.Settings.edit(options); } }; // categories: {}; - // post_categories: {}; + // post_categories: {}; // requestHandler // decorator for api functions which are called via an HTTP request diff --git a/core/shared/data/migration/001.js b/core/shared/data/migration/001.js index 86630a1575..de0e7a14c6 100644 --- a/core/shared/data/migration/001.js +++ b/core/shared/data/migration/001.js @@ -3,9 +3,8 @@ (function () { "use strict"; - var when = require('when'), - knex = require('../../models/knex_init'), + knex = require('../../models/base').Knex, fixtures = require('../fixtures/001'), up, down; diff --git a/core/shared/models/base.js b/core/shared/models/base.js new file mode 100644 index 0000000000..c703666245 --- /dev/null +++ b/core/shared/models/base.js @@ -0,0 +1,98 @@ +(function () { + + "use strict"; + + var _ = require('underscore'), + GhostBookshelf, + BookshelfBase, + Bookshelf = require('bookshelf'), + config = require('../../../config'); + + // Initializes Bookshelf as its own instance, so we can modify the Models and not mess up + // others' if they're using the library outside of ghost. + GhostBookshelf = Bookshelf.Initialize('ghost', config.database[process.env.NODE_ENV || 'development']); + + // The Base Model which other Ghost objects will inherit from, + // including some convenience functions as static properties on the model. + GhostBookshelf.Model = GhostBookshelf.Model.extend({ + + // Base prototype properties will go here + + }, { + + /** + * Naive find all + * @param options (optional) + */ + findAll: function (options) { + options = options || {}; + return GhostBookshelf.Collection.forge([], {model: this}).fetch(options); + }, + + browse: function () { + return this.findAll.apply(this, arguments); + }, + + /** + * Naive find one where args match + * @param args + * @param options (optional) + */ + findOne: function (args, options) { + options = options || {}; + return this.forge(args).fetch(options); + }, + + read: function () { + return this.findOne.apply(this, arguments); + }, + + /** + * Naive edit + * @param editedObj + * @param options (optional) + */ + edit: function (editedObj, options) { + options = options || {}; + return this.forge({id: editedObj.id}).fetch(options).then(function (foundObj) { + return foundObj.set(editedObj).save(); + }); + }, + + update: function () { + return this.edit.apply(this, arguments); + }, + + /** + * Naive create + * @param editedObj + * @param options (optional) + */ + add: function (newObj, options) { + options = options || {}; + return this.forge(newObj).save(options); + }, + + create: function () { + return this.add.apply(this, arguments); + }, + + /** + * Naive destroy + * @param _identifier + * @param options (optional) + */ + destroy: function (_identifier, options) { + options = options || {}; + return this.forge({id: _identifier}).destroy(options); + }, + + 'delete': function () { + return this.destroy.apply(this, arguments); + } + + }); + + module.exports = GhostBookshelf; + +}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.bookshelf.base.js b/core/shared/models/dataProvider.bookshelf.base.js deleted file mode 100644 index 6f44c41771..0000000000 --- a/core/shared/models/dataProvider.bookshelf.base.js +++ /dev/null @@ -1,74 +0,0 @@ -/*global require, module */ -(function () { - "use strict"; - - var _ = require('underscore'), - BookshelfBase; - - /** - * The base class for interacting with bookshelf models/collections. - * Provides naive implementations of CRUD/BREAD operations. - */ - BookshelfBase = function (model, collection) { - // Bind the 'this' value for all our functions since they get messed - // up by the when.call - _.bindAll(this, 'findAll', 'browse', 'findOne', 'read', 'edit', 'add', 'destroy'); - - this.model = model; - this.collection = collection; - }; - - /** - * Naive find all - * @param args (optional) - * @param opts (optional) - */ - BookshelfBase.prototype.findAll = BookshelfBase.prototype.browse = function (opts) { - opts = opts || {}; - return this.collection.forge().fetch(opts); - }; - - /** - * Naive find one where args match - * @param args - * @param opts (optional) - */ - BookshelfBase.prototype.findOne = BookshelfBase.prototype.read = function (args, opts) { - opts = opts || {}; - return this.model.forge(args).fetch(opts); - }; - - /** - * Naive edit - * @param editedObj - * @param opts (optional) - */ - BookshelfBase.prototype.edit = BookshelfBase.prototype.update = function (editedObj, opts) { - opts = opts || {}; - return this.model.forge({id: editedObj.id}).fetch(opts).then(function (foundObj) { - return foundObj.set(editedObj).save(); - }); - }; - - /** - * Naive add - * @param newObj - * @param opts (optional) - */ - BookshelfBase.prototype.add = BookshelfBase.prototype.create = function (newObj, opts) { - opts = opts || {}; - return this.model.forge(newObj).save(opts); - }; - - /** - * Naive destroy - * @param _identifier - * @param opts (optional) - */ - BookshelfBase.prototype.destroy = BookshelfBase.prototype['delete'] = function (_identifier, opts) { - opts = opts || {}; - return this.model.forge({id: _identifier}).destroy(opts); - }; - - module.exports = BookshelfBase; -}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.bookshelf.js b/core/shared/models/dataProvider.bookshelf.js deleted file mode 100644 index a4130fcaa4..0000000000 --- a/core/shared/models/dataProvider.bookshelf.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Provides access to data via the Bookshelf ORM - */ - -/*globals module, require, process */ -(function () { - "use strict"; - - var knex = require('./knex_init'), - PostsProvider = require('./dataProvider.bookshelf.posts'), - UsersProvider = require('./dataProvider.bookshelf.users'), - SettingsProvider = require('./dataProvider.bookshelf.settings'), - DataProvider, - instance; - - DataProvider = function () { - if (!instance) { - instance = this; - knex.Schema.hasTable('posts').then(null, function () { - // Simple bootstraping of the data model for now. - var migration = require('../data/migration/001'); - - return migration.down().then(function () { - return migration.up(); - }); - }).then(function () { - console.log('all done....'); - }); - } - - return instance; - }; - - DataProvider.prototype.posts = new PostsProvider(); - DataProvider.prototype.users = new UsersProvider(); - DataProvider.prototype.settings = new SettingsProvider(); - - module.exports = DataProvider; -}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.bookshelf.posts.js b/core/shared/models/dataProvider.bookshelf.posts.js deleted file mode 100644 index e7c02c7f7c..0000000000 --- a/core/shared/models/dataProvider.bookshelf.posts.js +++ /dev/null @@ -1,91 +0,0 @@ -(function () { - "use strict"; - - var _ = require('underscore'), - util = require('util'), - models = require('./models'), - Bookshelf = require('bookshelf'), - BaseProvider = require('./dataProvider.bookshelf.base'), - PostsProvider; - - /** - * The Posts data provider implementation for Bookshelf. - */ - PostsProvider = function () { - BaseProvider.call(this, models.Post, models.Posts); - }; - - util.inherits(PostsProvider, BaseProvider); - - /** - * Find results by page - returns an object containing the - * information about the request (page, limit), along with the - * info needed for pagination (pages, total). - * - * { - * posts: [ - * {...}, {...}, {...} - * ], - * page: __, - * limit: __, - * pages: __, - * total: __ - * } - * - * @params opts - */ - PostsProvider.prototype.findPage = function (opts) { - var postCollection; - - // Allow findPage(n) - if (!_.isObject(opts)) { - opts = {page: opts}; - } - - opts = _.defaults(opts || {}, { - page: 1, - limit: 15, - where: null - }); - postCollection = this.collection.forge(); - - // If there are where conditionals specified, add those - // to the query. - if (opts.where) { - postCollection.query('where', opts.where); - } - - // Set the limit & offset for the query, fetching - // with the opts (to specify any eager relations, etc.) - // Omitting the `page`, `limit`, `where` just to be sure - // aren't used for other purposes. - return postCollection - .query('limit', opts.limit) - .query('offset', opts.limit * (opts.page - 1)) - .fetch(_.omit(opts, 'page', 'limit', 'where')) - .then(function (collection) { - var qb; - - // After we're done, we need to figure out what - // the limits are for the pagination values. - qb = Bookshelf.Knex(_.result(collection, 'tableName')); - - if (opts.where) { - qb.where(opts.where); - } - - return qb.count(_.result(collection, 'idAttribute')).then(function (resp) { - var totalPosts = resp[0].aggregate; - return { - posts: collection.toJSON(), - page: opts.page, - limit: opts.limit, - pages: Math.ceil(totalPosts / opts.limit), - total: totalPosts - }; - }); - }); - }; - - module.exports = PostsProvider; -}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.bookshelf.settings.js b/core/shared/models/dataProvider.bookshelf.settings.js deleted file mode 100644 index e8a6538a84..0000000000 --- a/core/shared/models/dataProvider.bookshelf.settings.js +++ /dev/null @@ -1,37 +0,0 @@ -(function () { - "use strict"; - - var _ = require('underscore'), - when = require('when'), - util = require('util'), - models = require('./models'), - BaseProvider = require('./dataProvider.bookshelf.base'), - SettingsProvider; - - /** - * The Posts data provider implementation for Bookshelf. - */ - SettingsProvider = function () { - BaseProvider.call(this, models.Setting, models.Settings); - }; - - util.inherits(SettingsProvider, BaseProvider); - - SettingsProvider.prototype.read = function (_key) { - // Allow for just passing the key instead of attributes - if (_.isString(_key)) { - _key = { key: _key }; - } - return BaseProvider.prototype.read.call(this, _key); - }; - - SettingsProvider.prototype.edit = function (_data) { - return when.all(_.map(_data, function (value, key) { - return this.model.forge({ key: key }).fetch().then(function (setting) { - return setting.set('value', value).save(); - }); - }, this)); - }; - - module.exports = SettingsProvider; -}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.bookshelf.users.js b/core/shared/models/dataProvider.bookshelf.users.js deleted file mode 100644 index 6c2e2becf1..0000000000 --- a/core/shared/models/dataProvider.bookshelf.users.js +++ /dev/null @@ -1,59 +0,0 @@ -(function () { - "use strict"; - - var util = require('util'), - _ = require('underscore'), - bcrypt = require('bcrypt'), - models = require('./models.js'), - when = require('when'), - nodefn = require('when/node/function'), - BaseProvider = require('./dataProvider.bookshelf.base.js'), - UsersProvider; - - /** - * The Users data provider implementation for Bookshelf. - */ - UsersProvider = function () { - BaseProvider.call(this, models.User, models.Users); - }; - - util.inherits(UsersProvider, BaseProvider); - - /** - * Naive user add - * @param _user - * - * Hashes the password provided before saving to the database. - */ - UsersProvider.prototype.add = function (_user) { - var self = this, - // Clone the _user so we don't expose the hashed password unnecessarily - userData = _.extend({}, _user); - - return nodefn.call(bcrypt.hash, _user.password, 10).then(function (hash) { - userData.password = hash; - return BaseProvider.prototype.add.call(self, userData); - }); - }; - - /** - * User check - * @param _userdata - * - * Finds the user by email, and check's the password - */ - UsersProvider.prototype.check = function (_userdata) { - return this.model.forge({ - email_address: _userdata.email - }).fetch().then(function (user) { - return nodefn.call(bcrypt.compare, _userdata.pw, user.get('password')).then(function (matched) { - if (!matched) { - return when.reject(new Error('Password does not match')); - } - return user; - }); - }); - }; - - module.exports = UsersProvider; -}()); \ No newline at end of file diff --git a/core/shared/models/dataProvider.json.js b/core/shared/models/dataProvider.json.js deleted file mode 100644 index 993f911ffa..0000000000 --- a/core/shared/models/dataProvider.json.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Dummy dataProvider returns hardcoded JSON data until we finish migrating settings data to a datastore - */ - -/*globals module, require */ -(function () { - "use strict"; - - var _ = require('underscore'), - when = require('when'), - DataProvider, - blogData, - instance, - d; - - blogData = { - url: 'http://localhost:3333', //'http://john.onolan.org', - title: "John O'Nolan", - description: "Interactive designer, public speaker, startup advisor and writer. Living in Austria, attempting world domination via keyboard." - }; - - DataProvider = function () { - if (!instance) { - instance = this; - } - return instance; - }; - DataProvider.prototype.globals = {}; - DataProvider.prototype.globals.data = []; - - - DataProvider.prototype.globals.findAll = function () { - return when(this.data); - }; - - DataProvider.prototype.globals.save = function (globals) { - _.each(globals, function (global, key) { - this.data[key] = global; - }, this); - - return when(globals); - }; - - /* Lets bootstrap with dummy data */ - d = new DataProvider(); - d.globals.save(blogData, function (error) { - if (error) { throw error; } - }); - - module.exports = DataProvider; -}()); \ No newline at end of file diff --git a/core/shared/models/index.js b/core/shared/models/index.js new file mode 100644 index 0000000000..f52150cb8e --- /dev/null +++ b/core/shared/models/index.js @@ -0,0 +1,26 @@ +/*global require, module */ + +(function () { + "use strict"; + + var GhostBookshelf = require('./base'), + knex = GhostBookshelf.Knex; + + module.exports = { + Post: require('./post').Post, + User: require('./user').User, + Setting: require('./setting').Setting, + init: function () { + return knex.Schema.hasTable('posts').then(null, function () { + // Simple bootstraping of the data model for now. + var migration = require('../data/migration/001'); + return migration.down().then(function () { + return migration.up(); + }); + }).then(function () { + console.log('models loaded'); + }); + } + }; + +}()); \ No newline at end of file diff --git a/core/shared/models/knex_init.js b/core/shared/models/knex_init.js deleted file mode 100644 index 7a310fce4a..0000000000 --- a/core/shared/models/knex_init.js +++ /dev/null @@ -1,11 +0,0 @@ -/*global require, module, process */ -(function () { - "use strict"; - - var knex = require('knex'), - config = require('../../../config'); - - knex.Initialize(config.database[process.env.NODE_ENV || 'development']); - - module.exports = knex; -}()); \ No newline at end of file diff --git a/core/shared/models/models.js b/core/shared/models/models.js deleted file mode 100644 index 262f61d708..0000000000 --- a/core/shared/models/models.js +++ /dev/null @@ -1,95 +0,0 @@ -/*global require, module */ - -(function () { - "use strict"; - - // We should just be able to require bookshelf and have it reference - // the `Knex` instance bootstraped at the app initialization. - var Bookshelf = require('bookshelf'), - Showdown = require('showdown'), - converter = new Showdown.converter(), - - Post, - Posts, - User, - Users, - Setting, - Settings; - - Post = Bookshelf.Model.extend({ - - tableName: 'posts', - - hasTimestamps: true, - - initialize: function () { - this.on('creating', this.creating, this); - this.on('saving', this.saving, this); - }, - - saving: function () { - if (!this.get('title')) { - throw new Error('Post title cannot be blank'); - } - this.set('content_html', converter.makeHtml(this.get('content'))); - - // refactoring of ghost required in order to make these details available here - // this.set('language', this.get('language') || ghost.config().defaultLang); - // this.set('status', this.get('status') || ghost.statuses().draft); - - }, - - creating: function () { - if (!this.get('slug')) { - this.generateSlug(); - } - }, - - generateSlug: function () { - return this.set('slug', this.get('title').replace(/\:/g, '').replace(/\s/g, '-').toLowerCase()); - }, - - user: function () { - return this.belongsTo(User, 'created_by'); - } - - }); - - Posts = Bookshelf.Collection.extend({ - - model: Post - - }); - - User = Bookshelf.Model.extend({ - tableName: 'users', - hasTimestamps: true, - posts: function () { - return this.hasMany(Posts, 'created_by'); - } - }); - - Users = Bookshelf.Collection.extend({ - - model: User - - }); - - Setting = Bookshelf.Model.extend({ - tableName: 'settings', - hasTimestamps: true - }); - - Settings = Bookshelf.Collection.extend({ - model: Setting - }); - - module.exports = { - Post: Post, - Posts: Posts, - User: User, - Users: Users, - Setting: Setting, - Settings: Settings - }; -}()); \ No newline at end of file diff --git a/core/shared/models/post.js b/core/shared/models/post.js new file mode 100644 index 0000000000..115a875792 --- /dev/null +++ b/core/shared/models/post.js @@ -0,0 +1,134 @@ +(function () { + + "use strict"; + + var Post, + Posts, + _ = require('underscore'), + Showdown = require('showdown'), + converter = new Showdown.converter(), + User = require('./user').User, + GhostBookshelf = require('./base'); + + Post = GhostBookshelf.Model.extend({ + + tableName: 'posts', + + hasTimestamps: true, + + initialize: function () { + this.on('creating', this.creating, this); + this.on('saving', this.saving, this); + }, + + saving: function () { + if (!this.get('title')) { + throw new Error('Post title cannot be blank'); + } + this.set('content_html', converter.makeHtml(this.get('content'))); + + // refactoring of ghost required in order to make these details available here + // this.set('language', this.get('language') || ghost.config().defaultLang); + // this.set('status', this.get('status') || ghost.statuses().draft); + }, + + creating: function () { + if (!this.get('slug')) { + this.generateSlug(); + } + }, + + generateSlug: function () { + return this.set('slug', this.get('title').replace(/\:/g, '').replace(/\s/g, '-').toLowerCase()); + }, + + user: function () { + return this.belongsTo(User, 'created_by'); + } + + }, { + + /** + * Find results by page - returns an object containing the + * information about the request (page, limit), along with the + * info needed for pagination (pages, total). + * + * { + * posts: [ + * {...}, {...}, {...} + * ], + * page: __, + * limit: __, + * pages: __, + * total: __ + * } + * + * @params opts + */ + findPage: function (opts) { + var postCollection; + + // Allow findPage(n) + if (!_.isObject(opts)) { + opts = {page: opts}; + } + + opts = _.defaults(opts || {}, { + page: 1, + limit: 15, + where: null + }); + postCollection = Posts.forge(); + + // If there are where conditionals specified, add those + // to the query. + if (opts.where) { + postCollection.query('where', opts.where); + } + + // Set the limit & offset for the query, fetching + // with the opts (to specify any eager relations, etc.) + // Omitting the `page`, `limit`, `where` just to be sure + // aren't used for other purposes. + return postCollection + .query('limit', opts.limit) + .query('offset', opts.limit * (opts.page - 1)) + .fetch(_.omit(opts, 'page', 'limit', 'where')) + .then(function (collection) { + var qb; + + // After we're done, we need to figure out what + // the limits are for the pagination values. + qb = GhostBookshelf.Knex(_.result(collection, 'tableName')); + + if (opts.where) { + qb.where(opts.where); + } + + return qb.count(_.result(collection, 'idAttribute')).then(function (resp) { + var totalPosts = resp[0].aggregate; + return { + posts: collection.toJSON(), + page: opts.page, + limit: opts.limit, + pages: Math.ceil(totalPosts / opts.limit), + total: totalPosts + }; + }); + }); + } + + }); + + Posts = GhostBookshelf.Collection.extend({ + + model: Post + + }); + + module.exports = { + Post: Post, + Posts: Posts + }; + +}()); \ No newline at end of file diff --git a/core/shared/models/setting.js b/core/shared/models/setting.js new file mode 100644 index 0000000000..c31ba0f711 --- /dev/null +++ b/core/shared/models/setting.js @@ -0,0 +1,46 @@ +(function () { + "use strict"; + + var Setting, + Settings, + GhostBookshelf = require('./base'), + _ = require('underscore'), + when = require('when'), + SettingsProvider; + + Setting = GhostBookshelf.Model.extend({ + + tableName: 'settings', + + hasTimestamps: true + + }, { + + read: function (_key) { + // Allow for just passing the key instead of attributes + if (!_.isObject(_key)) { + _key = { key: _key }; + } + return GhostBookshelf.Model.read.call(this, _key); + }, + + edit: function (_data) { + return when.all(_.map(_data, function (value, key) { + return this.forge({ key: key }).fetch().then(function (setting) { + return setting.set('value', value).save(); + }); + }, this)); + } + + }); + + Settings = GhostBookshelf.Collection.extend({ + model: Setting + }); + + module.exports = { + Setting: Setting, + Settings: Settings + }; + +}()); \ No newline at end of file diff --git a/core/shared/models/user.js b/core/shared/models/user.js new file mode 100644 index 0000000000..8e30d939ed --- /dev/null +++ b/core/shared/models/user.js @@ -0,0 +1,72 @@ +(function () { + "use strict"; + + var User, + Users, + _ = require('underscore'), + when = require('when'), + nodefn = require('when/node/function'), + bcrypt = require('bcrypt'), + Posts = require('./post').Posts, + GhostBookshelf = require('./base'); + + User = GhostBookshelf.Model.extend({ + + tableName: 'users', + + hasTimestamps: true, + + posts: function () { + return this.hasMany(Posts, 'created_by'); + } + + }, { + + /** + * Naive user add + * @param _user + * + * Hashes the password provided before saving to the database. + */ + add: function (_user) { + var User = this, + // Clone the _user so we don't expose the hashed password unnecessarily + userData = _.extend({}, _user); + + return nodefn.call(bcrypt.hash, _user.password, 10).then(function (hash) { + userData.password = hash; + return GhostBookshelf.Model.add.call(User, userData); + }); + }, + + /** + * User check + * @param _userdata + * + * Finds the user by email, and check's the password + */ + check: function (_userdata) { + return this.model.forge({ + email_address: _userdata.email + }).fetch().then(function (user) { + return nodefn.call(bcrypt.compare, _userdata.pw, user.get('password')).then(function (matched) { + if (!matched) { + return when.reject(new Error('Password does not match')); + } + return user; + }); + }); + } + + }); + + Users = GhostBookshelf.Collection.extend({ + model: User + }); + + module.exports = { + User: User, + Users: Users + }; + +}()); \ No newline at end of file diff --git a/core/test/ghost/api_posts_spec.js b/core/test/ghost/api_posts_spec.js index d19f4377d0..95524025f1 100644 --- a/core/test/ghost/api_posts_spec.js +++ b/core/test/ghost/api_posts_spec.js @@ -6,22 +6,20 @@ var _ = require("underscore"), should = require('should'), helpers = require('./helpers'), - PostProvider = require('../../shared/models/dataProvider.bookshelf.posts'), - Bookshelf = require('bookshelf'); + Models = require('../../shared/models'); - describe('Bookshelf PostsProvider', function () { + describe('Bookshelf Post Model', function () { - var posts; + var PostModel = Models.Post; beforeEach(function (done) { helpers.resetData().then(function () { - posts = new PostProvider(); done(); }, done); }); it('can browse', function (done) { - posts.browse().then(function (results) { + PostModel.browse().then(function (results) { should.exist(results); results.length.should.equal(2); @@ -33,14 +31,14 @@ it('can read', function (done) { var firstPost; - posts.browse().then(function (results) { + PostModel.browse().then(function (results) { should.exist(results); results.length.should.be.above(0); firstPost = results.models[0]; - return posts.read({slug: firstPost.attributes.slug}); + return PostModel.read({slug: firstPost.attributes.slug}); }).then(function (found) { should.exist(found); @@ -53,7 +51,7 @@ it('can edit', function (done) { var firstPost; - posts.browse().then(function (results) { + PostModel.browse().then(function (results) { should.exist(results); @@ -61,7 +59,7 @@ firstPost = results.models[0]; - return posts.edit({id: firstPost.id, title: "new title"}); + return PostModel.edit({id: firstPost.id, title: "new title"}); }).then(function (edited) { @@ -80,7 +78,7 @@ content: 'Test Content 1' }; - posts.add(newPost).then(function (createdPost) { + PostModel.add(newPost).then(function (createdPost) { should.exist(createdPost); createdPost.attributes.title.should.equal(newPost.title, "title is correct"); @@ -93,7 +91,7 @@ it('can delete', function (done) { var firstPostId; - posts.browse().then(function (results) { + PostModel.browse().then(function (results) { should.exist(results); @@ -101,11 +99,11 @@ firstPostId = results.models[0].id; - return posts.destroy(firstPostId); + return PostModel.destroy(firstPostId); }).then(function () { - return posts.browse(); + return PostModel.browse(); }).then(function (newResults) { var ids, hasDeletedId; @@ -127,7 +125,7 @@ helpers.insertMorePosts().then(function () { - return posts.findPage({page: 2}); + return PostModel.findPage({page: 2}); }).then(function (paginationResult) { @@ -139,7 +137,7 @@ paginationResult.pages.should.equal(4); - return posts.findPage({page: 5}); + return PostModel.findPage({page: 5}); }).then(function (paginationResult) { @@ -151,7 +149,7 @@ paginationResult.pages.should.equal(4); - return posts.findPage({limit: 30}); + return PostModel.findPage({limit: 30}); }).then(function (paginationResult) { @@ -163,7 +161,7 @@ paginationResult.pages.should.equal(2); - return posts.findPage({limit: 10, page: 2, where: {language: 'fr'}}); + return PostModel.findPage({limit: 10, page: 2, where: {language: 'fr'}}); }).then(function (paginationResult) { diff --git a/core/test/ghost/api_settings_spec.js b/core/test/ghost/api_settings_spec.js index 5bb9fd5e49..8f6de03be1 100644 --- a/core/test/ghost/api_settings_spec.js +++ b/core/test/ghost/api_settings_spec.js @@ -6,21 +6,20 @@ var _ = require("underscore"), should = require('should'), helpers = require('./helpers'), - SettingProvider = require('../../shared/models/dataProvider.bookshelf.settings'); + Models = require('../../shared/models'); - describe('Bookshelf SettingsProvider', function () { + describe('Bookshelf Setting Model', function () { - var settings; + var SettingModel = Models.Setting; beforeEach(function (done) { helpers.resetData().then(function () { - settings = new SettingProvider(); done(); - }); + }, done); }); it('can browse', function (done) { - settings.browse().then(function (results) { + SettingModel.browse().then(function (results) { should.exist(results); @@ -33,7 +32,7 @@ it('can read', function (done) { var firstSetting; - settings.browse().then(function (results) { + SettingModel.browse().then(function (results) { should.exist(results); @@ -41,7 +40,7 @@ firstSetting = results.models[0]; - return settings.read(firstSetting.attributes.key); + return SettingModel.read(firstSetting.attributes.key); }).then(function (found) { @@ -58,7 +57,7 @@ var firstPost, toEdit = {}; - settings.browse().then(function (results) { + SettingModel.browse().then(function (results) { should.exist(results); @@ -70,7 +69,7 @@ // key/value pairs toEdit[firstPost.attributes.key] = "new value"; - return settings.edit(toEdit); + return SettingModel.edit(toEdit); }).then(function (edited) { @@ -94,7 +93,7 @@ editedPost, toEdit = {}; - settings.browse().then(function (results) { + SettingModel.browse().then(function (results) { should.exist(results); @@ -108,7 +107,7 @@ toEdit[firstPost.attributes.key] = "new value1"; toEdit[secondPost.attributes.key] = "new value2"; - return settings.edit(toEdit); + return SettingModel.edit(toEdit); }).then(function (edited) { @@ -137,7 +136,7 @@ value: 'Test Content 1' }; - settings.add(newSetting).then(function (createdSetting) { + SettingModel.add(newSetting).then(function (createdSetting) { should.exist(createdSetting); @@ -151,7 +150,7 @@ it('can delete', function (done) { var firstSettingId; - settings.browse().then(function (results) { + SettingModel.browse().then(function (results) { should.exist(results); @@ -159,11 +158,11 @@ firstSettingId = results.models[0].id; - return settings.destroy(firstSettingId); + return SettingModel.destroy(firstSettingId); }).then(function () { - return settings.browse(); + return SettingModel.browse(); }).then(function (newResults) { diff --git a/core/test/ghost/api_users_spec.js b/core/test/ghost/api_users_spec.js index 7311f90e03..32be67ed5e 100644 --- a/core/test/ghost/api_users_spec.js +++ b/core/test/ghost/api_users_spec.js @@ -6,22 +6,21 @@ var _ = require('underscore'), should = require('should'), helpers = require('./helpers'), - UserProvider = require('../../shared/models/dataProvider.bookshelf.users'); + Models = require('../../shared/models'); - describe('Bookshelf UsersProvider', function () { + describe('Bookshelf User Model', function () { - var users; + var UserModel = Models.User; beforeEach(function (done) { helpers.resetData().then(function () { - users = new UserProvider(); done(); - }); + }, done); }); it('can browse', function (done) { - users.browse().then(function (results) { + UserModel.browse().then(function (results) { should.exist(results); @@ -35,7 +34,7 @@ it('can read', function (done) { var firstUser; - users.browse().then(function (results) { + UserModel.browse().then(function (results) { should.exist(results); @@ -43,7 +42,7 @@ firstUser = results.models[0]; - return users.read({email_address: firstUser.attributes.email_address}); + return UserModel.read({email_address: firstUser.attributes.email_address}); }).then(function (found) { @@ -60,7 +59,7 @@ it('can edit', function (done) { var firstUser; - users.browse().then(function (results) { + UserModel.browse().then(function (results) { should.exist(results); @@ -68,7 +67,7 @@ firstUser = results.models[0]; - return users.edit({id: firstUser.id, url: "some.newurl.com"}); + return UserModel.edit({id: firstUser.id, url: "some.newurl.com"}); }).then(function (edited) { @@ -87,7 +86,7 @@ email_address: "test@test1.com" }; - users.add(userData).then(function (createdUser) { + UserModel.add(userData).then(function (createdUser) { should.exist(createdUser); @@ -101,7 +100,7 @@ it('can delete', function (done) { var firstUserId; - users.browse().then(function (results) { + UserModel.browse().then(function (results) { should.exist(results); @@ -109,11 +108,11 @@ firstUserId = results.models[0].id; - return users.destroy(firstUserId); + return UserModel.destroy(firstUserId); }).then(function () { - return users.browse(); + return UserModel.browse(); }).then(function (newResults) { var ids, hasDeletedId; diff --git a/core/test/ghost/dataProvider.json_spec.js b/core/test/ghost/dataProvider.json_spec.js deleted file mode 100644 index c264427f5f..0000000000 --- a/core/test/ghost/dataProvider.json_spec.js +++ /dev/null @@ -1,20 +0,0 @@ -/*globals describe, beforeEach, it*/ - -(function () { - "use strict"; - - var should = require('should'), - DataProvider = require('../../shared/models/dataProvider.json'); - - describe("dataProvider.json", function () { - - it("is a singleton", function () { - var provider1 = new DataProvider(), - provider2 = new DataProvider(); - - should.strictEqual(provider1, provider2); - }); - - }); - -}()); \ No newline at end of file diff --git a/core/test/ghost/helpers.js b/core/test/ghost/helpers.js index 3a87bc97cc..d6cb48fe92 100644 --- a/core/test/ghost/helpers.js +++ b/core/test/ghost/helpers.js @@ -4,7 +4,7 @@ // Use 'testing' Ghost config process.env.NODE_ENV = 'testing'; - var knex = require('knex'), + var knex = require('../../shared/models/base').Knex, migrations = { one: require("../../shared/data/migration/001") }, From 2fc0a6a02e11d3919df433aa8d614ba69aa0920a Mon Sep 17 00:00:00 2001 From: Matthew Harrison-Jones Date: Wed, 29 May 2013 13:04:14 +0100 Subject: [PATCH 2/4] Initial Dashboard UI conversion --- .../assets/img/dash/Facebook_Images@2x.png | Bin 0 -> 91037 bytes core/admin/assets/sass/layouts/dashboard.scss | 532 +++++++++++++----- core/admin/assets/sass/modules/mixins.scss | 9 +- core/admin/views/dashboard.hbs | 151 ++++- 4 files changed, 520 insertions(+), 172 deletions(-) create mode 100644 core/admin/assets/img/dash/Facebook_Images@2x.png diff --git a/core/admin/assets/img/dash/Facebook_Images@2x.png b/core/admin/assets/img/dash/Facebook_Images@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..838e35c6f393f19e1402ebee6bbda71a9631c903 GIT binary patch literal 91037 zcmV(%K;plNP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytl307*naRCocb zy;+cC*?Hf0a$jrTyLw+{9}px!5QIpA1OYB$1Z9WGkZm~}p&(!F7l*>zlV9uz)3igT z9wh6vpZ`bkFQt4cB)_pMejD-b_mgiYpAzS0`%eAJzI>eN zIoVZmUWh{r{8lSh)BM7Gnx9)tGc!|Ze(`Kd{dQWrbv@m>eLLOX+)4YLE{&iKqfr_R z`f13yagAtAj!O;W+S&E_jpK40;GNU)Z*fb`^GN&1A+f#kowu_OkNo}8g~ik>6w=ON zH}$z^v06$8-G16V?4%-XsaDFV%D(BTiL^L3lP2o*^k8En^*XJzG&h@u{XyE@*-PWi zMznWrYdhsQuifjX)=`^Rhwu4xet9unx^yvZZSSQI?%Yco+q
!l$Lwe{uPFn#{T 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 {{/contentFor}} {{!< default}} -

-
-
-
- -
    -
  • 9 Ready
  • -
  • 4 Pending
  • -
  • 1 Draft
  • -
-
+
+
+
+ Today + 12° +
+ +
+
+ Linz, Austria +
+
+
+ +
+
+ +
+
+ Ghost +
+
-
- -
- -
\ No newline at end of file + +
+
+
+ +
    +
  • 9 Ready
  • +
  • 4 Pending
  • +
  • 1 Draft
  • +
+
+
+
+ Upcoming Posts +
+
+
+ +
+
+
+ 293,042 + +35% in the last 30 days +
+
+
+ Google Analytics Unique Visitors +
+
+
+ +
+
+
+ 9,392 + -39 likes today + +
+
+
+ Facebook +
+
+
+ +
+
+
+ 4,103 + have you in circles +
+
+
+ Google Plus +
+
+
+ +
+
+ Twitter Settings +
+
+
+ + + + +
+
+
+
+
+
+
+
+ 3,502 + +35 subscribers this week +
+
+
+ Campaign Monitor +
+
+
\ No newline at end of file From cf9c2462fa0559747360bccfac8398d417bb2bcb Mon Sep 17 00:00:00 2001 From: Tim Griesser Date: Wed, 29 May 2013 18:28:24 -0400 Subject: [PATCH 3/4] lint fixes --- app.js | 4 ++-- core/admin/controllers/index.js | 2 +- core/frontend/helpers/ghostNav.js | 6 +++--- core/ghost.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index c7c2719d2f..152e44eafe 100755 --- a/app.js +++ b/app.js @@ -77,8 +77,8 @@ * Expose the standard locals that every external page should have available; * path, navItems and ghostGlobals */ - ghostLocals = function(req, res, next) { - ghost.doFilter('ghostNavItems', {path: req.path, navItems: []}, function(navData) { + ghostLocals = function (req, res, next) { + ghost.doFilter('ghostNavItems', {path: req.path, navItems: []}, function (navData) { // Make sure we have a locals value. res.locals = res.locals || {}; diff --git a/core/admin/controllers/index.js b/core/admin/controllers/index.js index c9b888f123..e8c8779857 100755 --- a/core/admin/controllers/index.js +++ b/core/admin/controllers/index.js @@ -43,7 +43,7 @@ } }; - ghost.doFilter('messWithAdmin', adminNavbar, function() { + ghost.doFilter('messWithAdmin', adminNavbar, function () { console.log('the dofilter hook called in /core/admin/controllers/index.js'); }); diff --git a/core/frontend/helpers/ghostNav.js b/core/frontend/helpers/ghostNav.js index f1ae8bd9a7..6a0ef8975c 100644 --- a/core/frontend/helpers/ghostNav.js +++ b/core/frontend/helpers/ghostNav.js @@ -25,7 +25,7 @@ // Allow people to overwrite the navTemplatePath templatePath = templatePath || this.navTemplatePath; - return nodefn.call(fs.readFile, templatePath).then(function(navTemplateContents) { + return nodefn.call(fs.readFile, templatePath).then(function (navTemplateContents) { // TODO: Can handlebars compile async? self.navTemplateFunc = handlebars.compile(navTemplateContents.toString()); }); @@ -40,11 +40,11 @@ }; // A static helper method for registering with ghost - GhostNavHelper.registerWithGhost = function(ghost) { + GhostNavHelper.registerWithGhost = function (ghost) { var templatePath = path.join(ghost.paths().frontendViews, 'nav.hbs'), ghostNavHelper = new GhostNavHelper(templatePath); - return ghostNavHelper.compileTemplate().then(function() { + return ghostNavHelper.compileTemplate().then(function () { ghost.registerThemeHelper("ghostNav", ghostNavHelper.renderNavItems); }); }; diff --git a/core/ghost.js b/core/ghost.js index 1042a05130..e0a1a95b57 100644 --- a/core/ghost.js +++ b/core/ghost.js @@ -62,7 +62,7 @@ dataProvider: models, statuses: function () { return statuses; }, polyglot: function () { return polyglot; }, - plugin: function() { return plugin; }, + plugin: function () { return plugin; }, paths: function () { return { 'activeTheme': __dirname + '/../content/' + config.themeDir + '/' + config.activeTheme + '/', From 7cbbb3af4ea122fabac2fb452d9df804a531b1f7 Mon Sep 17 00:00:00 2001 From: Tim Griesser Date: Wed, 29 May 2013 21:58:59 -0400 Subject: [PATCH 4/4] lint fixes & bcrypt-nodejs --- core/shared/models/base.js | 4 +--- core/shared/models/setting.js | 3 +-- core/shared/models/user.js | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/shared/models/base.js b/core/shared/models/base.js index c703666245..0133a335b1 100644 --- a/core/shared/models/base.js +++ b/core/shared/models/base.js @@ -2,9 +2,7 @@ "use strict"; - var _ = require('underscore'), - GhostBookshelf, - BookshelfBase, + var GhostBookshelf, Bookshelf = require('bookshelf'), config = require('../../../config'); diff --git a/core/shared/models/setting.js b/core/shared/models/setting.js index c31ba0f711..e27f0612b4 100644 --- a/core/shared/models/setting.js +++ b/core/shared/models/setting.js @@ -5,8 +5,7 @@ Settings, GhostBookshelf = require('./base'), _ = require('underscore'), - when = require('when'), - SettingsProvider; + when = require('when'); Setting = GhostBookshelf.Model.extend({ diff --git a/core/shared/models/user.js b/core/shared/models/user.js index 8e30d939ed..b05bad283b 100644 --- a/core/shared/models/user.js +++ b/core/shared/models/user.js @@ -6,7 +6,7 @@ _ = require('underscore'), when = require('when'), nodefn = require('when/node/function'), - bcrypt = require('bcrypt'), + bcrypt = require('bcrypt-nodejs'), Posts = require('./post').Posts, GhostBookshelf = require('./base'); @@ -33,7 +33,7 @@ // Clone the _user so we don't expose the hashed password unnecessarily userData = _.extend({}, _user); - return nodefn.call(bcrypt.hash, _user.password, 10).then(function (hash) { + return nodefn.call(bcrypt.hash, _user.password, null, null).then(function (hash) { userData.password = hash; return GhostBookshelf.Model.add.call(User, userData); });