diff --git a/app/controllers/api/v1/widget/events_controller.rb b/app/controllers/api/v1/widget/events_controller.rb index b32b0f78d..ea5326d6f 100644 --- a/app/controllers/api/v1/widget/events_controller.rb +++ b/app/controllers/api/v1/widget/events_controller.rb @@ -2,12 +2,19 @@ class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController include Events::Types def create - Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox) + Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox, event_info: event_info) head :no_content end private + def event_info + { + widget_language: params[:locale], + browser_language: browser.accept_language.first&.code + } + end + def permitted_params params.permit(:name, :website_token) end diff --git a/app/javascript/widget/api/endPoints.js b/app/javascript/widget/api/endPoints.js index ef51af907..64432402e 100755 --- a/app/javascript/widget/api/endPoints.js +++ b/app/javascript/widget/api/endPoints.js @@ -1,15 +1,8 @@ -import Vue from 'vue'; +import { buildSearchParamsWithLocale } from '../helpers/urlParamsHelper'; const sendMessage = content => { - const locale = Vue.config.lang; const refererURL = window.refererURL || ''; - let search = window.location.search; - if (search) { - search = `${search}&locale=${locale}`; - } else { - search = `?locale=${locale}`; - } - + const search = buildSearchParamsWithLocale(window.location.search); return { url: `/api/v1/widget/messages${search}`, params: { diff --git a/app/javascript/widget/api/events.js b/app/javascript/widget/api/events.js index 61c0c0db2..0c8fcfb23 100644 --- a/app/javascript/widget/api/events.js +++ b/app/javascript/widget/api/events.js @@ -1,7 +1,9 @@ import { API } from 'widget/helpers/axios'; +import { buildSearchParamsWithLocale } from '../helpers/urlParamsHelper'; export default { create(name) { - return API.post(`/api/v1/widget/events${window.location.search}`, { name }); + const search = buildSearchParamsWithLocale(window.location.search); + return API.post(`/api/v1/widget/events${search}`, { name }); }, }; diff --git a/app/javascript/widget/helpers/specs/urlParamsHelper.spec.js b/app/javascript/widget/helpers/specs/urlParamsHelper.spec.js new file mode 100644 index 000000000..422a45f88 --- /dev/null +++ b/app/javascript/widget/helpers/specs/urlParamsHelper.spec.js @@ -0,0 +1,16 @@ +import { buildSearchParamsWithLocale } from '../urlParamsHelper'; + +jest.mock('vue', () => ({ + config: { + lang: 'el', + }, +})); + +describe('#buildSearchParamsWithLocale', () => { + it('returns correct search params', () => { + expect(buildSearchParamsWithLocale('?test=1234')).toEqual( + '?test=1234&locale=el' + ); + expect(buildSearchParamsWithLocale('')).toEqual('?locale=el'); + }); +}); diff --git a/app/javascript/widget/helpers/urlParamsHelper.js b/app/javascript/widget/helpers/urlParamsHelper.js new file mode 100644 index 000000000..271c5eb94 --- /dev/null +++ b/app/javascript/widget/helpers/urlParamsHelper.js @@ -0,0 +1,10 @@ +import Vue from 'vue'; +export const buildSearchParamsWithLocale = search => { + const locale = Vue.config.lang; + if (search) { + search = `${search}&locale=${locale}`; + } else { + search = `?locale=${locale}`; + } + return search; +}; diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb index 4c7b4a610..b4b9cc8a3 100644 --- a/app/listeners/agent_bot_listener.rb +++ b/app/listeners/agent_bot_listener.rb @@ -56,6 +56,7 @@ class AgentBotListener < BaseListener agent_bot = inbox.agent_bot_inbox.agent_bot payload = contact_inbox.webhook_data.merge(event: __method__.to_s) + payload[:event_info] = event.data[:event_info] AgentBotJob.perform_later(agent_bot.outgoing_url, payload) end end diff --git a/app/listeners/webhook_listener.rb b/app/listeners/webhook_listener.rb index 1244df148..14ad91709 100644 --- a/app/listeners/webhook_listener.rb +++ b/app/listeners/webhook_listener.rb @@ -38,6 +38,7 @@ class WebhookListener < BaseListener inbox = contact_inbox.inbox payload = contact_inbox.webhook_data.merge(event: __method__.to_s) + payload[:event_info] = event.data[:event_info] deliver_webhook_payloads(payload, inbox) end diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 98c3ebcc6..4798d36b3 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -107,10 +107,7 @@ class Conversation < ApplicationRecord end def webhook_data - { - display_id: display_id, - additional_attributes: additional_attributes - } + Conversations::EventDataPresenter.new(self).push_data end def notifiable_assignee_change? diff --git a/db/schema.rb b/db/schema.rb index 5771ffe28..000d1e4b7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -13,6 +13,7 @@ ActiveRecord::Schema.define(version: 2020_06_10_143132) do # These are extensions that must be enabled in order to support this database + enable_extension "pg_stat_statements" enable_extension "pgcrypto" enable_extension "plpgsql" @@ -205,8 +206,8 @@ ActiveRecord::Schema.define(version: 2020_06_10_143132) do t.boolean "locked", default: false t.jsonb "additional_attributes" t.bigint "contact_inbox_id" - t.string "identifier" t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false + t.string "identifier" t.index ["account_id", "display_id"], name: "index_conversations_on_account_id_and_display_id", unique: true t.index ["account_id"], name: "index_conversations_on_account_id" t.index ["contact_inbox_id"], name: "index_conversations_on_contact_inbox_id" @@ -228,17 +229,6 @@ ActiveRecord::Schema.define(version: 2020_06_10_143132) do t.index ["user_id"], name: "index_events_on_user_id" end - create_table "hooks_inbox_apps", force: :cascade do |t| - t.integer "inbox_id" - t.integer "agent_id" - t.integer "account_id" - t.string "app_slug" - t.string "status" - t.text "settings" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - end - create_table "inbox_members", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.integer "inbox_id", null: false @@ -381,11 +371,9 @@ ActiveRecord::Schema.define(version: 2020_06_10_143132) do t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy" t.index ["taggable_id"], name: "index_taggings_on_taggable_id" - t.index ["taggable_type", "taggable_id"], name: "index_taggings_on_taggable_type_and_taggable_id" t.index ["taggable_type"], name: "index_taggings_on_taggable_type" t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type" t.index ["tagger_id"], name: "index_taggings_on_tagger_id" - t.index ["tagger_type", "tagger_id"], name: "index_taggings_on_tagger_type_and_tagger_id" end create_table "tags", id: :serial, force: :cascade do |t| diff --git a/spec/controllers/api/v1/widget/events_controller_spec.rb b/spec/controllers/api/v1/widget/events_controller_spec.rb index e99686830..a1b8e4af9 100644 --- a/spec/controllers/api/v1/widget/events_controller_spec.rb +++ b/spec/controllers/api/v1/widget/events_controller_spec.rb @@ -30,7 +30,9 @@ RSpec.describe '/api/v1/widget/events', type: :request do as: :json expect(response).to have_http_status(:success) - expect(Rails.configuration.dispatcher).to have_received(:dispatch).with(params[:name], anything, contact_inbox: contact_inbox) + expect(Rails.configuration.dispatcher).to have_received(:dispatch) + .with(params[:name], anything, contact_inbox: contact_inbox, + event_info: { browser_language: nil, widget_language: nil }) end end end