Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # было
- class Admin::MailingSystemsController < AdminController
- include ActionView::Helpers::TextHelper
- mattr_accessor :jobs_ids do
- []
- end
- def index
- @mailing_system = MailingSystem.new
- end
- def create
- @user = User.find(params[:mailing_system][:user_id])
- case
- when @user.is_admin? || (@user.is_consultant? && @user.is_client?)
- emails = []
- chats = []
- if params[:mailing_system][:to_clients] == '1'
- to_clients(params[:mailing_system])
- emails = @emails
- chats = @chats
- end
- if params[:mailing_system][:to_consultants] == '1'
- to_consultants(params[:mailing_system])
- @emails = (@emails + emails).uniq if params[:mailing_system][:email] == '1'
- @chats = (@chats + chats).uniq if params[:mailing_system][:chat] == '1'
- end
- when @user.is_consultant? && params[:mailing_system][:to_clients] == '1'
- to_clients(params[:mailing_system])
- when @user.is_client? && params[:mailing_system][:to_consultants] == '1'
- to_consultants(params[:mailing_system])
- end
- if params[:button] == 'reach'
- @mailing_system = MailingSystem.new(permit_params)
- render 'index'
- else
- send_emails_messages(@emails, params[:mailing_system]) if params[:mailing_system][:email] == '1'
- send_chats_messages(@chats, params[:mailing_system]) if params[:mailing_system][:chat] == '1'
- redirect_to admin_mailing_systems_path
- end
- end
- private
- def send_chats_messages(chats, params)
- if chats.present?
- chats.map do |user|
- jobs_ids << SendChatsMessages.create(to: user, from: params[:user_id],
- body: simple_format(params[:message]))
- end
- end
- end
- def send_emails_messages(emails, params)
- if emails.present?
- emails.map do |email|
- jobs_ids << SendEmailsMessages.create(email: email, subject: params[:subject],
- body: params[:message], from: params[:user_id])
- end
- end
- end
- def to_clients(params)
- search = ::Search::ClientsQuery.new.search
- @users = search.with_exact_countries_ids(params[:country_id]).with_migration_approaches_ids(params[:migration_approach_id])
- @emails = create_lists_emails(users) if params[:email] == '1'
- @chats = create_lists_chats(users) if params[:chat] == '1'
- end
- def to_consultants(params)
- search = ::Search::ConsultantsQuery.new.search
- @users = search.with_exact_countries_ids(params[:country_id]).with_specializations_ids(params[:migration_approach_id])
- @emails = create_lists_emails(users) if params[:email] == '1'
- @chats = create_lists_chats(users) if params[:chat] == '1'
- end
- def create_lists_chats(users)
- users.to_a.map(&:id)
- end
- def create_lists_emails(users)
- users.to_a.map { |user| user.email if user.email.present? }.compact
- end
- def values_for_select
- @users = User.all
- @countries = Country.all
- @migration_apps = MigrationApproach.all
- end
- def permit_params
- params.require(:mailing_system).permit(:email, :chat, :user_id, :to_clients,
- :to_consultants, :country_id, :migration_approach_id, :subject, :message)
- end
- end
- # заменим case на фабрику
- # Тип объекта будет зависит от того, что записано в поле RoleType.
- # Для начала создадим модуль, где перечислим все возможные значения поля RoleType:
- module UserRoleType # Значения для RoleType в таблице User
- ADMIN = 'admin'
- CONSULTANT = 'consultant'
- CLIENT = 'client'
- end
- # Создаём Hash, который необходим для того, чтобы по значению RoleType создавать объект определенного типа:
- @@types_objects = {
- ADMIN => :admin_delivery,
- CONSULTANT => :consultant_delivery,
- CLIENT => :client_delivery
- }
- # Реализуем функции, которые отвечают за укомплектование рассылки:
- def admin_delivery
- obj = {
- :emails => self.emails,
- :chats => self.chats,
- :to_clients => self.to_clients((params[:mailing_system])),
- :to_consultants => self.to_consultants((params[:mailing_system]))
- }
- end
- # Теперь напишем функцию, которая будет отвечать за создание объекта необходимого типа по значению RoleType.
- def complet_delivery
- if @@types_objects.has_key?(self.RoleType)
- send(@@types_objects[self.RoleType])
- else
- raise
- end
- end
- def send_delivery(obj, params)
- if params[:mailing_system][:email] == '1'
- send_emails_messages(obj[:emails], params[:mailing_system])
- end
- if params[:mailing_system][:chat] == '1'
- send_chats_messages(obj[:chats], params[:mailing_system])
- end
- end
- # Теперь перепишем case
- send_delivery(@from_user.complect_delivery, params)
Add Comment
Please, Sign In to add comment