· 5 years ago · Mar 10, 2021, 09:12 AM
1class Api::V2::Chat::BroadcastController < ProtectedController
2 before_action :authorize_user
3
4 # =begin
5 # @apiVersion 2.0.0
6 # @api {post} /api/v2/chat/send_broadcast Send Broadcast V2
7 # @apiDescription Send broadcast to targets by phone numbers
8 # @apiName SendBroadcastV2
9 # @apiGroup Broadcast
10 #
11 # @apiParam {String} access_token User access token
12 # @apiParam {String} message The Message for Targets
13 # @apiParam {Array} phone_number[] Array of normalized phone number, for instance: `phone_number[]=+62...&phone_number[]=+62...`
14 # @apiParam {String} type The type of comment, default is text. optional
15 # @apiParam {JsonObject} payload payload needed for type other than text
16 # =end
17 def send_broadcast
18 begin
19 phone_number = params[:phone_number]
20 if phone_number.nil? || !phone_number.kind_of?(Array)
21 raise InputError.new("phone_number must be present in array form.")
22 end
23 phone_numbers = Array.new
24 current_user_phone_number = @current_user.phone_number
25
26 params[:phone_number].each do | phone_number |
27 phone_number = phone_number.strip().delete(' ') # remove all spaces
28 phone_number = phone_number.strip().delete('-') # remove dash
29 phone_number = phone_number.gsub(/[[:space:]]/, '')
30
31 if phone_number.start_with?("8")
32 phone_number = @current_user.country_code + phone_number
33 elsif phone_number.start_with?("0")
34 phone_number = phone_number[1..-1]
35 phone_number = @current_user.country_code + phone_number
36 end
37 phone_numbers.push(phone_number)
38 end
39
40 target_qiscus_emails = User.where(phone_number: phone_numbers).pluck(:qiscus_email)
41 type_text = "text"
42 type = params[:type] || type_text
43 message = params[:message]
44 payload = params[:payload]
45 if payload.present?
46 payload = payload.to_json
47 end
48
49 if message.nil? && type == type_text
50 raise InputError.new("If type is text please send the message")
51 end
52
53 if type != type_text && payload.nil?
54 raise InputError.new("If type is not text please send the payload")
55 end
56
57 broadcast_message_id = nil
58 ActiveRecord::Base.transaction do
59 # insert broadcast message into db
60 broadcast_message = BroadcastMessage.new(
61 user_id: @current_user.id,
62 message: message,
63 application_id: @current_user.application.id
64 )
65
66 if broadcast_message.save!
67 broadcast_message_id = broadcast_message.id
68 # send broadcast message in background job
69 BroadcastMessageJobV2.perform_later(@current_user, target_qiscus_emails, message, type, payload, broadcast_message.id)
70 else
71 raise InputError.new("Broadcast message not created")
72 end
73 end
74
75 render json: {
76 status: "success",
77 broadcast_message_id: broadcast_message_id,
78 phone_numbers: phone_numbers
79 }
80
81 rescue ActiveRecord::RecordInvalid => e
82 msg = ""
83 e.record.errors.map do |k, v|
84 key = k.to_s.humanize
85 msg = msg + "#{key} #{v}, "
86 end
87
88 msg = msg.chomp(", ") + "."
89 render json: {
90 error: {
91 message: msg
92 }
93 }, status: 422 and return
94
95 rescue => e
96 render json: {
97 error: {
98 message: e.message,
99 class: e.class.name
100 }
101 }, status: 422 and return
102 end
103 end
104 end
105