123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # 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
|