Skip to content
This repository was archived by the owner on Jan 28, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions app/controllers/api/v1/webhooks/converse_controller.rb
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
27 changes: 27 additions & 0 deletions spec/fixtures/converse-ai/inbound.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
27 changes: 27 additions & 0 deletions spec/fixtures/converse-ai/outbound.json
Original file line number Diff line number Diff line change
@@ -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"
}
}