12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://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
- local_params = ActiveSupport::HashWithIndifferentAccess.new(params.permit!.to_h)
- cti = Cti::Driver::Cti.new(params: local_params, config: config_integration)
- result = cti.process
- # check if inbound call should get rejected
- if result[:action] == 'reject'
- response_ok(action: 'reject', reason: 'busy')
- return true
- end
- # check if outbound call changes the outbound caller_id
- if result[:action] == 'set_caller_id'
- data = {
- action: 'dial',
- caller_id: result[:params][:from_caller_id],
- number: result[:params][:to_caller_id],
- }
- response_ok(data)
- return true
- end
- if result[:action] == 'invalid_direction'
- response_error(__("Invalid 'direction'!"))
- return true
- end
- response_ok({})
- 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 disabled, please contact your administrator!'))
- 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
- def response_ok(data)
- render json: data, status: :ok
- end
- end
|