2018-05-28 23:45:29 +00:00
|
|
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
|
|
|
class Integration::CtiController < ApplicationController
|
|
|
|
skip_before_action :verify_csrf_token
|
|
|
|
before_action :check_configured, :check_token
|
|
|
|
|
|
|
|
# notify about inbound call / block inbound call
|
|
|
|
def event
|
|
|
|
if params['direction'] == 'in'
|
|
|
|
if params['event'] == 'newCall'
|
|
|
|
config_inbound = config_integration[:inbound] || {}
|
|
|
|
block_caller_ids = config_inbound[:block_caller_ids] || []
|
|
|
|
|
|
|
|
# check if call need to be blocked
|
|
|
|
block_caller_ids.each do |item|
|
|
|
|
next unless item[:caller_id] == params['from']
|
|
|
|
|
|
|
|
render json: { action: 'reject', reason: 'busy' }, status: :ok
|
|
|
|
|
|
|
|
#params['Reject'] = 'busy'
|
|
|
|
params['comment'] = 'reject, busy'
|
|
|
|
if params['user']
|
|
|
|
params['comment'] = "#{params['user']} -> reject, busy"
|
|
|
|
end
|
|
|
|
Cti::Log.process(params)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
Cti::Log.process(params)
|
|
|
|
|
|
|
|
render json: {}, status: :ok
|
|
|
|
return true
|
|
|
|
elsif params['direction'] == 'out'
|
|
|
|
config_outbound = config_integration[:outbound]
|
|
|
|
routing_table = nil
|
|
|
|
default_caller_id = nil
|
|
|
|
if config_outbound.present?
|
|
|
|
routing_table = config_outbound[:routing_table]
|
|
|
|
default_caller_id = config_outbound[:default_caller_id]
|
|
|
|
end
|
|
|
|
|
|
|
|
# set callerId
|
|
|
|
data = {}
|
|
|
|
to = params[:to]
|
|
|
|
from = nil
|
|
|
|
if to && routing_table.present?
|
|
|
|
routing_table.each do |row|
|
|
|
|
dest = row[:dest].gsub(/\*/, '.+?')
|
|
|
|
next if to !~ /^#{dest}$/
|
2018-10-09 06:17:41 +00:00
|
|
|
|
2018-05-28 23:45:29 +00:00
|
|
|
from = row[:caller_id]
|
|
|
|
data = {
|
|
|
|
action: 'dial',
|
|
|
|
caller_id: from,
|
|
|
|
number: params[:to]
|
|
|
|
}
|
|
|
|
break
|
|
|
|
end
|
|
|
|
if data.blank? && default_caller_id.present?
|
|
|
|
from = default_caller_id
|
|
|
|
data = {
|
|
|
|
action: 'dial',
|
|
|
|
caller_id: default_caller_id,
|
|
|
|
number: params[:to]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
render json: data, status: :ok
|
|
|
|
|
|
|
|
if from.present?
|
|
|
|
params['from'] = from
|
|
|
|
end
|
|
|
|
Cti::Log.process(params)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
render json: { error: 'Invalid direction!' }, status: :unprocessable_entity
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def check_token
|
|
|
|
if Setting.get('cti_token') != params[:token]
|
|
|
|
response_unauthorized('Invalid token, please contact your admin!')
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_configured
|
|
|
|
http_log_config facility: 'cti'
|
|
|
|
|
|
|
|
if !Setting.get('cti_integration')
|
|
|
|
response_error('Feature is disable, please contact your admin to enable it!')
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if config_integration.blank? || config_integration[:inbound].blank? || config_integration[:outbound].blank?
|
|
|
|
response_error('Feature not configured, please contact your admin!')
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def config_integration
|
|
|
|
@config_integration ||= Setting.get('cti_config')
|
|
|
|
end
|
|
|
|
|
|
|
|
def response_error(error)
|
|
|
|
render json: { error: error }, status: :unprocessable_entity
|
|
|
|
end
|
|
|
|
|
|
|
|
def response_unauthorized(error)
|
|
|
|
render json: { error: error }, status: :unauthorized
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|