trabajo-afectivo/app/controllers/integration/cti_controller.rb

118 lines
3.1 KiB
Ruby
Raw Normal View History

# 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}$/
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