View difference between Paste ID: ffrwe9zg and R9Z7Ytpa
SHOW: | | - or go back to the newest paste.
1
# было
2
class Admin::MailingSystemsController < AdminController
3
  include ActionView::Helpers::TextHelper
4
 
5
  mattr_accessor :jobs_ids do
6
    []
7
  end
8
9
  def index
10
    @mailing_system = MailingSystem.new
11
  end
12
13
  def create
14
    @user = User.find(params[:mailing_system][:user_id])
15
    case
16
    when @user.is_admin? || (@user.is_consultant? && @user.is_client?)
17
      emails = []
18
      chats = []
19
      if params[:mailing_system][:to_clients] == '1'
20
        to_clients(params[:mailing_system])
21
        emails = @emails
22
        chats = @chats
23
      end
24
      if params[:mailing_system][:to_consultants] == '1'
25
        to_consultants(params[:mailing_system])
26
        @emails = (@emails + emails).uniq if params[:mailing_system][:email] == '1'
27
        @chats = (@chats + chats).uniq if params[:mailing_system][:chat] == '1'
28
      end
29
    when @user.is_consultant? && params[:mailing_system][:to_clients] == '1'
30
      to_clients(params[:mailing_system])
31
    when @user.is_client? && params[:mailing_system][:to_consultants] == '1'
32
      to_consultants(params[:mailing_system])
33
    end
34
35
    if params[:button] == 'reach'
36
      @mailing_system = MailingSystem.new(permit_params)
37
      render 'index'
38
    else
39
      send_emails_messages(@emails, params[:mailing_system]) if params[:mailing_system][:email] == '1'
40
      send_chats_messages(@chats, params[:mailing_system]) if params[:mailing_system][:chat] == '1'
41
      redirect_to admin_mailing_systems_path
42
    end
43
  end
44
45
 
46
  private
47
48
  def send_chats_messages(chats, params)
49
    if chats.present?
50
      chats.map do |user|
51
        jobs_ids << SendChatsMessages.create(to: user, from: params[:user_id],
52
          body: simple_format(params[:message]))
53
      end
54
    end
55
  end
56
57
  def send_emails_messages(emails, params)
58
    if emails.present?
59
      emails.map do |email|
60
        jobs_ids << SendEmailsMessages.create(email: email, subject: params[:subject],
61
          body: params[:message], from: params[:user_id])
62
      end
63
    end
64
  end
65
66
  def to_clients(params)
67
    search = ::Search::ClientsQuery.new.search
68
    @users = search.with_exact_countries_ids(params[:country_id]).with_migration_approaches_ids(params[:migration_approach_id])
69
    @emails = create_lists_emails(users) if params[:email] == '1'
70
    @chats = create_lists_chats(users) if params[:chat] == '1'
71
  end
72
73
  def to_consultants(params)
74
    search = ::Search::ConsultantsQuery.new.search
75
    @users = search.with_exact_countries_ids(params[:country_id]).with_specializations_ids(params[:migration_approach_id])
76
    @emails = create_lists_emails(users) if params[:email] == '1'
77
    @chats = create_lists_chats(users) if params[:chat] == '1'
78
  end
79
80
  def create_lists_chats(users)
81
    users.to_a.map(&:id)
82
  end
83
84
  def create_lists_emails(users)
85
    users.to_a.map { |user| user.email if user.email.present? }.compact
86
  end
87
88
  def values_for_select
89
    @users = User.all
90
    @countries = Country.all
91
    @migration_apps = MigrationApproach.all
92
  end
93
94
  def permit_params
95
    params.require(:mailing_system).permit(:email, :chat, :user_id, :to_clients,
96
      :to_consultants, :country_id, :migration_approach_id, :subject, :message)
97
  end
98
end
99
100
101
# заменим case на фабрику
102
103-
# Тип объекта будет зависит от того, что записано в поле role.
103+
# Тип объекта будет зависит от того, что записано в поле RoleType.
104-
# Для начала создадим модуль, где перечислим все возможные значения поля role:
104+
# Для начала создадим модуль, где перечислим все возможные значения поля RoleType:
105
106
module UserRoleType # Значения для RoleType в таблице User
107
  ADMIN       = 'admin'
108
  CONSULTANT  = 'consultant'
109
  CLIENT      = 'client'
110
end
111
112
# Создаём Hash, который необходим для того, чтобы по значению RoleType создавать объект определенного типа:
113
114
@@types_objects = {
115
  ADMIN      => :admin_delivery,
116
  CONSULTANT => :consultant_delivery,
117
  CLIENT     => :client_delivery
118
}
119
120
# Реализуем функции, которые отвечают за укомплектование рассылки:
121
122
def admin_delivery
123
  obj = {
124
    :emails => self.emails,
125
    :chats => self.chats,
126
    :to_clients => self.to_clients((params[:mailing_system])),
127
    :to_consultants => self.to_consultants((params[:mailing_system]))
128
  }
129
end
130
131
 
132
# Теперь напишем функцию, которая будет отвечать за создание объекта необходимого типа по значению RoleType.
133
134
def complet_delivery
135
   if @@types_objects.has_key?(self.RoleType)
136
      send(@@types_objects[self.RoleType])
137
   else
138
      raise
139
   end
140
end
141
142
def send_delivery(obj, params)
143
  if params[:mailing_system][:email] == '1'
144
    send_emails_messages(obj[:emails], params[:mailing_system])
145
  end
146
  if params[:mailing_system][:chat] == '1'
147
    send_chats_messages(obj[:chats], params[:mailing_system])
148
  end
149
end
150
151
# Теперь перепишем case
152
153
send_delivery(@from_user.complect_delivery, params)