diff --git a/core/server/data/export/index.js b/core/server/data/export/index.js index 432e45763c..9c55c0c956 100644 --- a/core/server/data/export/index.js +++ b/core/server/data/export/index.js @@ -2,21 +2,21 @@ var when = require('when'), _ = require('underscore'), migration = require('../migration'), client = require('../../models/base').client, - knex = require('../../models/base').Knex, + knex = require('../../models/base').knex, exporter; function getTablesFromSqlite3() { - return knex.Raw("select * from sqlite_master where type = 'table'").then(function (response) { - return _.reject(_.pluck(response, 'tbl_name'), function (name) { + return knex.raw("select * from sqlite_master where type = 'table'").then(function (response) { + return _.reject(_.pluck(response[0], 'tbl_name'), function (name) { return name === 'sqlite_sequence'; }); }); } function getTablesFromMySQL() { - return knex.Raw('show tables').then(function (response) { - return _.flatten(_.map(response, function (entry) { + return knex.raw("show tables").then(function (response) { + return _.flatten(_.map(response[0], function (entry) { return _.values(entry); })); }); diff --git a/core/server/data/migration/000.js b/core/server/data/migration/000.js index 003e62b3c5..a87e5847d3 100644 --- a/core/server/data/migration/000.js +++ b/core/server/data/migration/000.js @@ -1,5 +1,5 @@ var when = require('when'), - knex = require('../../models/base').Knex, + knex = require('../../models/base').knex, up, down; @@ -7,7 +7,7 @@ up = function () { return when.all([ - knex.Schema.createTable('posts', function (t) { + knex.schema.createTable('posts', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('title', 150).notNull(); @@ -30,7 +30,7 @@ up = function () { t.integer('published_by').nullable(); }), - knex.Schema.createTable('users', function (t) { + knex.schema.createTable('users', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('name', 150).notNull(); @@ -54,7 +54,7 @@ up = function () { t.integer('updated_by').nullable(); }), - knex.Schema.createTable('roles', function (t) { + knex.schema.createTable('roles', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('name', 150).notNull(); @@ -65,13 +65,13 @@ up = function () { t.integer('updated_by').nullable(); }), - knex.Schema.createTable('roles_users', function (t) { + knex.schema.createTable('roles_users', function (t) { t.increments().primary(); t.integer('role_id').notNull(); t.integer('user_id').notNull(); }), - knex.Schema.createTable('permissions', function (t) { + knex.schema.createTable('permissions', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('name', 150).notNull(); @@ -84,19 +84,19 @@ up = function () { t.integer('updated_by').nullable(); }), - knex.Schema.createTable('permissions_users', function (t) { + knex.schema.createTable('permissions_users', function (t) { t.increments().primary(); t.integer('user_id').notNull(); t.integer('permission_id').notNull(); }), - knex.Schema.createTable('permissions_roles', function (t) { + knex.schema.createTable('permissions_roles', function (t) { t.increments().primary(); t.integer('role_id').notNull(); t.integer('permission_id').notNull(); }), - knex.Schema.createTable('settings', function (t) { + knex.schema.createTable('settings', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('key', 150).notNull().unique(); @@ -107,7 +107,7 @@ up = function () { t.dateTime('updated_at').nullable(); t.integer('updated_by').nullable(); }), - knex.Schema.createTable('tags', function (t) { + knex.schema.createTable('tags', function (t) { t.increments().primary(); t.string('uuid', 36).notNull(); t.string('name', 150).notNull(); @@ -120,30 +120,31 @@ up = function () { t.integer('created_by').notNull(); t.dateTime('updated_at').nullable(); t.integer('updated_by').nullable(); - }), - knex.Schema.createTable('posts_tags', function (t) { + }) + ]).then(function () { + return knex.schema.createTable('posts_tags', function (t) { t.increments().primary(); t.integer('post_id').notNull().unsigned().references('id').inTable('posts'); t.integer('tag_id').notNull().unsigned().references('id').inTable('tags'); - }) - ]); + }); + }); }; down = function () { return when.all([ - knex.Schema.dropTableIfExists('posts_tags'), - knex.Schema.dropTableIfExists('roles_users'), - knex.Schema.dropTableIfExists('permissions_users'), - knex.Schema.dropTableIfExists('permissions_roles'), - knex.Schema.dropTableIfExists('users') + knex.schema.dropTableIfExists('posts_tags'), + knex.schema.dropTableIfExists('roles_users'), + knex.schema.dropTableIfExists('permissions_users'), + knex.schema.dropTableIfExists('permissions_roles'), + knex.schema.dropTableIfExists('users') ]).then(function () { return when.all([ - knex.Schema.dropTableIfExists('roles'), - knex.Schema.dropTableIfExists('settings'), - knex.Schema.dropTableIfExists('permissions'), - knex.Schema.dropTableIfExists('tags'), - knex.Schema.dropTableIfExists('posts') + knex.schema.dropTableIfExists('roles'), + knex.schema.dropTableIfExists('settings'), + knex.schema.dropTableIfExists('permissions'), + knex.schema.dropTableIfExists('tags'), + knex.schema.dropTableIfExists('posts') ]); }); }; diff --git a/core/server/data/migration/index.js b/core/server/data/migration/index.js index 00e2523773..d3e8971e86 100644 --- a/core/server/data/migration/index.js +++ b/core/server/data/migration/index.js @@ -3,7 +3,7 @@ var _ = require('underscore'), when = require('when'), series = require('when/sequence'), errors = require('../../errorHandling'), - knex = require('../../models/base').Knex, + knex = require('../../models/base').knex, defaultSettings = require('../default-settings'), Settings = require('../../models/settings').Settings, @@ -30,7 +30,7 @@ function getDefaultDatabaseVersion() { // The migration version number according to the database // This is what the database is currently at and may need to be updated function getDatabaseVersion() { - return knex.Schema.hasTable('settings').then(function (exists) { + return knex.schema.hasTable('settings').then(function (exists) { // Check for the current version from the settings table if (exists) { // Temporary code to deal with old databases with currentVersion settings diff --git a/core/server/models/base.js b/core/server/models/base.js index 65db8cae4b..0b4276f84d 100644 --- a/core/server/models/base.js +++ b/core/server/models/base.js @@ -1,4 +1,4 @@ -var GhostBookshelf, +var ghostBookshelf, Bookshelf = require('bookshelf'), when = require('when'), moment = require('moment'), @@ -8,16 +8,15 @@ var GhostBookshelf, Validator = require('validator').Validator, sanitize = require('validator').sanitize; -// 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[process.env.NODE_ENV || 'development'].database); -GhostBookshelf.client = config[process.env.NODE_ENV].database.client; +// Initializes a new Bookshelf instance, for reference elsewhere in Ghost. +ghostBookshelf = Bookshelf.initialize(config[process.env.NODE_ENV || 'development'].database); +ghostBookshelf.client = config[process.env.NODE_ENV].database.client; -GhostBookshelf.validator = new Validator(); +ghostBookshelf.validator = new Validator(); // 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({ +ghostBookshelf.Model = ghostBookshelf.Model.extend({ hasTimestamps: true, @@ -145,7 +144,7 @@ GhostBookshelf.Model = GhostBookshelf.Model.extend({ */ findAll: function (options) { options = options || {}; - return GhostBookshelf.Collection.forge([], {model: this}).fetch(options); + return ghostBookshelf.Collection.forge([], {model: this}).fetch(options); }, browse: function () { @@ -212,4 +211,4 @@ GhostBookshelf.Model = GhostBookshelf.Model.extend({ }); -module.exports = GhostBookshelf; +module.exports = ghostBookshelf; diff --git a/core/server/models/permission.js b/core/server/models/permission.js index ccd3ffeaf4..98f9c41724 100644 --- a/core/server/models/permission.js +++ b/core/server/models/permission.js @@ -1,10 +1,10 @@ -var GhostBookshelf = require('./base'), +var ghostBookshelf = require('./base'), User = require('./user').User, Role = require('./role').Role, Permission, Permissions; -Permission = GhostBookshelf.Model.extend({ +Permission = ghostBookshelf.Model.extend({ tableName: 'permissions', @@ -14,7 +14,7 @@ Permission = GhostBookshelf.Model.extend({ validate: function () { // TODO: validate object_type, action_type and object_id - GhostBookshelf.validator.check(this.get('name'), "Permission name cannot be blank").notEmpty(); + ghostBookshelf.validator.check(this.get('name'), "Permission name cannot be blank").notEmpty(); }, roles: function () { @@ -26,7 +26,7 @@ Permission = GhostBookshelf.Model.extend({ } }); -Permissions = GhostBookshelf.Collection.extend({ +Permissions = ghostBookshelf.Collection.extend({ model: Permission }); diff --git a/core/server/models/post.js b/core/server/models/post.js index 111c32fff9..c9593d7de0 100644 --- a/core/server/models/post.js +++ b/core/server/models/post.js @@ -11,9 +11,9 @@ var Post, config = require('../../../config'), Tag = require('./tag').Tag, Tags = require('./tag').Tags, - GhostBookshelf = require('./base'); + ghostBookshelf = require('./base'); -Post = GhostBookshelf.Model.extend({ +Post = ghostBookshelf.Model.extend({ tableName: 'posts', @@ -38,7 +38,7 @@ Post = GhostBookshelf.Model.extend({ }, validate: function () { - GhostBookshelf.validator.check(this.get('title'), "Post title cannot be blank").notEmpty(); + ghostBookshelf.validator.check(this.get('title'), "Post title cannot be blank").notEmpty(); return true; }, @@ -61,7 +61,7 @@ Post = GhostBookshelf.Model.extend({ this.set('published_by', 1); } - GhostBookshelf.Model.prototype.saving.call(this); + ghostBookshelf.Model.prototype.saving.call(this); if (this.hasChanged('slug')) { // Pass the new slug through the generator to strip illegal characters, detect duplicates @@ -80,7 +80,7 @@ Post = GhostBookshelf.Model.extend({ this.set('author_id', 1); } - GhostBookshelf.Model.prototype.creating.call(this); + ghostBookshelf.Model.prototype.creating.call(this); if (!this.get('slug')) { // Generating a slug requires a db call to look for conflicting slugs @@ -174,7 +174,7 @@ Post = GhostBookshelf.Model.extend({ findAll: function (options) { options = options || {}; options.withRelated = [ 'author', 'user', 'tags' ]; - return GhostBookshelf.Model.findAll.call(this, options); + return ghostBookshelf.Model.findAll.call(this, options); }, // #### findOne @@ -182,7 +182,7 @@ Post = GhostBookshelf.Model.extend({ findOne: function (args, options) { options = options || {}; options.withRelated = [ 'author', 'user', 'tags' ]; - return GhostBookshelf.Model.findOne.call(this, args, options); + return ghostBookshelf.Model.findOne.call(this, args, options); }, // #### findPage @@ -251,7 +251,7 @@ Post = GhostBookshelf.Model.extend({ // After we're done, we need to figure out what // the limits are for the pagination values. - qb = GhostBookshelf.Knex(_.result(collection, 'tableName')); + qb = ghostBookshelf.knex(_.result(collection, 'tableName')); if (opts.where) { qb.where(opts.where); @@ -328,7 +328,7 @@ Post = GhostBookshelf.Model.extend({ }, add: function (newPostData, options) { - return GhostBookshelf.Model.add.call(this, newPostData, options).tap(function (post) { + return ghostBookshelf.Model.add.call(this, newPostData, options).tap(function (post) { // associated models can't be created until the post has an ID, so run this after return post.updateTags(newPostData.tags); }); @@ -349,7 +349,7 @@ Post = GhostBookshelf.Model.extend({ }); -Posts = GhostBookshelf.Collection.extend({ +Posts = ghostBookshelf.Collection.extend({ model: Post diff --git a/core/server/models/role.js b/core/server/models/role.js index 6d0bd6962c..a0863f03ab 100644 --- a/core/server/models/role.js +++ b/core/server/models/role.js @@ -1,18 +1,18 @@ var User = require('./user').User, Permission = require('./permission').Permission, - GhostBookshelf = require('./base'), + ghostBookshelf = require('./base'), Role, Roles; -Role = GhostBookshelf.Model.extend({ +Role = ghostBookshelf.Model.extend({ tableName: 'roles', permittedAttributes: ['id', 'uuid', 'name', 'description', 'created_at', 'created_by', 'updated_at', 'updated_by'], validate: function () { - GhostBookshelf.validator.check(this.get('name'), "Role name cannot be blank").notEmpty(); - GhostBookshelf.validator.check(this.get('description'), "Role description cannot be blank").notEmpty(); + ghostBookshelf.validator.check(this.get('name'), "Role name cannot be blank").notEmpty(); + ghostBookshelf.validator.check(this.get('description'), "Role description cannot be blank").notEmpty(); }, users: function () { @@ -24,7 +24,7 @@ Role = GhostBookshelf.Model.extend({ } }); -Roles = GhostBookshelf.Collection.extend({ +Roles = ghostBookshelf.Collection.extend({ model: Role }); diff --git a/core/server/models/settings.js b/core/server/models/settings.js index cce389311d..250fefdc71 100644 --- a/core/server/models/settings.js +++ b/core/server/models/settings.js @@ -1,6 +1,6 @@ var Settings, - GhostBookshelf = require('./base'), - validator = GhostBookshelf.validator, + ghostBookshelf = require('./base'), + validator = ghostBookshelf.validator, uuid = require('node-uuid'), _ = require('underscore'), errors = require('../errorHandling'), @@ -29,7 +29,7 @@ defaultSettings = parseDefaultSettings(); // Each setting is saved as a separate row in the database, // but the overlying API treats them as a single key:value mapping -Settings = GhostBookshelf.Model.extend({ +Settings = ghostBookshelf.Model.extend({ tableName: 'settings', @@ -83,7 +83,7 @@ Settings = GhostBookshelf.Model.extend({ this.set('value', this.sanitize('value')); } - return GhostBookshelf.Model.prototype.saving.apply(this, arguments); + return ghostBookshelf.Model.prototype.saving.apply(this, arguments); } }, { @@ -92,7 +92,7 @@ Settings = GhostBookshelf.Model.extend({ if (!_.isObject(_key)) { _key = { key: _key }; } - return GhostBookshelf.Model.read.call(this, _key); + return ghostBookshelf.Model.read.call(this, _key); }, edit: function (_data) { diff --git a/core/server/models/tag.js b/core/server/models/tag.js index a1d972c80b..962b89be4a 100644 --- a/core/server/models/tag.js +++ b/core/server/models/tag.js @@ -1,9 +1,9 @@ var Tag, Tags, Posts = require('./post').Posts, - GhostBookshelf = require('./base'); + ghostBookshelf = require('./base'); -Tag = GhostBookshelf.Model.extend({ +Tag = ghostBookshelf.Model.extend({ tableName: 'tags', @@ -20,7 +20,7 @@ Tag = GhostBookshelf.Model.extend({ creating: function () { var self = this; - GhostBookshelf.Model.prototype.creating.call(this); + ghostBookshelf.Model.prototype.creating.call(this); if (!this.get('slug')) { // Generating a slug requires a db call to look for conflicting slugs @@ -36,7 +36,7 @@ Tag = GhostBookshelf.Model.extend({ } }); -Tags = GhostBookshelf.Collection.extend({ +Tags = ghostBookshelf.Collection.extend({ model: Tag diff --git a/core/server/models/user.js b/core/server/models/user.js index d814a91dea..96a5705fd1 100644 --- a/core/server/models/user.js +++ b/core/server/models/user.js @@ -7,14 +7,14 @@ var User, nodefn = require('when/node/function'), bcrypt = require('bcrypt-nodejs'), Posts = require('./post').Posts, - GhostBookshelf = require('./base'), + ghostBookshelf = require('./base'), Role = require('./role').Role, Permission = require('./permission').Permission; function validatePasswordLength(password) { try { - GhostBookshelf.validator.check(password, "Your must be at least 8 characters long.").len(8); + ghostBookshelf.validator.check(password, "Your must be at least 8 characters long.").len(8); } catch (error) { return when.reject(error); } @@ -22,7 +22,7 @@ function validatePasswordLength(password) { return when.resolve(); } -User = GhostBookshelf.Model.extend({ +User = ghostBookshelf.Model.extend({ tableName: 'users', @@ -33,10 +33,10 @@ User = GhostBookshelf.Model.extend({ ], validate: function () { - GhostBookshelf.validator.check(this.get('email'), "Please enter a valid email address. That one looks a bit dodgy.").isEmail(); - GhostBookshelf.validator.check(this.get('bio'), "We're not writing a novel here! I'm afraid your bio has to stay under 200 characters.").len(0, 200); + ghostBookshelf.validator.check(this.get('email'), "Please enter a valid email address. That one looks a bit dodgy.").isEmail(); + ghostBookshelf.validator.check(this.get('bio'), "We're not writing a novel here! I'm afraid your bio has to stay under 200 characters.").len(0, 200); if (this.get('website') && this.get('website').length > 0) { - GhostBookshelf.validator.check(this.get('website'), "Looks like your website is not actually a website. Try again?").isUrl(); + ghostBookshelf.validator.check(this.get('website'), "Looks like your website is not actually a website. Try again?").isUrl(); } return true; }, @@ -44,7 +44,7 @@ User = GhostBookshelf.Model.extend({ creating: function () { var self = this; - GhostBookshelf.Model.prototype.creating.call(this); + ghostBookshelf.Model.prototype.creating.call(this); if (!this.get('slug')) { // Generating a slug requires a db call to look for conflicting slugs @@ -63,7 +63,7 @@ User = GhostBookshelf.Model.extend({ this.set('website', this.sanitize('website')); this.set('bio', this.sanitize('bio')); - return GhostBookshelf.Model.prototype.saving.apply(this, arguments); + return ghostBookshelf.Model.prototype.saving.apply(this, arguments); }, posts: function () { @@ -111,7 +111,7 @@ User = GhostBookshelf.Model.extend({ // Assign the hashed password userData.password = hash; // Save the user with the hashed password - return GhostBookshelf.Model.add.call(self, userData); + return ghostBookshelf.Model.add.call(self, userData); }).then(function (addedUser) { // Assign the userData to our created user so we can pass it back userData = addedUser; @@ -135,8 +135,8 @@ User = GhostBookshelf.Model.extend({ // } // return nodefn.call(bcrypt.hash, _user.password, null, null).then(function (hash) { // userData.password = hash; - // GhostBookshelf.Model.add.call(UserRole, userRoles); - // return GhostBookshelf.Model.add.call(User, userData); + // ghostBookshelf.Model.add.call(UserRole, userRoles); + // return ghostBookshelf.Model.add.call(User, userData); // }, errors.logAndThrowError); // }, errors.logAndThrowError); @@ -239,7 +239,7 @@ User = GhostBookshelf.Model.extend({ }); -Users = GhostBookshelf.Collection.extend({ +Users = ghostBookshelf.Collection.extend({ model: User }); diff --git a/core/test/unit/api_settings_spec.js b/core/test/unit/api_settings_spec.js index ff8351ce21..5e57b161e5 100644 --- a/core/test/unit/api_settings_spec.js +++ b/core/test/unit/api_settings_spec.js @@ -5,7 +5,7 @@ var testUtils = require('./testUtils'), // Stuff we are testing Models = require('../../server/models'), - knex = require('../../server/models/base').Knex; + knex = require('../../server/models/base').knex; describe('Settings Model', function () { diff --git a/core/test/unit/import_spec.js b/core/test/unit/import_spec.js index bd23779a6c..573512f581 100644 --- a/core/test/unit/import_spec.js +++ b/core/test/unit/import_spec.js @@ -7,7 +7,7 @@ var testUtils = require('./testUtils'), errors = require('../../server/errorHandling'), // Stuff we are testing - knex = require("../../server/models/base").Knex, + knex = require("../../server/models/base").knex, migration = require('../../server/data/migration'), exporter = require('../../server/data/export'), importer = require('../../server/data/import'), diff --git a/core/test/unit/testUtils.js b/core/test/unit/testUtils.js index 7f1310c881..ad677dcfe5 100644 --- a/core/test/unit/testUtils.js +++ b/core/test/unit/testUtils.js @@ -1,4 +1,4 @@ -var knex = require('../../server/models/base').Knex, +var knex = require('../../server/models/base').knex, when = require('when'), migration = require("../../server/data/migration/"), Settings = require('../../server/models/settings').Settings, diff --git a/package.json b/package.json index 6ca24b7a18..218e2051f8 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "underscore": "1.5.1", "showdown": "0.3.1", "sqlite3": "2.1.16", - "bookshelf": "0.3.1", - "knex": "0.2.7-alpha", + "bookshelf": "0.5.7", + "knex": "0.4.11", "when": "2.2.1", "bcrypt-nodejs": "0.0.3", "node-uuid": "1.4.0",