0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-11 02:12:21 -05:00

Consistency in model method naming

- The API has the BREAD naming for methods
- The model now has findAll, findOne, findPage (where needed), edit, add and destroy, meaning it is similar but with a bit more flexibility
- browse, read, update, create, and delete, which were effectively just aliases, have all been removed.
- added jsDoc for the model methods
This commit is contained in:
Hannah Wolfe 2014-05-05 16:18:38 +01:00
parent fc1cbac7b8
commit 31fc84cefb
20 changed files with 262 additions and 257 deletions

View file

@ -77,7 +77,7 @@ readSettingsResult = function (settingsModels) {
if (settings.activeApps) {
res = filterPaths(apps, JSON.parse(settings.activeApps.value));
settings.availableApps = {
key: 'availableApps',
value: res,
@ -172,7 +172,7 @@ settings = {
if (!setting) {
return when.reject({type: 'NotFound', message: 'Unable to find setting: ' + options.key});
}
result[options.key] = setting;
return when(settingsResult(result));
@ -203,7 +203,7 @@ settings = {
return settingsResult(readResult, type);
});
}).otherwise(function (error) {
return dataProvider.Settings.read(key.key).then(function (result) {
return dataProvider.Settings.findOne(key.key).then(function (result) {
if (!result) {
return when.reject({type: 'NotFound', message: 'Unable to find setting: ' + key + '.'});
}
@ -212,7 +212,7 @@ settings = {
});
}
return dataProvider.Settings.read(key).then(function (setting) {
return dataProvider.Settings.findOne(key).then(function (setting) {
if (!setting) {
return when.reject({type: 'NotFound', message: 'Unable to find setting: ' + key + '.'});
}

View file

@ -22,7 +22,7 @@ users = {
browse: function browse(options) {
// **returns:** a promise for a collection of users in a json object
return canThis(this.user).browse.user().then(function () {
return dataProvider.User.browse(options).then(function (result) {
return dataProvider.User.findAll(options).then(function (result) {
var omitted = {},
i;
@ -49,7 +49,7 @@ users = {
args = {id: this.user};
}
return dataProvider.User.read(args).then(function (result) {
return dataProvider.User.findOne(args).then(function (result) {
if (result) {
var omitted = _.omit(result.toJSON(), filteredAttributes);
return { users: [omitted] };
@ -150,7 +150,7 @@ users = {
},
doesUserExist: function doesUserExist() {
return dataProvider.User.browse().then(function (users) {
return dataProvider.User.findAll().then(function (users) {
if (users.length === 0) {
return false;
}

View file

@ -1,3 +1,10 @@
// # Base Model
// This is the model from which all other Ghost models extend. The model is based on Bookshelf.Model, and provides
// several basic behaviours such as UUIDs, as well as a set of Data methods for accessing information from the database.
//
// The models are internal to Ghost, only the API and some internal functions such as migration and import/export
// accesses the models directly. All other parts of Ghost, including the blog frontend, admin UI, and apps are only
// allowed to access data via the API.
var Bookshelf = require('bookshelf'),
when = require('when'),
moment = require('moment'),
@ -11,17 +18,19 @@ var Bookshelf = require('bookshelf'),
ghostBookshelf;
// Initializes a new Bookshelf instance, for reference elsewhere in Ghost.
// ### ghostBookshelf
// Initializes a new Bookshelf instance called ghostBookshelf, for reference elsewhere in Ghost.
ghostBookshelf = Bookshelf.ghost = Bookshelf.initialize(config().database);
ghostBookshelf.client = config().database.client;
// ### ghostBookshelf.Model
// 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({
hasTimestamps: true,
// get permitted attributs from schema.js
// Get permitted attributes from server/data/schema.js, which is where the DB schema is defined
permittedAttributes: function () {
return _.keys(schema.tables[this.tableName]);
},
@ -145,9 +154,13 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
}, {
// ## Model Data Functions
/**
* Naive find all
* ### Find All
* Naive find all fetches all the data for a particular model
* @param {Object} options (optional)
* @return {Promise(ghostBookshelf.Collection)} Collection of all Models
*/
findAll: function (options) {
options = options || {};
@ -161,50 +174,44 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
});
},
browse: function () {
return this.findAll.apply(this, arguments);
},
/**
* Naive find one where args match
* @param {Object} args
* ### Find One
* Naive find one where data determines what to match on
* @param {Object} data
* @param {Object} options (optional)
* @return {Promise(ghostBookshelf.Model)} Single Model
*/
findOne: function (args, options) {
findOne: function (data, options) {
options = options || {};
return this.forge(args, {include: options.include}).fetch(options);
},
read: function () {
return this.findOne.apply(this, arguments);
return this.forge(data, {include: options.include}).fetch(options);
},
/**
* ### Edit
* Naive edit
* @param {Object} editedObj
* @param {Object} data
* @param {Object} options (optional)
* @return {Promise(ghostBookshelf.Model)} Edited Model
*/
edit: function (editedObj, options) {
edit: function (data, options) {
options = options || {};
return this.forge({id: editedObj.id}).fetch(options).then(function (foundObj) {
if (foundObj) {
return foundObj.save(editedObj, options);
return this.forge({id: data.id}).fetch(options).then(function (object) {
if (object) {
return object.save(data, options);
}
});
},
update: function () {
return this.edit.apply(this, arguments);
},
/**
* Naive create
* @param {Object} newObj
* ### Add
* Naive add
* @param {Object} data
* @param {Object} options (optional)
* @return {Promise(ghostBookshelf.Model)} Newly Added Model
*/
add: function (newObj, options) {
add: function (data, options) {
options = options || {};
var instance = this.forge(newObj);
var instance = this.forge(data);
// We allow you to disable timestamps
// when importing posts so that
// the new posts `updated_at` value
@ -216,27 +223,27 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
return instance.save(null, options);
},
create: function () {
return this.add.apply(this, arguments);
/**
* ### Destroy
* Naive destroy
* @param {Object} data
* @param {Object} options (optional)
* @return {Promise(ghostBookshelf.Model)} Empty Model
*/
destroy: function (data, options) {
options = options || {};
return this.forge({id: data}).destroy(options);
},
/**
* Naive destroy
* @param {Object} _identifier
* @param {Object} options (optional)
*/
destroy: function (_identifier, options) {
options = options || {};
return this.forge({id: _identifier}).destroy(options);
},
'delete': function () {
return this.destroy.apply(this, arguments);
},
// #### generateSlug
// Create a string act as the permalink for an object.
generateSlug: function (Model, base, readOptions) {
* ### Generate Slug
* Create a string to act as the permalink for an object.
* @param {ghostBookshelf.Model} Model Model type to generate a slug for
* @param {String} base The string for which to generate a slug, usually a title or name
* @param {Object} options Options to pass to findOne
* @return {Promise(String)} Resolves to a unique slug string
*/
generateSlug: function (Model, base, options) {
var slug,
slugTryCount = 1,
baseName = Model.prototype.tableName.replace(/s$/, ''),
@ -246,10 +253,10 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
checkIfSlugExists = function (slugToFind) {
var args = {slug: slugToFind};
//status is needed for posts
if (readOptions && readOptions.status) {
args.status = readOptions.status;
if (options && options.status) {
args.status = options.status;
}
return Model.findOne(args, readOptions).then(function (found) {
return Model.findOne(args, options).then(function (found) {
var trimSpace;
if (!found) {
@ -304,4 +311,5 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
});
// Export ghostBookshelf for use elsewhere
module.exports = ghostBookshelf;

View file

@ -23,12 +23,12 @@ module.exports = {
deleteAllContent: function () {
var self = this;
return self.Post.browse().then(function (posts) {
return self.Post.findAll().then(function (posts) {
return when.all(_.map(posts.toJSON(), function (post) {
return self.Post.destroy(post.id);
}));
}).then(function () {
return self.Tag.browse().then(function (tags) {
return self.Tag.findAll().then(function (tags) {
return when.all(_.map(tags.toJSON(), function (tag) {
return self.Tag.destroy(tag.id);
}));

View file

@ -1,3 +1,4 @@
// # Post Model
var _ = require('lodash'),
uuid = require('node-uuid'),
when = require('when'),
@ -225,12 +226,13 @@ Post = ghostBookshelf.Model.extend({
attrs.author = attrs.author || attrs.author_id;
delete attrs.author_id;
return attrs;
}
}, {
// #### findAll
// Extends base model findAll to eager-fetch author and user relationships.
findAll: function (options) {
@ -239,24 +241,6 @@ Post = ghostBookshelf.Model.extend({
return ghostBookshelf.Model.findAll.call(this, options);
},
// #### findOne
// Extends base model findOne to eager-fetch author and user relationships.
findOne: function (args, options) {
options = options || {};
args = _.extend({
status: 'published'
}, args || {});
if (args.status === 'all') {
delete args.status;
}
// Add related objects
options.withRelated = _.union([ 'tags', 'fields' ], options.include);
return ghostBookshelf.Model.findOne.call(this, args, options);
},
// #### findPage
// Find results by page - returns an object containing the
@ -276,51 +260,51 @@ Post = ghostBookshelf.Model.extend({
// }
/*
* @params {Object} opts
* @params {Object} options
*/
findPage: function (opts) {
findPage: function (options) {
options = options || {};
var postCollection = Posts.forge(),
tagInstance = opts.tag !== undefined ? Tag.forge({slug: opts.tag}) : false,
tagInstance = options.tag !== undefined ? Tag.forge({slug: options.tag}) : false,
permittedOptions = ['page', 'limit', 'status', 'staticPages', 'include'];
// sanitize opts so we are not automatically passing through any and all
// query strings to Bookshelf / Knex. Although the API requires auth, we
// should prevent this until such time as we can design the API properly and safely.
opts = _.pick(opts, permittedOptions);
// sanitize options so we are not automatically passing through any and all query strings to Bookshelf / Knex.
options = _.pick(options, permittedOptions);
// Set default settings for options
opts = _.extend({
options = _.extend({
page: 1, // pagination page
limit: 15,
staticPages: false, // include static pages
status: 'published',
where: {}
}, opts);
}, options);
if (opts.staticPages !== 'all') {
if (options.staticPages !== 'all') {
// convert string true/false to boolean
if (!_.isBoolean(opts.staticPages)) {
opts.staticPages = opts.staticPages === 'true' || opts.staticPages === '1' ? true : false;
if (!_.isBoolean(options.staticPages)) {
options.staticPages = options.staticPages === 'true' || options.staticPages === '1' ? true : false;
}
opts.where.page = opts.staticPages;
options.where.page = options.staticPages;
}
// Unless `all` is passed as an option, filter on
// the status provided.
if (opts.status !== 'all') {
if (options.status !== 'all') {
// make sure that status is valid
opts.status = _.indexOf(['published', 'draft'], opts.status) !== -1 ? opts.status : 'published';
opts.where.status = opts.status;
options.status = _.indexOf(['published', 'draft'], options.status) !== -1 ? options.status : 'published';
options.where.status = options.status;
}
// If there are where conditionals specified, add those
// to the query.
if (opts.where) {
postCollection.query('where', opts.where);
if (options.where) {
postCollection.query('where', options.where);
}
// Add related objects
opts.withRelated = _.union([ 'tags', 'fields' ], opts.include);
options.withRelated = _.union([ 'tags', 'fields' ], options.include);
// If a query param for a tag is attached
// we need to fetch the tag model to find its id
@ -347,12 +331,12 @@ Post = ghostBookshelf.Model.extend({
.query('where', 'posts_tags.tag_id', '=', tagInstance.id);
}
return postCollection
.query('limit', opts.limit)
.query('offset', opts.limit * (opts.page - 1))
.query('limit', options.limit)
.query('offset', options.limit * (options.page - 1))
.query('orderBy', 'status', 'ASC')
.query('orderBy', 'published_at', 'DESC')
.query('orderBy', 'updated_at', 'DESC')
.fetch(_.omit(opts, 'page', 'limit'));
.fetch(_.omit(options, 'page', 'limit'));
})
// Fetch pagination information
@ -365,8 +349,8 @@ Post = ghostBookshelf.Model.extend({
// the limits are for the pagination values.
qb = ghostBookshelf.knex(tableName);
if (opts.where) {
qb.where(opts.where);
if (options.where) {
qb.where(options.where);
}
if (tagInstance) {
@ -380,21 +364,21 @@ Post = ghostBookshelf.Model.extend({
// Format response of data
.then(function (resp) {
var totalPosts = parseInt(resp[0].aggregate, 10),
calcPages = Math.ceil(totalPosts / opts.limit),
calcPages = Math.ceil(totalPosts / options.limit),
pagination = {},
meta = {},
data = {};
pagination['page'] = parseInt(opts.page, 10);
pagination['limit'] = opts.limit;
pagination['page'] = parseInt(options.page, 10);
pagination['limit'] = options.limit;
pagination['pages'] = calcPages === 0 ? 1 : calcPages;
pagination['total'] = totalPosts;
pagination['next'] = null;
pagination['prev'] = null;
if (opts.include) {
if (options.include) {
_.each(postCollection.models, function (item) {
item.include = opts.include;
item.include = options.include;
});
}
@ -425,26 +409,25 @@ Post = ghostBookshelf.Model.extend({
.catch(errors.logAndThrowError);
},
permissable: function (postModelOrId, context) {
var self = this,
userId = context.user,
postModel = postModelOrId;
// #### findOne
// Extends base model read to eager-fetch author and user relationships.
findOne: function (args, options) {
options = options || {};
// If we passed in an id instead of a model, get the model
// then check the permissions
if (_.isNumber(postModelOrId) || _.isString(postModelOrId)) {
return this.read({id: postModelOrId, status: 'all'}).then(function (foundPostModel) {
return self.permissable(foundPostModel, context);
}, errors.logAndThrowError);
args = _.extend({
status: 'published'
}, args || {});
if (args.status === 'all') {
delete args.status;
}
// If this is the author of the post, allow it.
if (postModel && userId === postModel.get('author_id')) {
return when.resolve();
}
// Add related objects
options.withRelated = _.union([ 'tags', 'fields' ], options.include);
return when.reject();
return ghostBookshelf.Model.findOne.call(this, args, options);
},
add: function (newPostData, options) {
var self = this;
options = options || {};
@ -480,6 +463,27 @@ Post = ghostBookshelf.Model.extend({
return post.destroy(options);
});
},
permissable: function (postModelOrId, context) {
var self = this,
userId = context.user,
postModel = postModelOrId;
// If we passed in an id instead of a model, get the model
// then check the permissions
if (_.isNumber(postModelOrId) || _.isString(postModelOrId)) {
return this.findOne({id: postModelOrId, status: 'all'}).then(function (foundPostModel) {
return self.permissable(foundPostModel, context);
}, errors.logAndThrowError);
}
// If this is the author of the post, allow it.
if (postModel && userId === postModel.get('author_id')) {
return when.resolve();
}
return when.reject();
}
});

View file

@ -58,12 +58,12 @@ Settings = ghostBookshelf.Model.extend({
}
}, {
read: function (_key) {
findOne: function (_key) {
// Allow for just passing the key instead of attributes
if (!_.isObject(_key)) {
_key = { key: _key };
}
return when(ghostBookshelf.Model.read.call(this, _key));
return when(ghostBookshelf.Model.findOne.call(this, _key));
},
edit: function (_data, options) {

View file

@ -147,7 +147,7 @@ User = ghostBookshelf.Model.extend({
// If we passed in an id instead of a model, get the model
// then check the permissions
if (_.isNumber(userModelOrId) || _.isString(userModelOrId)) {
return this.read({id: userModelOrId}).then(function (foundUserModel) {
return this.findOne({id: userModelOrId}).then(function (foundUserModel) {
return self.permissable(foundUserModel, context);
}, errors.logAndThrowError);
}

View file

@ -6,7 +6,7 @@ var _ = require('lodash'),
var effective = {
user: function (id) {
return User.read({id: id}, { withRelated: ['permissions', 'roles.permissions'] })
return User.findOne({id: id}, { withRelated: ['permissions', 'roles.permissions'] })
.then(function (foundUser) {
var seenPerms = {},
rolePerms = _.map(foundUser.related('roles').models, function (role) {
@ -35,7 +35,7 @@ var effective = {
},
app: function (appName) {
return App.read({name: appName}, { withRelated: ['permissions'] })
return App.findOne({name: appName}, { withRelated: ['permissions'] })
.then(function (foundApp) {
if (!foundApp) {
return [];

View file

@ -30,7 +30,7 @@ function parseContext(context) {
user: null,
app: null
};
if (context && (context === 'internal' || context.internal)) {
parsed.internal = true;
}
@ -158,7 +158,7 @@ CanThisResult.prototype.beginCheck = function (context) {
// Resolve null if no context.user to prevent db call
userPermissionLoad = when.resolve(null);
}
// Kick off loading of effective app permissions if necessary
if (context.app) {
@ -204,7 +204,7 @@ canThis = function (context) {
init = refresh = function () {
// Load all the permissions
return PermissionsProvider.browse().then(function (perms) {
return PermissionsProvider.findAll().then(function (perms) {
var seenActions = {};
exported.actionsMap = {};

View file

@ -38,9 +38,9 @@ describe('DB API', function () {
it('delete all content', function (done) {
permissions.init().then(function () {
return dbAPI.deleteAllContent.call({user: 1});
}).then(function (result){
}).then(function (result) {
should.exist(result.message);
result.message.should.equal('Successfully deleted all content from your blog.')
result.message.should.equal('Successfully deleted all content from your blog.');
}).then(function () {
TagsAPI.browse().then(function (results) {
should.exist(results);
@ -54,7 +54,7 @@ describe('DB API', function () {
done();
});
}).catch(function (error) {
done(new Error(JSON.stringify(error)));
done('error', error);
});
});

View file

@ -39,8 +39,8 @@ describe('App Fields Model', function () {
}).catch(done);
});
it('can browse', function (done) {
AppFieldsModel.browse().then(function (results) {
it('can findAll', function (done) {
AppFieldsModel.findAll().then(function (results) {
should.exist(results);
@ -50,8 +50,8 @@ describe('App Fields Model', function () {
}).catch(done);
});
it('can read', function (done) {
AppFieldsModel.read({id: 1}).then(function (foundAppField) {
it('can findOne', function (done) {
AppFieldsModel.findOne({id: 1}).then(function (foundAppField) {
should.exist(foundAppField);
done();
@ -59,12 +59,12 @@ describe('App Fields Model', function () {
});
it('can edit', function (done) {
AppFieldsModel.read({id: 1}).then(function (foundAppField) {
AppFieldsModel.findOne({id: 1}).then(function (foundAppField) {
should.exist(foundAppField);
return foundAppField.set({value: "350"}).save();
}).then(function () {
return AppFieldsModel.read({id: 1});
return AppFieldsModel.findOne({id: 1});
}).then(function (updatedAppField) {
should.exist(updatedAppField);

View file

@ -39,8 +39,8 @@ describe('App Setting Model', function () {
}).catch(done);
});
it('can browse', function (done) {
AppSettingModel.browse().then(function (results) {
it('can findAll', function (done) {
AppSettingModel.findAll().then(function (results) {
should.exist(results);
@ -50,8 +50,8 @@ describe('App Setting Model', function () {
}).catch(done);
});
it('can read', function (done) {
AppSettingModel.read({id: 1}).then(function (foundAppSetting) {
it('can findOne', function (done) {
AppSettingModel.findOne({id: 1}).then(function (foundAppSetting) {
should.exist(foundAppSetting);
done();
@ -59,12 +59,12 @@ describe('App Setting Model', function () {
});
it('can edit', function (done) {
AppSettingModel.read({id: 1}).then(function (foundAppSetting) {
AppSettingModel.findOne({id: 1}).then(function (foundAppSetting) {
should.exist(foundAppSetting);
return foundAppSetting.set({value: "350"}).save();
}).then(function () {
return AppSettingModel.read({id: 1});
return AppSettingModel.findOne({id: 1});
}).then(function (updatedAppSetting) {
should.exist(updatedAppSetting);

View file

@ -39,8 +39,8 @@ describe('App Model', function () {
}).catch(done);
});
it('can browse', function (done) {
AppModel.browse().then(function (results) {
it('can findAll', function (done) {
AppModel.findAll().then(function (results) {
should.exist(results);
@ -50,8 +50,8 @@ describe('App Model', function () {
}).catch(done);
});
it('can read', function (done) {
AppModel.read({id: 1}).then(function (foundApp) {
it('can findOne', function (done) {
AppModel.findOne({id: 1}).then(function (foundApp) {
should.exist(foundApp);
done();
@ -59,12 +59,12 @@ describe('App Model', function () {
});
it('can edit', function (done) {
AppModel.read({id: 1}).then(function (foundApp) {
AppModel.findOne({id: 1}).then(function (foundApp) {
should.exist(foundApp);
return foundApp.set({name: "New App"}).save();
}).then(function () {
return AppModel.read({id: 1});
return AppModel.findOne({id: 1});
}).then(function (updatedApp) {
should.exist(updatedApp);
@ -87,12 +87,12 @@ describe('App Model', function () {
});
it("can delete", function (done) {
AppModel.read({id: 1}).then(function (foundApp) {
AppModel.findOne({id: 1}).then(function (foundApp) {
should.exist(foundApp);
return AppModel['delete'](1);
return AppModel.destroy(1);
}).then(function () {
return AppModel.browse();
return AppModel.findAll();
}).then(function (foundApp) {
var hasRemovedId = foundApp.any(function (foundApp) {
return foundApp.id === 1;

View file

@ -6,7 +6,7 @@ var testUtils = require('../../utils'),
// Stuff we are testing
Models = require('../../../server/models');
describe("Permission Model", function () {
describe('Permission Model', function () {
var PermissionModel = Models.Permission;
@ -30,8 +30,8 @@ describe("Permission Model", function () {
}).catch(done);
});
it("can browse permissions", function (done) {
PermissionModel.browse().then(function (foundPermissions) {
it('can findAll', function (done) {
PermissionModel.findAll().then(function (foundPermissions) {
should.exist(foundPermissions);
foundPermissions.models.length.should.be.above(0);
@ -40,21 +40,21 @@ describe("Permission Model", function () {
}).then(null, done);
});
it("can read permissions", function (done) {
PermissionModel.read({id: 1}).then(function (foundPermission) {
it('can findOne', function (done) {
PermissionModel.findOne({id: 1}).then(function (foundPermission) {
should.exist(foundPermission);
done();
}).catch(done);
});
it("can edit permissions", function (done) {
PermissionModel.read({id: 1}).then(function (foundPermission) {
it('can edit', function (done) {
PermissionModel.findOne({id: 1}).then(function (foundPermission) {
should.exist(foundPermission);
return foundPermission.set({name: "updated"}).save();
}).then(function () {
return PermissionModel.read({id: 1});
return PermissionModel.findOne({id: 1});
}).then(function (updatedPermission) {
should.exist(updatedPermission);
@ -64,9 +64,9 @@ describe("Permission Model", function () {
}).catch(done);
});
it("can add permissions", function (done) {
it('can add', function (done) {
var newPerm = {
name: "testperm1",
name: 'testperm1',
object_type: 'test',
action_type: 'test'
};
@ -80,13 +80,13 @@ describe("Permission Model", function () {
}).catch(done);
});
it("can delete permissions", function (done) {
PermissionModel.read({id: 1}).then(function (foundPermission) {
it('can delete', function (done) {
PermissionModel.findOne({id: 1}).then(function (foundPermission) {
should.exist(foundPermission);
return PermissionModel['delete'](1);
return PermissionModel.destroy(1);
}).then(function () {
return PermissionModel.browse();
return PermissionModel.findAll();
}).then(function (foundPermissions) {
var hasRemovedId = foundPermissions.any(function (permission) {
return permission.id === 1;

View file

@ -35,8 +35,8 @@ describe('Post Model', function () {
}).catch(done);
});
it('can browse', function (done) {
PostModel.browse().then(function (results) {
it('can findAll', function (done) {
PostModel.findAll().then(function (results) {
should.exist(results);
results.length.should.be.above(1);
@ -48,18 +48,19 @@ describe('Post Model', function () {
}).catch(done);
});
it('can read', function (done) {
it('can findOne', function (done) {
var firstPost;
PostModel.browse().then(function (results) {
PostModel.findPage().then(function (results) {
should.exist(results);
results.length.should.be.above(0);
firstPost = results.models[0];
should.exist(results.posts);
results.posts.length.should.be.above(0);
firstPost = results.posts[0];
return PostModel.read({slug: firstPost.attributes.slug});
return PostModel.findOne({slug: firstPost.slug});
}).then(function (found) {
should.exist(found);
found.attributes.title.should.equal(firstPost.attributes.title);
found.attributes.title.should.equal(firstPost.title);
done();
}).catch(done);
@ -103,7 +104,7 @@ describe('Post Model', function () {
it('can edit', function (done) {
var firstPost;
PostModel.browse().then(function (results) {
PostModel.findAll().then(function (results) {
should.exist(results);
results.length.should.be.above(0);
firstPost = results.models[0];
@ -314,7 +315,7 @@ describe('Post Model', function () {
// Should not have a conflicted slug from the first
updatedSecondPost.get('slug').should.not.equal(firstPost.slug);
return PostModel.read({
return PostModel.findOne({
id: updatedSecondPost.id,
status: 'all'
});
@ -331,28 +332,21 @@ describe('Post Model', function () {
it('can delete', function (done) {
var firstPostId;
PostModel.browse().then(function (results) {
PostModel.findAll().then(function (results) {
should.exist(results);
results.length.should.be.above(0);
firstPostId = results.models[0].id;
return PostModel.destroy(firstPostId);
}).then(function () {
return PostModel.browse();
return PostModel.findOne({id: firstPostId});
}).then(function (newResults) {
var ids, hasDeletedId;
ids = _.pluck(newResults.models, 'id');
hasDeletedId = _.any(ids, function (id) {
return id === firstPostId;
});
hasDeletedId.should.equal(false);
should.equal(newResults, null);
done();
}).catch(done);
});
it('can fetch a paginated set, with various options', function (done) {
it('can findPage, with various options', function (done) {
testUtils.insertMorePosts().then(function () {
return testUtils.insertMorePostsTags();

View file

@ -1,12 +1,11 @@
/*globals describe, it, before, beforeEach, afterEach */
var testUtils = require('../../utils'),
should = require('should'),
errors = require('../../../server/errorHandling'),
// Stuff we are testing
Models = require('../../../server/models');
describe("Role Model", function () {
describe('Role Model', function () {
var RoleModel = Models.Role;
@ -30,8 +29,8 @@ describe("Role Model", function () {
}).catch(done);
});
it("can browse roles", function (done) {
RoleModel.browse().then(function (foundRoles) {
it('can findAll', function (done) {
RoleModel.findAll().then(function (foundRoles) {
should.exist(foundRoles);
foundRoles.models.length.should.be.above(0);
@ -40,34 +39,34 @@ describe("Role Model", function () {
}).catch(done);
});
it("can read roles", function (done) {
RoleModel.read({id: 1}).then(function (foundRole) {
it('can findOne', function (done) {
RoleModel.findOne({id: 1}).then(function (foundRole) {
should.exist(foundRole);
done();
}).catch(done);
});
it("can edit roles", function (done) {
RoleModel.read({id: 1}).then(function (foundRole) {
it('can edit', function (done) {
RoleModel.findOne({id: 1}).then(function (foundRole) {
should.exist(foundRole);
return foundRole.set({name: "updated"}).save();
return foundRole.set({name: 'updated'}).save();
}).then(function () {
return RoleModel.read({id: 1});
return RoleModel.findOne({id: 1});
}).then(function (updatedRole) {
should.exist(updatedRole);
updatedRole.get("name").should.equal("updated");
updatedRole.get('name').should.equal('updated');
done();
}).catch(done);
});
it("can add roles", function (done) {
it('can add', function (done) {
var newRole = {
name: "test1",
description: "test1 description"
name: 'test1',
description: 'test1 description'
};
RoleModel.add(newRole, {user: 1}).then(function (createdRole) {
@ -80,13 +79,13 @@ describe("Role Model", function () {
}).catch(done);
});
it("can delete roles", function (done) {
RoleModel.read({id: 1}).then(function (foundRole) {
it('can delete', function (done) {
RoleModel.findOne({id: 1}).then(function (foundRole) {
should.exist(foundRole);
return RoleModel['delete'](1);
}).then(function () {
return RoleModel.browse();
return RoleModel.destroy(1);
}).then(function (destResp) {
return RoleModel.findAll();
}).then(function (foundRoles) {
var hasRemovedId = foundRoles.any(function (role) {
return role.id === 1;

View file

@ -37,8 +37,8 @@ describe('Settings Model', function () {
describe('API', function () {
it('can browse', function (done) {
SettingsModel.browse().then(function (results) {
it('can findAll', function (done) {
SettingsModel.findAll().then(function (results) {
should.exist(results);
@ -48,10 +48,10 @@ describe('Settings Model', function () {
}).catch(done);
});
it('can read', function (done) {
it('can findOne', function (done) {
var firstSetting;
SettingsModel.browse().then(function (results) {
SettingsModel.findAll().then(function (results) {
should.exist(results);
@ -59,7 +59,7 @@ describe('Settings Model', function () {
firstSetting = results.models[0];
return SettingsModel.read(firstSetting.attributes.key);
return SettingsModel.findOne(firstSetting.attributes.key);
}).then(function (found) {
@ -74,7 +74,7 @@ describe('Settings Model', function () {
it('can edit single', function (done) {
SettingsModel.browse().then(function (results) {
SettingsModel.findAll().then(function (results) {
should.exist(results);
@ -103,7 +103,7 @@ describe('Settings Model', function () {
model2,
editedModel;
SettingsModel.browse().then(function (results) {
SettingsModel.findAll().then(function (results) {
should.exist(results);
@ -156,7 +156,7 @@ describe('Settings Model', function () {
it('can delete', function (done) {
var settingId;
SettingsModel.browse().then(function (results) {
SettingsModel.findAll().then(function (results) {
should.exist(results);
@ -170,13 +170,13 @@ describe('Settings Model', function () {
}).then(function () {
return SettingsModel.browse();
return SettingsModel.findAll();
}).then(function (newResults) {
var ids, hasDeletedId;
ids = _.pluck(newResults.models, "id");
ids = _.pluck(newResults.models, 'id');
hasDeletedId = _.any(ids, function (id) {
return id === settingId;
@ -207,7 +207,7 @@ describe('Settings Model', function () {
}).then(function (allSettings) {
allSettings.length.should.be.above(0);
return SettingsModel.read('description');
return SettingsModel.findOne('description');
}).then(function (descriptionSetting) {
// Testing against the actual value in default-settings.json feels icky,
// but it's easier to fix the test if that ever changes than to mock out that behaviour
@ -220,7 +220,7 @@ describe('Settings Model', function () {
SettingsModel.add({key: 'description', value: 'Adam\'s Blog'}, {user: 1}).then(function () {
return SettingsModel.populateDefaults();
}).then(function () {
return SettingsModel.read('description');
return SettingsModel.findOne('description');
}).then(function (descriptionSetting) {
descriptionSetting.get('value').should.equal('Adam\'s Blog');
done();

View file

@ -49,7 +49,7 @@ describe('Tag Model', function () {
createdPostID = createdPost.id;
return createdPost.tags().attach(createdTag);
}).then(function () {
return PostModel.read({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
}).then(function (postWithTag) {
postWithTag.related('tags').length.should.equal(1);
done();
@ -77,11 +77,11 @@ describe('Tag Model', function () {
createdTagID = createdTag.id;
return createdPost.tags().attach(createdTag);
}).then(function () {
return PostModel.read({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
}).then(function (postWithTag) {
return postWithTag.tags().detach(createdTagID);
}).then(function () {
return PostModel.read({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: createdPostID, status: 'all'}, { withRelated: ['tags']});
}).then(function (postWithoutTag) {
postWithoutTag.related('tags').length.should.equal(0);
done();
@ -114,7 +114,7 @@ describe('Tag Model', function () {
return postModel;
});
}).then(function (postModel) {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
});
}
@ -149,7 +149,7 @@ describe('Tag Model', function () {
tagData.splice(1, 1);
return postModel.set('tags', tagData).save();
}).then(function (postModel) {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagNames = reloadedPost.related('tags').models.map(function (t) { return t.attributes.name; });
tagNames.sort().should.eql(['tag1', 'tag3']);
@ -173,13 +173,13 @@ describe('Tag Model', function () {
tagData.push({id: 3, name: 'tag3'});
return postModel.set('tags', tagData).save();
}).then(function () {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagModels = reloadedPost.related('tags').models,
tagNames = tagModels.map(function (t) { return t.attributes.name; }),
tagIds = _.pluck(tagModels, 'id');
tagNames.sort().should.eql(['tag1', 'tag2', 'tag3']);
// make sure it hasn't just added a new tag with the same name
// Don't expect a certain order in results - check for number of items!
Math.max.apply(Math, tagIds).should.eql(4);
@ -199,7 +199,7 @@ describe('Tag Model', function () {
tagData.push({id: null, name: 'tag3'});
return postModel.set('tags', tagData).save(null, {user: 1});
}).then(function (postModel) {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagNames = reloadedPost.related('tags').models.map(function (t) { return t.attributes.name; });
tagNames.sort().should.eql(['tag1', 'tag2', 'tag3']);
@ -220,7 +220,7 @@ describe('Tag Model', function () {
tagData.push({id: null, name: 'tag3'});
return postModel.set('tags', tagData).save(null, {user: 1});
}).then(function (postModel) {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagNames = reloadedPost.related('tags').models.map(function (t) { return t.attributes.name; });
tagNames.sort().should.eql(['tag1', 'tag2', 'tag3']);
@ -248,14 +248,14 @@ describe('Tag Model', function () {
return postModel.set('tags', tagData).save(null, {user: 1});
}).then(function () {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagModels = reloadedPost.related('tags').models,
tagNames = tagModels.map(function (t) { return t.attributes.name; }),
tagIds = _.pluck(tagModels, 'id');
tagNames.sort().should.eql(['tag1', 'tag2', 'tag3']);
// make sure it hasn't just added a new tag with the same name
// Don't expect a certain order in results - check for number of items!
Math.max.apply(Math, tagIds).should.eql(4);
@ -284,7 +284,7 @@ describe('Tag Model', function () {
return postModel.set('tags', tagData).save(null, {user: 1});
}).then(function () {
return PostModel.read({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: postModel.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (reloadedPost) {
var tagModels = reloadedPost.related('tags').models,
tagNames = tagModels.map(function (t) { return t.get('name'); }),
@ -294,7 +294,7 @@ describe('Tag Model', function () {
// make sure it hasn't just added a new tag with the same name
// Don't expect a certain order in results - check for number of items!
Math.max.apply(Math, tagIds).should.eql(5);
Math.max.apply(Math, tagIds).should.eql(5);
done();
}).catch(done);
@ -304,7 +304,7 @@ describe('Tag Model', function () {
var newPost = _.extend(testUtils.DataGenerator.forModel.posts[0], {tags: [{name: 'test_tag_1'}]})
PostModel.add(newPost, {user: 1}).then(function (createdPost) {
return PostModel.read({id: createdPost.id, status: 'all'}, { withRelated: ['tags']});
return PostModel.findOne({id: createdPost.id, status: 'all'}, { withRelated: ['tags']});
}).then(function (postWithTag) {
postWithTag.related('tags').length.should.equal(1);
done();

View file

@ -159,9 +159,9 @@ describe('User Model', function run() {
}).catch(done);
});
it('can browse', function (done) {
it('can findAll', function (done) {
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
should.exist(results);
results.length.should.be.above(0);
@ -171,10 +171,10 @@ describe('User Model', function run() {
}).catch(done);
});
it('can read', function (done) {
it('can findOne', function (done) {
var firstUser;
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
should.exist(results);
@ -182,7 +182,7 @@ describe('User Model', function run() {
firstUser = results.models[0];
return UserModel.read({email: firstUser.attributes.email});
return UserModel.findOne({email: firstUser.attributes.email});
}).then(function (found) {
@ -199,7 +199,7 @@ describe('User Model', function run() {
it('can edit', function (done) {
var firstUser;
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
should.exist(results);
@ -223,7 +223,7 @@ describe('User Model', function run() {
it('can delete', function (done) {
var firstUserId;
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
should.exist(results);
@ -235,7 +235,7 @@ describe('User Model', function run() {
}).then(function () {
return UserModel.browse();
return UserModel.findAll();
}).then(function (newResults) {
var ids, hasDeletedId;
@ -261,7 +261,7 @@ describe('User Model', function run() {
var expires = Date.now() + 60000,
dbHash = uuid.v4();
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
return UserModel.generateResetToken(results.models[0].attributes.email, expires, dbHash);
@ -279,7 +279,7 @@ describe('User Model', function run() {
var expires = Date.now() + 60000,
dbHash = uuid.v4();
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
return UserModel.generateResetToken(results.models[0].attributes.email, expires, dbHash);
@ -300,7 +300,7 @@ describe('User Model', function run() {
expires = Date.now() + 60000,
dbHash = uuid.v4();
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
var firstUser = results.models[0],
origPassword = firstUser.attributes.password;
@ -330,7 +330,7 @@ describe('User Model', function run() {
expires = Date.now() - 60000,
dbHash = uuid.v4();
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
// Store email for later
email = results.models[0].attributes.email;
@ -356,7 +356,7 @@ describe('User Model', function run() {
var expires = Date.now() - 60000,
dbHash = uuid.v4();
UserModel.browse().then(function (results) {
UserModel.findAll().then(function (results) {
return UserModel.generateResetToken(results.models[0].attributes.email, expires, dbHash);

View file

@ -115,7 +115,7 @@ describe('Permissions', function () {
it('can add user to role', function (done) {
var existingUserRoles;
UserProvider.read({id: 1}, { withRelated: ['roles'] }).then(function (foundUser) {
UserProvider.findOne({id: 1}, { withRelated: ['roles'] }).then(function (foundUser) {
var testRole = new Models.Role({
name: 'testrole1',
description: 'testrole1 description'
@ -131,7 +131,7 @@ describe('Permissions', function () {
return foundUser.roles().attach(testRole);
});
}).then(function () {
return UserProvider.read({id: 1}, { withRelated: ['roles'] });
return UserProvider.findOne({id: 1}, { withRelated: ['roles'] });
}).then(function (updatedUser) {
should.exist(updatedUser);
@ -142,7 +142,7 @@ describe('Permissions', function () {
});
it('can add user permissions', function (done) {
Models.User.read({id: 1}, { withRelated: ['permissions']}).then(function (testUser) {
UserProvider.findOne({id: 1}, { withRelated: ['permissions']}).then(function (testUser) {
var testPermission = new Models.Permission({
name: "test edit posts",
action_type: 'edit',
@ -155,7 +155,7 @@ describe('Permissions', function () {
return testUser.permissions().attach(testPermission);
});
}).then(function () {
return Models.User.read({id: 1}, { withRelated: ['permissions']});
return UserProvider.findOne({id: 1}, { withRelated: ['permissions']});
}).then(function (updatedUser) {
should.exist(updatedUser);
@ -189,7 +189,7 @@ describe('Permissions', function () {
});
})
.then(function () {
return Models.Role.read({id: testRole.id}, { withRelated: ['permissions']});
return Models.Role.findOne({id: testRole.id}, { withRelated: ['permissions']});
})
.then(function (updatedRole) {
should.exist(updatedRole);
@ -208,7 +208,7 @@ describe('Permissions', function () {
createTestPermissions()
.then(permissions.init)
.then(function () {
return Models.User.read({id: 1});
return UserProvider.findOne({id: 1});
})
.then(function (foundUser) {
var canThisResult = permissions.canThis(foundUser);
@ -231,7 +231,7 @@ describe('Permissions', function () {
createTestPermissions()
.then(permissions.init)
.then(function () {
return Models.User.read({id: 1});
return UserProvider.findOne({id: 1});
})
.then(function (foundUser) {
var newPerm = new Models.Permission({
@ -245,7 +245,7 @@ describe('Permissions', function () {
});
})
.then(function () {
return Models.User.read({id: 1}, { withRelated: ['permissions']});
return UserProvider.findOne({id: 1}, { withRelated: ['permissions']});
})
.then(function (updatedUser) {
@ -270,7 +270,7 @@ describe('Permissions', function () {
testUtils.insertAuthorUser()
.then(function () {
return UserProvider.browse();
return UserProvider.findAll();
})
.then(function (foundUser) {
testUser = foundUser.models[1];
@ -299,7 +299,7 @@ describe('Permissions', function () {
testUtils.insertAuthorUser()
.then(function () {
return UserProvider.browse();
return UserProvider.findAll();
})
.then(function (foundUser) {
testUser = foundUser.models[1];
@ -345,7 +345,7 @@ describe('Permissions', function () {
PostProvider.edit({id: 1, 'author_id': 2})
.then(function (updatedPost) {
// Add user permissions
return Models.User.read({id: 1})
return UserProvider.findOne({id: 1})
.then(function (foundUser) {
var newPerm = new Models.Permission({
name: "app test edit post",