diff --git a/Envfile b/Envfile index eead8e4f2..508bfa8df 100644 --- a/Envfile +++ b/Envfile @@ -109,6 +109,8 @@ variable :HONEYCOMB_API_KEY, :String, default: "Optional" variable :MAILCHIMP_API_KEY, :String, default: "Optional-valid" variable :MAILCHIMP_NEWSLETTER_ID, :String, default: "Optional" variable :MAILCHIMP_SUSTAINING_MEMBERS_ID, :String, default: "Optional" +variable :MAILCHIMP_TAG_MODERATORS_ID, :String, default: "Optional" +variable :MAILCHIMP_COMMUNITY_MODERATORS_ID, :String, default: "Optional" # Email digest frequency variable :PERIODIC_EMAIL_DIGEST_MAX, :Integer, default: 0 diff --git a/app/controllers/internal/tags_controller.rb b/app/controllers/internal/tags_controller.rb index 5e8e123b6..09c60c776 100644 --- a/app/controllers/internal/tags_controller.rb +++ b/app/controllers/internal/tags_controller.rb @@ -22,8 +22,10 @@ class Internal::TagsController < Internal::ApplicationController def update @tag = Tag.find(params[:id]) - add_moderator if params[:tag][:tag_moderator_id] - remove_moderator if params[:tag][:remove_moderator_id] + @add_user_id = params[:tag][:tag_moderator_id] + @remove_user_id = params[:tag][:remove_moderator_id] + add_moderator if @add_user_id + remove_moderator if @remove_user_id @tag.update!(tag_params) redirect_to "/internal/tags/#{params[:id]}" end @@ -31,12 +33,14 @@ class Internal::TagsController < Internal::ApplicationController private def remove_moderator - User.find(params[:tag][:remove_moderator_id]).remove_role :tag_moderator, @tag + user = User.find(@remove_user_id) + user.update(email_tag_mod_newsletter: false) + AssignTagModerator.remove_tag_moderator(user, @tag) end def add_moderator - user_id = params[:tag][:tag_moderator_id] - AssignTagModerator.add_tag_moderators([user_id], [@tag.id]) + User.find(@add_user_id).update(email_tag_mod_newsletter: true) + AssignTagModerator.add_tag_moderators([@add_user_id], [@tag.id]) end def tag_params diff --git a/app/labor/assign_tag_moderator.rb b/app/labor/assign_tag_moderator.rb index 2dbd650f9..b583c32fb 100644 --- a/app/labor/assign_tag_moderator.rb +++ b/app/labor/assign_tag_moderator.rb @@ -1,11 +1,34 @@ module AssignTagModerator + def self.add_trusted_role(user) + user.add_role :trusted + user.update(email_community_mod_newsletter: true) + MailchimpBot.new(user).manage_community_moderator_list + end + + def self.add_to_chat_channel(user) + ChatChannel.find_by(slug: "tag-moderators").add_users(user) if user.chat_channels.find_by(slug: "tag-moderators").blank? + end + + def self.add_tag_mod_role(user, tag) + user.update(email_tag_mod_newsletter: true) if user.email_tag_mod_newsletter == false + user.add_role(:tag_moderator, tag) + MailchimpBot.new(user).manage_tag_moderator_list + end + def self.add_tag_moderators(user_ids, tag_ids) user_ids.each_with_index do |user_id, index| user = User.find(user_id) tag = Tag.find(tag_ids[index]) - user.add_role(:tag_moderator, tag) - ChatChannel.find_by(slug: "tag-moderators").add_users(user) if user.chat_channels.find_by(slug: "tag-moderators").blank? + add_tag_mod_role(user, tag) + add_trusted_role(user) + add_to_chat_channel(user) NotifyMailer.tag_moderator_confirmation_email(user, tag.name).deliver unless tag.name == "go" end end + + def self.remove_tag_moderator(user, tag) + user.remove_role(:tag_moderator, tag) + user.update(email_tag_mod_newsletter: false) if user.email_tag_mod_newsletter == true + MailchimpBot.new(user).manage_tag_moderator_list + end end diff --git a/app/labor/mailchimp_bot.rb b/app/labor/mailchimp_bot.rb index 8bc06148e..2b33deceb 100644 --- a/app/labor/mailchimp_bot.rb +++ b/app/labor/mailchimp_bot.rb @@ -11,6 +11,8 @@ class MailchimpBot return true unless Rails.env.production? || Rails.env.test? upsert_to_membership_newsletter + manage_community_moderator_list + manage_tag_moderator_list upsert_to_newsletter end @@ -45,6 +47,60 @@ class MailchimpBot success end + def manage_community_moderator_list + return false unless user.has_role?(:trusted) + + success = false + status = user.email_community_mod_newsletter ? "subscribed" : "unsubscribed" + begin + gibbon.lists(ApplicationConfig["MAILCHIMP_COMMUNITY_MODERATORS_ID"]).members(target_md5_email).upsert( + body: { + email_address: user.email, + status: status, + merge_fields: { + NAME: user.name.to_s, + USERNAME: user.username.to_s, + TWITTER: user.twitter_username.to_s, + GITHUB: user.github_username.to_s, + IMAGE_URL: user.profile_image_url.to_s + } + }, + ) + success = true + rescue Gibbon::MailChimpError => e + report_error(e) + end + success + end + + def manage_tag_moderator_list + return false unless user.tag_moderator? + + success = false + tags = user.roles.where(name: "tag_moderator").map { |t| Tag.find(t.resource_id).name } + status = user.email_tag_mod_newsletter ? "subscribed" : "unsubscribed" + begin + gibbon.lists(ApplicationConfig["MAILCHIMP_TAG_MODERATORS_ID"]).members(target_md5_email).upsert( + body: { + email_address: user.email, + status: status, + merge_fields: { + NAME: user.name.to_s, + USERNAME: user.username.to_s, + TWITTER: user.twitter_username.to_s, + GITHUB: user.github_username.to_s, + IMAGE_URL: user.profile_image_url.to_s, + TAGS: tags.join(", ") + } + }, + ) + success = true + rescue Gibbon::MailChimpError => e + report_error(e) + end + success + end + def upsert_to_membership_newsletter return false unless a_sustaining_member? @@ -80,6 +136,36 @@ class MailchimpBot success end + def unsub_sustaining_member + return unless user.tag_moderator? + + gibbon.lists(ApplicationConfig["MAILCHIMP_TAG_MODERATORS_ID"]).members(target_md5_email).update( + body: { + status: "unsubscribed" + }, + ) + end + + def unsub_community_mod + return unless user.has_role?(:trusted) + + gibbon.lists(ApplicationConfig["MAILCHIMP_COMMUNITY_MODERATORS_ID"]).members(target_md5_email).update( + body: { + status: "unsubscribed" + }, + ) + end + + def unsub_tag_mod + return unless a_sustaining_member? + + gibbon.lists(ApplicationConfig["MAILCHIMP_SUSTAINING_MEMBERS_ID"]).members(target_md5_email).update( + body: { + status: "unsubscribed" + }, + ) + end + def unsubscribe_all_newsletters success = false begin @@ -88,13 +174,9 @@ class MailchimpBot status: "unsubscribed" }, ) - if a_sustaining_member? - gibbon.lists(ApplicationConfig["MAILCHIMP_SUSTAINING_MEMBERS_ID"]).members(target_md5_email).update( - body: { - status: "unsubscribed" - }, - ) - end + unsub_tag_mod + unsub_sustaining_member + unsub_community_mod success = true rescue Gibbon::MailChimpError => e report_error(e) diff --git a/app/models/user.rb b/app/models/user.rb index e3b1fa6a5..40446055e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -406,6 +406,10 @@ class User < ApplicationRecord MailchimpBot.new(self).unsubscribe_all_newsletters end + def tag_moderator? + roles.where(name: "tag_moderator").any? + end + private def send_welcome_notification diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index 7ee2beda7..50408eede 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -69,6 +69,8 @@ class UserPolicy < ApplicationPolicy email_digest_periodic email_follower_notifications email_membership_newsletter + email_tag_mod_newsletter + email_community_mod_newsletter email_mention_notifications email_connect_messages email_newsletter diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb index 9a1b3e6b8..ee54b51c4 100644 --- a/app/services/moderator/manage_activity_and_roles.rb +++ b/app/services/moderator/manage_activity_and_roles.rb @@ -53,11 +53,25 @@ module Moderator end def remove_privileges - @user.remove_role :trusted @user.remove_role :video_permission - @user.remove_role :tag_moderator @user.remove_role :workshop_pass @user.remove_role :pro + remove_mod_roles + remove_tag_moderator_role + end + + def remove_mod_roles + @user.remove_role :trusted + @user.remove_role :tag_moderator + @user.update(email_tag_mod_newsletter: false) + MailchimpBot.new(user).manage_tag_moderator_list + @user.update(email_community_mod_newsletter: false) + MailchimpBot.new(user).manage_community_moderator_list + end + + def remove_tag_moderator_role + @user.remove_role :tag_moderator + MailchimpBot.new(user).manage_tag_moderator_list end def create_note(reason, content) @@ -76,28 +90,47 @@ module Moderator user.add_role :banned remove_privileges when "Warn" - user.add_role :warned - user.remove_role :banned - remove_privileges + warned when "Comment Ban" - user.add_role :comment_banned - user.remove_role :banned - remove_privileges + comment_banned when "Regular Member" - remove_negative_roles - user.remove_role :pro + regular_member when "Trusted" remove_negative_roles user.remove_role :pro - user.add_role :trusted + add_trusted_role when "Pro" remove_negative_roles - user.add_role :trusted + add_trusted_role user.add_role :pro end create_note(role, note) end + def comment_banned + user.add_role :comment_banned + user.remove_role :banned + remove_privileges + end + + def regular_member + remove_negative_roles + user.remove_role :pro + remove_mod_roles + end + + def warned + user.add_role :warned + user.remove_role :banned + remove_privileges + end + + def add_trusted_role + user.add_role :trusted + user.update(email_community_mod_newsletter: true) + MailchimpBot.new(user).manage_community_moderator_list + end + def remove_negative_roles user.remove_role :banned if user.banned user.remove_role :warned if user.warned diff --git a/app/views/users/_notifications.html.erb b/app/views/users/_notifications.html.erb index 30ac5f26c..5d8df1008 100644 --- a/app/views/users/_notifications.html.erb +++ b/app/views/users/_notifications.html.erb @@ -15,6 +15,18 @@ <%= f.label :email_membership_newsletter, "Send me sustaining membership newsletter emails" %> <% end %> + <% if current_user.tag_moderator? %> +