From 8356f43a8f57cbd1017c35304a2b56ac67e911ea Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Mon, 8 Jun 2015 08:52:41 +0900 Subject: [PATCH] migrate newsletter settings; use Users.getSetting --- packages/telescope-email/lib/server/email.js | 2 +- .../lib/server/migrations.js | 47 +++++++- .../lib/client/templates/newsletter_banner.js | 4 +- .../telescope-newsletter/lib/newsletter.js | 26 ++++ .../lib/notifications.js | 111 +++++++++--------- packages/telescope-users/lib/helpers.js | 29 +++-- 6 files changed, 149 insertions(+), 70 deletions(-) diff --git a/packages/telescope-email/lib/server/email.js b/packages/telescope-email/lib/server/email.js index b9afd4faf..ccfab41a4 100644 --- a/packages/telescope-email/lib/server/email.js +++ b/packages/telescope-email/lib/server/email.js @@ -95,7 +95,7 @@ function adminUserCreationNotification (user) { // send notifications to admins var admins = Users.adminUsers(); admins.forEach(function(admin){ - if (admin.telescope.notifications.users) { + if (Users.getSetting(admin, "telescope.notifications.users", false)) { var emailProperties = { profileUrl: Users.getProfileUrl(user), username: Users.getUserName(user) diff --git a/packages/telescope-migrations/lib/server/migrations.js b/packages/telescope-migrations/lib/server/migrations.js index 3bf0fdfca..447e53e0b 100644 --- a/packages/telescope-migrations/lib/server/migrations.js +++ b/packages/telescope-migrations/lib/server/migrations.js @@ -634,10 +634,55 @@ var migrationsList = { if (!!displayName) { Meteor.users.update(user._id, {$set: {"telescope.displayName": displayName}}); } else { - "displayName not found :(" + console.log("displayName not found :("); } }); return i; + }, + migrateNewsletterSettings: function () { + var i = 0; + var allUsers = Meteor.users.find({ + $or: [ + {"profile.showBanner": {$exists: true}}, + {"profile.subscribedToNewsletter": {$exists: true}} + ] + }); + console.log('> Found '+allUsers.count()+' users.\n'); + + allUsers.forEach(function(user){ + i++; + var displayName; + + if (!!user.profile) { + displayName = user.profile.name || user.profile.username; + } else { + displayName = user.username; + } + + console.log('> Updating user '+user._id+' (' + displayName + ')'); + + if (user.profile) { + + var set = {}; + + var showBanner = user.profile.showBanner; + if (typeof showBanner !== "undefined") { + set["telescope.newsletter.showBanner"] = showBanner; + } + + var subscribeToNewsletter = user.profile.subscribedToNewsletter; + if (typeof subscribeToNewsletter !== "undefined") { + set["telescope.newsletter.subscribeToNewsletter"] = subscribeToNewsletter; + } + console.log(set) + if (!_.isEmpty(set)) { + Meteor.users.update(user._id, {$set: set}); + } + + } + + }); + return i; } }; diff --git a/packages/telescope-newsletter/lib/client/templates/newsletter_banner.js b/packages/telescope-newsletter/lib/client/templates/newsletter_banner.js index 676df41bf..dcd18d03b 100644 --- a/packages/telescope-newsletter/lib/client/templates/newsletter_banner.js +++ b/packages/telescope-newsletter/lib/client/templates/newsletter_banner.js @@ -34,8 +34,8 @@ Meteor.startup(function () { || !Users.can.view(Meteor.user()) || Router.current().location.get().path !== '/' || Cookie.get('showBanner') === "no" - || (Meteor.user() && Users.getUserSetting('showBanner', true) === false) - || (Meteor.user() && Users.getUserSetting('subscribedToNewsletter', false) === true) + || (Meteor.user() && Meteor.user().getSetting('telescope.newsletter.showBanner', true) === false) + || (Meteor.user() && Meteor.user().getSetting('telescope.newsletter.subscribeToNewsletter', false) === true) ){ return false; }else{ diff --git a/packages/telescope-newsletter/lib/newsletter.js b/packages/telescope-newsletter/lib/newsletter.js index cbb2abacd..cf80809ae 100644 --- a/packages/telescope-newsletter/lib/newsletter.js +++ b/packages/telescope-newsletter/lib/newsletter.js @@ -40,6 +40,32 @@ Posts.addField({ } }); +Users.addField([ + { + fieldName: 'telescope.newsletter.showBanner', + fieldSchema: { + label: 'Show banner', + type: Boolean, + optional: true, + editableBy: ['admin', 'member'], + autoform: { + omit: true + } + } + }, + { + fieldName: 'telescope.newsletter.subscribeToNewsletter', + fieldSchema: { + label: 'Subscribe to newsletter', + type: Boolean, + optional: true, + editableBy: ['admin', 'member'], + autoform: { + group: 'Newsletter' + } + } + } +]); // Users // TODO: add "subscribe to newsletter" checkbox or setting to account page diff --git a/packages/telescope-notifications/lib/notifications.js b/packages/telescope-notifications/lib/notifications.js index d183467c6..eec0c1b44 100644 --- a/packages/telescope-notifications/lib/notifications.js +++ b/packages/telescope-notifications/lib/notifications.js @@ -5,8 +5,8 @@ function postSubmitNotification (post) { var notifiedUserIds = _.pluck(Users.find({'telescope.notifications.posts': true}, {fields: {_id:1}}).fetch(), '_id'); // remove post author ID from arrays - var adminIds = _.without(adminIds, post.userId); - var notifiedUserIds = _.without(notifiedUserIds, post.userId); + adminIds = _.without(adminIds, post.userId); + notifiedUserIds = _.without(notifiedUserIds, post.userId); if (post.status === Posts.config.STATUS_PENDING && !!adminIds.length) { // if post is pending, only notify admins @@ -41,11 +41,9 @@ function addCommentNotification (comment) { // 1. Notify author of post (if they have new comment notifications turned on) // but do not notify author of post if they're the ones posting the comment - if (!!postAuthor.telescope.notifications.comments && comment.userId !== postAuthor._id) { - + if (Users.getSetting(postAuthor, "telescope.notifications.comments", true) && comment.userId !== postAuthor._id) { Herald.createNotification(post.userId, {courier: 'newComment', data: notificationData}); userIdsNotified.push(post.userId); - } // 2. Notify author of comment being replied to @@ -60,7 +58,7 @@ function addCommentNotification (comment) { var parentCommentAuthor = Users.findOne(parentComment.userId); // do not notify parent comment author if they have reply notifications turned off - if (!!parentCommentAuthor.telescope.notifications.replies) { + if (Users.getSetting(parentCommentAuthor, "telescope.notifications.replies", true)) { // add parent comment to notification data notificationData.parentComment = _.pick(parentComment, '_id', 'userId', 'author'); @@ -122,57 +120,60 @@ Comments.addField( ); // Add notifications options to user profile settings -Users.addField({ - fieldName: 'telescope.notifications.users', - fieldSchema: { - label: 'New users', - type: Boolean, - optional: true, - editableBy: ['admin'], - autoform: { - group: 'Email Notifications' +Users.addField([ + { + fieldName: 'telescope.notifications.users', + fieldSchema: { + label: 'New users', + type: Boolean, + optional: true, + defaultValue: false, + editableBy: ['admin'], + autoform: { + group: 'Email Notifications' + } + } + }, + { + fieldName: 'telescope.notifications.posts', + fieldSchema: { + label: 'New posts', + type: Boolean, + optional: true, + defaultValue: false, + editableBy: ['admin', 'member'], + autoform: { + group: 'Email Notifications' + } + } + }, + { + fieldName: 'telescope.notifications.comments', + fieldSchema: { + label: 'Comments on my posts', + type: Boolean, + optional: true, + defaultValue: true, + editableBy: ['admin', 'member'], + autoform: { + group: 'Email Notifications' + } + } + }, + { + fieldName: 'telescope.notifications.replies', + fieldSchema: { + label: 'Replies to my comments', + type: Boolean, + optional: true, + defaultValue: true, + editableBy: ['admin', 'member'], + autoform: { + group: 'Email Notifications' + } } } -}); - -Users.addField({ - fieldName: 'telescope.notifications.posts', - fieldSchema: { - label: 'New posts', - type: Boolean, - optional: true, - editableBy: ['admin', 'member'], - autoform: { - group: 'Email Notifications' - } - } -}); - -Users.addField({ - fieldName: 'telescope.notifications.comments', - fieldSchema: { - label: 'Comments on my posts', - type: Boolean, - optional: true, - editableBy: ['admin', 'member'], - autoform: { - group: 'Email Notifications' - } - } -}); - -Users.addField({ - fieldName: 'telescope.notifications.replies', - fieldSchema: { - label: 'Replies to my comments', - type: Boolean, - optional: true, - editableBy: ['admin', 'member'], - autoform: { - group: 'Email Notifications' - } - } -}); +]); function setNotificationDefaults (user) { // set notifications default preferences diff --git a/packages/telescope-users/lib/helpers.js b/packages/telescope-users/lib/helpers.js index 7d21c94bf..87a198775 100644 --- a/packages/telescope-users/lib/helpers.js +++ b/packages/telescope-users/lib/helpers.js @@ -124,6 +124,24 @@ Users.userProfileComplete = function (user) { Users.helpers({userProfileComplete: function () {return Users.userProfileComplete(this);}}); Users.userProfileCompleteById = function (userId) {return Users.userProfileComplete(Meteor.users.findOne(userId));}; +/** + * Get a user setting + * @param {Object} user + * @param {String} settingName + * @param {Object} defaultValue + */ +Users.getSetting = function (user, settingName, defaultValue) { + user = user || Meteor.user(); + defaultValue = defaultValue || null; + if (user.telescope && user.telescope.settings) { + var settingValue = this.getProperty(user.telescope.settings, settingName); + return (settingValue === null) ? defaultValue : settingValue; + } else { + return defaultValue; + } +}; +Users.helpers({getSetting: function () {return Users.getSetting(this);}}); + /////////////////// // Other Helpers // /////////////////// @@ -151,17 +169,6 @@ Users.numberOfItemsInPast24Hours = function (user, collection) { return items.count(); }; -Users.getUserSetting = function (settingName, defaultValue, user) { - user = user || Meteor.user(); - defaultValue = defaultValue || null; - if (user.telescope && user.telescope.settings) { - var settingValue = this.getProperty(user.telescope.settings, settingName); - return (settingValue === null) ? defaultValue : settingValue; - } else { - return defaultValue; - } -}; - Users.setUserSetting = function (settingName, value, userArgument) { // note: for some very weird reason, doesn't work when called from Accounts.onCreateUser