mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
parent
71e8bdfab9
commit
7f5250af0e
2 changed files with 83 additions and 33 deletions
|
@ -4,6 +4,9 @@ var Promise = require('bluebird'),
|
|||
canThis = require('../permissions').canThis,
|
||||
dataProvider = require('../models'),
|
||||
errors = require('../errors'),
|
||||
pipeline = require('../utils/pipeline'),
|
||||
utils = require('./utils'),
|
||||
docName = 'roles',
|
||||
|
||||
roles;
|
||||
|
||||
|
@ -27,29 +30,55 @@ roles = {
|
|||
* @returns {Promise(Roles)} Roles Collection
|
||||
*/
|
||||
browse: function browse(options) {
|
||||
options = options || {};
|
||||
var tasks;
|
||||
|
||||
return canThis(options.context).browse.role().then(function () {
|
||||
return dataProvider.Role.findAll(options).then(function (results) {
|
||||
var roles = results.map(function (r) {
|
||||
return r.toJSON();
|
||||
});
|
||||
/**
|
||||
* ### Handle Permissions
|
||||
* We need to be an authorised user.
|
||||
* @param {Object} options
|
||||
* @returns {Object} options
|
||||
*/
|
||||
function handlePermissions(options) {
|
||||
return canThis(options.context).browse.role().then(function () {
|
||||
return options;
|
||||
}).catch(function handleError(error) {
|
||||
return errors.handleAPIError(error, 'You do not have permission to browse roles.');
|
||||
});
|
||||
}
|
||||
|
||||
if (options.permissions !== 'assign') {
|
||||
return {roles: roles};
|
||||
}
|
||||
/**
|
||||
* ### Model Query
|
||||
* Make the call to the Model layer
|
||||
* @param {Object} options
|
||||
* @returns {Object} options
|
||||
*/
|
||||
function modelQuery(options) {
|
||||
return dataProvider.Role.findAll(options);
|
||||
}
|
||||
|
||||
return Promise.filter(roles.map(function (role) {
|
||||
return canThis(options.context).assign.role(role)
|
||||
// Push all of our tasks into a `tasks` array in the correct order
|
||||
tasks = [utils.validate(docName), handlePermissions, modelQuery];
|
||||
|
||||
// Pipeline calls each task passing the result of one to be the arguments for the next
|
||||
return pipeline(tasks, options).then(function formatResponse(results) {
|
||||
var roles = results.map(function (r) {
|
||||
return r.toJSON();
|
||||
});
|
||||
|
||||
if (options.permissions !== 'assign') {
|
||||
return {roles: roles};
|
||||
}
|
||||
|
||||
return Promise.filter(roles.map(function (role) {
|
||||
return canThis(options.context).assign.role(role)
|
||||
.return(role)
|
||||
.catch(function () {});
|
||||
}), function (value) {
|
||||
return value && value.name !== 'Owner';
|
||||
}).then(function (roles) {
|
||||
return {roles: roles};
|
||||
});
|
||||
}), function (value) {
|
||||
return value && value.name !== 'Owner';
|
||||
}).then(function (roles) {
|
||||
return {roles: roles};
|
||||
});
|
||||
}).catch(errors.logAndThrowError);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -4,6 +4,9 @@ var canThis = require('../permissions').canThis,
|
|||
dataProvider = require('../models'),
|
||||
errors = require('../errors'),
|
||||
Promise = require('bluebird'),
|
||||
pipeline = require('../utils/pipeline'),
|
||||
utils = require('./utils'),
|
||||
docName = 'slugs',
|
||||
|
||||
slugs,
|
||||
allowedTypes;
|
||||
|
@ -23,7 +26,7 @@ slugs = {
|
|||
* @returns {Promise(String)} Unique string
|
||||
*/
|
||||
generate: function (options) {
|
||||
options = options || {};
|
||||
var tasks;
|
||||
|
||||
// `allowedTypes` is used to define allowed slug types and map them against its model class counterpart
|
||||
allowedTypes = {
|
||||
|
@ -33,27 +36,45 @@ slugs = {
|
|||
app: dataProvider.App
|
||||
};
|
||||
|
||||
return canThis(options.context).generate.slug().then(function () {
|
||||
if (allowedTypes[options.type] === undefined) {
|
||||
return Promise.reject(new errors.BadRequestError('Unknown slug type \'' + options.type + '\'.'));
|
||||
}
|
||||
|
||||
return dataProvider.Base.Model.generateSlug(allowedTypes[options.type], options.name, {status: 'all'}).then(function (slug) {
|
||||
if (!slug) {
|
||||
return Promise.reject(new errors.InternalServerError('Could not generate slug.'));
|
||||
/**
|
||||
* ### Handle Permissions
|
||||
* We need to be an authorized user and use an allowedType
|
||||
* @param {Object} options
|
||||
* @returns {Object} options
|
||||
*/
|
||||
function handlePermissions(options) {
|
||||
return canThis(options.context).generate.slug().then(function () {
|
||||
if (allowedTypes[options.type] === undefined) {
|
||||
return Promise.reject(new errors.BadRequestError('Unknown slug type \'' + options.type + '\'.'));
|
||||
}
|
||||
|
||||
return {slugs: [{slug: slug}]};
|
||||
return options;
|
||||
}).catch(function handleError(error) {
|
||||
return errors.handleAPIError(error, 'You do not have permission to generate a slug.');
|
||||
});
|
||||
}).catch(function (err) {
|
||||
if (err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
/**
|
||||
* ### Model Query
|
||||
* Make the call to the Model layer
|
||||
* @param {Object} options
|
||||
* @returns {Object} options
|
||||
*/
|
||||
function modelQuery(options) {
|
||||
return dataProvider.Base.Model.generateSlug(allowedTypes[options.type], options.name, {status: 'all'});
|
||||
}
|
||||
|
||||
// Push all of our tasks into a `tasks` array in the correct order
|
||||
tasks = [utils.validate(docName), handlePermissions, modelQuery];
|
||||
|
||||
// Pipeline calls each task passing the result of one to be the arguments for the next
|
||||
return pipeline(tasks, options).then(function (slug) {
|
||||
if (!slug) {
|
||||
return Promise.reject(new errors.InternalServerError('Could not generate slug.'));
|
||||
}
|
||||
|
||||
return Promise.reject(new errors.NoPermissionError('You do not have permission to generate a slug.'));
|
||||
return {slugs: [{slug: slug}]};
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = slugs;
|
||||
|
|
Loading…
Add table
Reference in a new issue