diff --git a/app/controllers/admin/mods_controller.rb b/app/controllers/admin/mods_controller.rb index 526634a35..3149e933d 100644 --- a/app/controllers/admin/mods_controller.rb +++ b/app/controllers/admin/mods_controller.rb @@ -20,7 +20,7 @@ module Admin def update @user = User.find(params[:id]) - AssignTagModerator.add_trusted_role(@user) + TagModerators::AddTrustedRole.call(@user) redirect_to admin_mods_path(state: :potential), flash: { success: "#{@user.username} now has Trusted role!" } diff --git a/app/controllers/admin/tags/moderators_controller.rb b/app/controllers/admin/tags/moderators_controller.rb index 41e0b8153..42988cfc7 100644 --- a/app/controllers/admin/tags/moderators_controller.rb +++ b/app/controllers/admin/tags/moderators_controller.rb @@ -12,7 +12,7 @@ module Admin def create user = User.find_by(id: tag_params[:user_id]) if user&.update(email_tag_mod_newsletter: true) - AssignTagModerator.add_tag_moderators([user.id], [params[:tag_id]]) + TagModerators::Add.call([user.id], [params[:tag_id]]) flash[:success] = "#{user.username} was added as a tag moderator!" else flash[:error] = "Error: User ID ##{tag_params[:user_id]} was not found, @@ -25,7 +25,7 @@ module Admin user = User.find_by(id: tag_params[:user_id]) tag = Tag.find_by(id: params[:tag_id]) if user&.update(email_tag_mod_newsletter: false) - AssignTagModerator.remove_tag_moderator(user, tag) + TagModerators::Remove.call(user, tag) flash[:success] = "@#{user.username} - ID ##{user.id} was removed as a tag moderator." else flash[:error] = "Error: User ID ##{tag_params[:user_id]} was not found, diff --git a/app/labor/assign_tag_moderator.rb b/app/labor/assign_tag_moderator.rb deleted file mode 100644 index 500534883..000000000 --- a/app/labor/assign_tag_moderator.rb +++ /dev/null @@ -1,71 +0,0 @@ -module AssignTagModerator - def self.add_trusted_role(user) - return if user.has_role?(:trusted) - return if user.has_role?(:banned) - - user.add_role(:trusted) - user.update(email_community_mod_newsletter: true) - MailchimpBot.new(user).manage_community_moderator_list if community_mod_newsletter_enabled? - Rails.cache.delete("user-#{user.id}/has_trusted_role") - NotifyMailer.with(user: user).trusted_role_email.deliver_now - 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]) - add_tag_mod_role(user, tag) - add_trusted_role(user) - add_to_chat_channels(user, tag) - tag.update(supported: true) unless tag.supported? - - NotifyMailer.with(user: user, tag: tag, channel_slug: chat_channel_slug(tag)) - .tag_moderator_confirmation_email - .deliver_now - end - end - - def self.add_to_chat_channels(user, tag) - user_channels = user.chat_channels - - ChatChannel.find_by(slug: "tag-moderators")&.add_users(user) unless - user_channels.exists?(slug: "tag-moderators") - - if tag.mod_chat_channel_id && !user_channels.exists?(id: tag.mod_chat_channel_id) - ChatChannel.find(tag.mod_chat_channel_id).add_users(user) - elsif tag.mod_chat_channel_id.blank? - channel = ChatChannels::CreateWithUsers.call( - users: ([user] + User.with_role(:mod_relations_admin)).flatten.uniq, - channel_type: "invite_only", - contrived_name: "##{tag.name} mods", - ) - tag.update_column(:mod_chat_channel_id, channel.id) - end - 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) - Rails.cache.delete("user-#{user.id}/tag_moderators_list") - MailchimpBot.new(user).manage_tag_moderator_list if tag_mod_newsletter_enabled? - 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 - Rails.cache.delete("user-#{user.id}/tag_moderators_list") - MailchimpBot.new(user).manage_tag_moderator_list if tag_mod_newsletter_enabled? - end - - def self.chat_channel_slug(tag) - tag.mod_chat_channel&.slug - end - - def self.community_mod_newsletter_enabled? - SiteConfig.mailchimp_api_key.present? && SiteConfig.mailchimp_community_moderators_id.present? - end - - def self.tag_mod_newsletter_enabled? - SiteConfig.mailchimp_api_key.present? && SiteConfig.mailchimp_tag_moderators_id.present? - end -end diff --git a/app/services/tag_moderators/add.rb b/app/services/tag_moderators/add.rb new file mode 100644 index 000000000..bbacf9ed8 --- /dev/null +++ b/app/services/tag_moderators/add.rb @@ -0,0 +1,69 @@ +module TagModerators + class Add + def self.call(user_ids, tag_ids) + new(user_ids, tag_ids).call + end + + def initialize(user_ids, tag_ids) + @user_ids = user_ids + @tag_ids = tag_ids + end + + def call + user_ids.each_with_index do |user_id, index| + user = User.find(user_id) + tag = Tag.find(tag_ids[index]) + add_tag_mod_role(user, tag) + ::TagModerators::AddTrustedRole.call(user) + add_to_chat_channels(user, tag) + tag.update(supported: true) unless tag.supported? + + NotifyMailer + .with(user: user, tag: tag, channel_slug: chat_channel_slug(tag)) + .tag_moderator_confirmation_email + .deliver_now + end + end + + private + + attr_accessor :user_ids, :tag_ids + + def add_to_chat_channels(user, tag) + user_channels = user.chat_channels + + unless user_channels.exists?(slug: "tag-moderators") + ChatChannel.find_by(slug: "tag-moderators")&.add_users(user) + end + + if tag.mod_chat_channel_id && !user_channels.exists?(id: tag.mod_chat_channel_id) + ChatChannel.find(tag.mod_chat_channel_id).add_users(user) + elsif tag.mod_chat_channel_id.blank? + channel = ChatChannels::CreateWithUsers.call( + users: ([user] + User.with_role(:mod_relations_admin)).flatten.uniq, + channel_type: "invite_only", + contrived_name: "##{tag.name} mods", + ) + tag.update_column(:mod_chat_channel_id, channel.id) + end + end + + def add_tag_mod_role(user, tag) + user.update(email_tag_mod_newsletter: true) unless user.email_tag_mod_newsletter? + user.add_role(:tag_moderator, tag) + Rails.cache.delete("user-#{user.id}/tag_moderators_list") + return unless tag_mod_newsletter_enabled? + + MailchimpBot.new(user).manage_tag_moderator_list + end + + def tag_mod_newsletter_enabled? + SiteConfig.mailchimp_api_key.present? && + SiteConfig.mailchimp_tag_moderators_id.present? + end + + def chat_channel_slug(tag) + tag.mod_chat_channel&.slug + end + end +end diff --git a/app/services/tag_moderators/add_trusted_role.rb b/app/services/tag_moderators/add_trusted_role.rb new file mode 100644 index 000000000..e64b2a39c --- /dev/null +++ b/app/services/tag_moderators/add_trusted_role.rb @@ -0,0 +1,21 @@ +module TagModerators + class AddTrustedRole + def self.call(user) + return if user.has_role?(:trusted) || user.has_role?(:banned) + + user.add_role(:trusted) + user.update(email_community_mod_newsletter: true) + Rails.cache.delete("user-#{user.id}/has_trusted_role") + NotifyMailer.with(user: user).trusted_role_email.deliver_now + return unless community_mod_newsletter_enabled? + + MailchimpBot.new(user).manage_community_moderator_list + end + + def self.community_mod_newsletter_enabled? + SiteConfig.mailchimp_api_key.present? && + SiteConfig.mailchimp_community_moderators_id.present? + end + private_class_method :community_mod_newsletter_enabled? + end +end diff --git a/app/services/tag_moderators/remove.rb b/app/services/tag_moderators/remove.rb new file mode 100644 index 000000000..77e63d1f1 --- /dev/null +++ b/app/services/tag_moderators/remove.rb @@ -0,0 +1,18 @@ +module TagModerators + class Remove + def self.call(user, tag) + user.remove_role(:tag_moderator, tag) + user.update(email_tag_mod_newsletter: false) if user.email_tag_mod_newsletter? + Rails.cache.delete("user-#{user.id}/tag_moderators_list") + return unless tag_mod_newsletter_enabled? + + MailchimpBot.new(user).manage_tag_moderator_list + end + + def self.tag_mod_newsletter_enabled? + SiteConfig.mailchimp_api_key.present? && + SiteConfig.mailchimp_tag_moderators_id.present? + end + private_class_method :tag_mod_newsletter_enabled? + end +end diff --git a/spec/labor/assign_tag_moderator_spec.rb b/spec/services/tag_moderators/add_spec.rb similarity index 92% rename from spec/labor/assign_tag_moderator_spec.rb rename to spec/services/tag_moderators/add_spec.rb index da9402562..fd5957d84 100644 --- a/spec/labor/assign_tag_moderator_spec.rb +++ b/spec/services/tag_moderators/add_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -RSpec.describe AssignTagModerator, type: :labor do +RSpec.describe TagModerators::Add, type: :service do let(:user_one) { create(:user) } let(:user_two) { create(:user) } let(:mod_relator) { create(:user) } @@ -17,7 +17,7 @@ RSpec.describe AssignTagModerator, type: :labor do mod_relator.add_role(:mod_relations_admin) user_ids = [user_one.id, user_two.id] tag_ids = [tag_one.id, tag_two.id] - described_class.add_tag_moderators(user_ids, tag_ids) + described_class.call(user_ids, tag_ids) end def destroy_tag_moderator_channel @@ -51,7 +51,7 @@ RSpec.describe AssignTagModerator, type: :labor do it "adds user to channel when tag already has channel" do user_three = create(:user) - described_class.add_tag_moderators([user_three.id], [tag_one.id]) + described_class.call([user_three.id], [tag_one.id]) channel = ChatChannel.find_by(channel_name: "##{tag_one.name} mods") expect(channel.active_users).to include(user_three) end diff --git a/spec/services/tag_moderators/add_trusted_role_spec.rb b/spec/services/tag_moderators/add_trusted_role_spec.rb new file mode 100644 index 000000000..8b6c904e2 --- /dev/null +++ b/spec/services/tag_moderators/add_trusted_role_spec.rb @@ -0,0 +1,20 @@ +require "rails_helper" + +RSpec.describe TagModerators::AddTrustedRole, type: :service do + let(:user) { create(:user) } + + it "adds the trusted role to a user" do + expect { described_class.call(user) }.to change { user.reload.roles.size }.by(1) + end + + it "does not add the fole for banned users" do + user = create(:user, :banned) + expect { described_class.call(user) }.not_to change { user.reload.roles.size } + end + + it "signs the user up for the community mods newsletter" do + expect do + described_class.call(user) + end.to change { user.reload.email_community_mod_newsletter }.from(false).to(true) + end +end diff --git a/spec/services/tag_moderators/remove_spec.rb b/spec/services/tag_moderators/remove_spec.rb new file mode 100644 index 000000000..d82d2bb2a --- /dev/null +++ b/spec/services/tag_moderators/remove_spec.rb @@ -0,0 +1,13 @@ +require "rails_helper" + +RSpec.describe TagModerators::Remove, type: :service do + let(:user) { create(:user) } + let(:tag) { create(:tag) } + + it "removes the tag_moderator role from the user" do + user.add_role(:tag_moderator, tag) + expect do + described_class.call(user, tag) + end.to change { user.reload.roles.count }.by(-1) + end +end