diff --git a/core/server/models/base.js b/core/server/models/base.js index c96c85f62e69..e23e17de2fa9 100644 --- a/core/server/models/base.js +++ b/core/server/models/base.js @@ -85,7 +85,9 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({ var self = this; _.each(attrs, function (value, key) { - if (value !== null && schema.tables[self.tableName][key].type === 'dateTime') { + if (value !== null + && schema.tables[self.tableName].hasOwnProperty(key) + && schema.tables[self.tableName][key].type === 'dateTime') { // convert dateTime value into a native javascript Date object attrs[key] = moment(value).toDate(); } @@ -98,7 +100,8 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({ fixBools: function (attrs) { var self = this; _.each(attrs, function (value, key) { - if (schema.tables[self.tableName][key].type === 'bool') { + if (schema.tables[self.tableName].hasOwnProperty(key) + && schema.tables[self.tableName][key].type === 'bool') { attrs[key] = value ? true : false; } }); diff --git a/core/server/models/user.js b/core/server/models/user.js index 28530c19825b..979ba2b1b44e 100644 --- a/core/server/models/user.js +++ b/core/server/models/user.js @@ -301,7 +301,8 @@ User = ghostBookshelf.Model.extend({ edit: function (data, options) { var self = this, adminRole, - ownerRole; + ownerRole, + roleId; options = options || {}; options.withRelated = _.union([ 'roles' ], options.include); @@ -309,6 +310,7 @@ User = ghostBookshelf.Model.extend({ return ghostBookshelf.Model.edit.call(this, data, options).then(function (user) { if (data.roles) { + roleId = parseInt(data.roles[0].id || data.roles[0], 10); if (user.id === options.context.user) { return when.reject(new errors.ValidationError('You are not allowed to assign a new role to yourself')); @@ -316,7 +318,14 @@ User = ghostBookshelf.Model.extend({ if (data.roles.length > 1) { return when.reject(new errors.ValidationError('Only one role per user is supported at the moment.')); } - return Role.findOne({id: data.roles[0].id || data.roles[0]}).then(function (role) { + + return user.roles().fetch().then(function (roles) { + // return if the role is already assigned + if (roles.models[0].id === roleId) { + return user; + } + return Role.findOne({id: roleId}); + }).then(function (role) { if (role && role.get('name') === 'Owner') { // Get admin and owner role return Role.findOne({name: 'Administrator'}).then(function (result) { @@ -339,7 +348,7 @@ User = ghostBookshelf.Model.extend({ }); } else { // assign all other roles - return user.roles().updatePivot({role_id: data.roles[0].id || data.roles[0]}); + return user.roles().updatePivot({role_id: roleId}); } }).then(function () { return self.findOne(user, options);