diff --git a/app/controllers/api/v1/webhooks/converse_controller.rb b/app/controllers/api/v1/webhooks/converse_controller.rb new file mode 100644 index 00000000..079fdcc0 --- /dev/null +++ b/app/controllers/api/v1/webhooks/converse_controller.rb @@ -0,0 +1,92 @@ +class Api::V1::Webhooks::ConverseController < Api::V1::ApplicationController + before_action :set_bot + before_action :set_integration + before_action :throttle + + # POST api.domain.tld/v1/b/1/webhooks/converse + # @raise [UnfullfiledRequestError] + def create + @message = Api::Message.new(message_params).tap(&:sanitize!) + @conversation = Api::Conversation.new(conversation_params) + @creator = Api::Creator.new(creator_params) + + if @message.valid? && @conversation.valid? && @creator.valid? + CreateRequestJob.perform_async(@bot.id, { request_id: request.request_id, payload: params[:converse].to_json, fulfilled: true }) + TrackMessageJob.perform_async(@message.attributes, @conversation.attributes, @creator.attributes, @bot.id) + else + CreateRequestJob.perform_async(@bot.id, { request_id: request.request_id, payload: params[:converse].to_json }) + + error = UnfullfiledRequestError.new + logger.error(error) + Appsignal.add_exception(error) + end + + head :created + end + + + private + + # @return [Hash] + def message_params + { + distinct_id: webhook_params[:request][:requestUUID], + mtype: 'text', + platform: "api", + provider: 'converse-ai', + sent_at: webhook_params[:comment][:createTime], + properties: { + text: webhook_params[:comment][:commentData] + } + } + end + + # @return [Hash] + def conversation_params + { + distinct_id: "TODO" + } + end + + # @return [Hash] + def creator_params + if webhook_params[:comment][:submitBy] == "SYSTEM" + { + type: 'Bot', + distinct_id: @bot.id + } + elsif webhook_params[:comment][:submitBy] == "USER" + { + type: 'Interlocutor', + distinct_id: webhook_params[:user][:objectUUID], + first_name: webhook_params[:user][:name], + email: webhook_params[:user][:email] + } + else + Hash.new + end + end + + # Whitelist webhook payload + # @raise [ActionController::ParameterMissing] + # @return [ActionController::Parameters] + def webhook_params + payload = params.except(*request.path_parameters.keys) + + payload.require(:comment) + payload.require(:request) + payload.require(:user) + + payload.slice(:comment, :request, :user).permit! + end + + # @raise [ActiveRecord::RecordNotFound] + def set_integration + @integration = @bot.integrations.find_by!(active: true, type: "Integrations::Converse") + end + + # @raise [ActiveRecord::RecordNotFound] + def set_bot + @bot = Bot.friendly.find(params[:bot_id]) + end +end diff --git a/config/routes.rb b/config/routes.rb index 3ec2482e..cf7bb2bb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ namespace :webhooks do post :smooch, controller: :smooch, action: :create, as: :smooch + post :converse, controller: :converse, action: :create, as: :converse end end diff --git a/spec/fixtures/converse-ai/inbound.json b/spec/fixtures/converse-ai/inbound.json new file mode 100644 index 00000000..69a08f52 --- /dev/null +++ b/spec/fixtures/converse-ai/inbound.json @@ -0,0 +1,27 @@ +{ + "comment":{ + "commentData":"hi", + "createTime":1485281463896941452, + "location":{ + "lat":-180, + "long":-180 + }, + "objectUUID":"8712F0AB-DBA7-41BE-B998-D06015E09305", + "requestUUID":"67E65E14-1266-45C8-99D7-0605EA4467FD", + "submitBy":"USER" + }, + "request":{ + "createTime":1485280958836424905, + "lastModifyTime":1485281463896941452, + "location":{ + "lat":-180, + "long":-180 + }, + "objectUUID":"67E65E14-1266-45C8-99D7-0605EA4467FD" + }, + "user":{ + "email":"p@dialoganalytics.com", + "name":"Admin user For dialoganalytics", + "objectUUID":"5C83F2B2-8312-4882-AD3F-B41454E722EB" + } +} diff --git a/spec/fixtures/converse-ai/outbound.json b/spec/fixtures/converse-ai/outbound.json new file mode 100644 index 00000000..f4316da0 --- /dev/null +++ b/spec/fixtures/converse-ai/outbound.json @@ -0,0 +1,27 @@ +{ + "comment":{ + "commentData":"Hey how are you?", + "createTime":1485281463985857689, + "location":{ + "lat":-180, + "long":-180 + }, + "objectUUID":"7200EFB0-0BC6-4C10-ABE6-3440ED3153F1", + "requestUUID":"67E65E14-1266-45C8-99D7-0605EA4467FD", + "submitBy":"SYSTEM" + }, + "request":{ + "createTime":1485280958836424905, + "lastModifyTime":1485281463985857689, + "location":{ + "lat":-180, + "long":-180 + }, + "objectUUID":"67E65E14-1266-45C8-99D7-0605EA4467FD" + }, + "user":{ + "email":"p@dialoganalytics.com", + "name":"Admin user For dialoganalytics", + "objectUUID":"5C83F2B2-8312-4882-AD3F-B41454E722EB" + } +}