Skip to content

Commit

Permalink
apply pipeline to notifications endpoint
Browse files Browse the repository at this point in the history
refs TryGhost#5508
- adds pipeline to the add and destroy methods of the notifications api
  • Loading branch information
acburdine committed Aug 10, 2015
1 parent 1751daa commit 392cb00
Showing 1 changed file with 81 additions and 26 deletions.
107 changes: 81 additions & 26 deletions core/server/api/notifications.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var Promise = require('bluebird'),
canThis = require('../permissions').canThis,
errors = require('../errors'),
utils = require('./utils'),
pipeline = require('../utils/pipeline'),

// Holds the persistent notifications
notificationsStore = [],
Expand Down Expand Up @@ -47,31 +48,59 @@ notifications = {
* ```
*/
add: function add(object, options) {
var defaults = {
dismissible: true,
location: 'bottom',
status: 'alert'
},
addedNotifications = [];

return canThis(options.context).add.notification().then(function () {
return utils.checkObject(object, 'notifications').then(function (checkedNotificationData) {
_.each(checkedNotificationData.notifications, function (notification) {
notificationCounter = notificationCounter + 1;

notification = _.assign(defaults, notification, {
id: notificationCounter
// status: 'alert'
});

notificationsStore.push(notification);
addedNotifications.push(notification);
var tasks;

/**
* ### Handle Permissions
* We need to be an authorised user to perform this action
* @param {Object} options
* @returns {Object} options
*/
function handlePermissions(options) {
return canThis(options.context).add.notification().then(function () {
return options;
}, function () {
return Promise.reject(new errors.NoPermissionError('You do not have permission to add notifications.'));
});
}

/**
* ### Save Notifications
* Save the notifications
* @param {Object} options
* @returns {Object} options
*/
function saveNotifications(options) {
var defaults = {
dismissible: true,
location: 'bottom',
status: 'alert'
},
addedNotifications = [];

_.each(options.data.notifications, function (notification) {
notificationCounter = notificationCounter + 1;

notification = _.assign(defaults, notification, {
id: notificationCounter
// status: 'alert'
});

return {notifications: addedNotifications};
notificationsStore.push(notification);
addedNotifications.push(notification);
});
}, function () {
return Promise.reject(new errors.NoPermissionError('You do not have permission to add notifications.'));

return addedNotifications;
}

tasks = [
utils.validate('notifications'),
handlePermissions,
saveNotifications
];

return pipeline(tasks, object, options).then(function formatResponse(result) {
return {notifications: result};
});
},

Expand All @@ -83,7 +112,23 @@ notifications = {
* @returns {Promise(Notifications)}
*/
destroy: function destroy(options) {
return canThis(options.context).destroy.notification().then(function () {
var tasks;

/**
* ### Handle Permissions
* We need to be an authorised user to perform this action
* @param {Object} options
* @returns {Object} options
*/
function handlePermissions(options) {
return canThis(options.context).destroy.notification().then(function () {
return options;
}, function () {
return Promise.reject(new errors.NoPermissionError('You do not have permission to destroy notifications.'));
});
}

function destroyNotification(options) {
var notification = _.find(notificationsStore, function (element) {
return element.id === parseInt(options.id, 10);
});
Expand All @@ -101,9 +146,19 @@ notifications = {
notificationsStore = _.reject(notificationsStore, function (element) {
return element.id === parseInt(options.id, 10);
});
return {notifications: [notification]};
}, function () {
return Promise.reject(new errors.NoPermissionError('You do not have permission to destroy notifications.'));
notificationCounter = notificationCounter - 1;

return notification;
}

tasks = [
utils.validate('notifications', {opts: utils.idDefaultOptions}),
handlePermissions,
destroyNotification
];

return pipeline(tasks, options).then(function formatResponse(result) {
return {notifications: [result]};
});
},

Expand Down

0 comments on commit 392cb00

Please sign in to comment.