From 788409055198042dca2ee0abbaf746c7fd30d6de Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 7 Jan 2021 13:47:38 +0530 Subject: [PATCH] chore: Enable updating conversation additional attributes (#1611) - Enable updating additional attributes via conversation API - Handle the case when additional_attributes is nil Fixes: #1357 --- .../v1/accounts/conversations_controller.rb | 3 +- .../api/v1/widget/messages_controller.rb | 2 ++ app/models/conversation.rb | 5 +++ .../accounts/conversations_controller_spec.rb | 32 +++++++++++++++++++ .../paths/conversation/index_or_create.yml | 3 ++ swagger/swagger.json | 4 +++ 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/accounts/conversations_controller.rb b/app/controllers/api/v1/accounts/conversations_controller.rb index 7642e94e3..5dddf8036 100644 --- a/app/controllers/api/v1/accounts/conversations_controller.rb +++ b/app/controllers/api/v1/accounts/conversations_controller.rb @@ -86,7 +86,8 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro account_id: Current.account.id, inbox_id: @contact_inbox.inbox_id, contact_id: @contact_inbox.contact_id, - contact_inbox_id: @contact_inbox.id + contact_inbox_id: @contact_inbox.id, + additional_attributes: params[:additional_attributes] } end diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index a4f33b563..c98138366 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -54,6 +54,8 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController end def conversation_params + # FIXME: typo referrer in additional attributes + # will probably require a migration. { account_id: inbox.account_id, inbox_id: inbox.id, diff --git a/app/models/conversation.rb b/app/models/conversation.rb index be9bf26ab..19d0cd99f 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -36,6 +36,7 @@ class Conversation < ApplicationRecord validates :account_id, presence: true validates :inbox_id, presence: true + before_validation :validate_additional_attributes enum status: { open: 0, resolved: 1, bot: 2 } @@ -136,6 +137,10 @@ class Conversation < ApplicationRecord private + def validate_additional_attributes + self.additional_attributes = {} unless additional_attributes.is_a?(Hash) + end + def set_bot_conversation self.status = :bot if inbox.agent_bot_inbox&.active? end diff --git a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb index fbefe25a1..5c88f2402 100644 --- a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb @@ -117,6 +117,38 @@ RSpec.describe 'Conversations API', type: :request do end end + describe 'POST /api/v1/accounts/{account.id}/conversations' do + let(:contact) { create(:contact, account: account) } + let(:inbox) { create(:inbox, account: account) } + let(:contact_inbox) { create(:contact_inbox, contact: contact, inbox: inbox) } + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + post "/api/v1/accounts/#{account.id}/conversations", + params: { source_id: contact_inbox.source_id }, + as: :json + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + let(:agent) { create(:user, account: account, role: :agent) } + + it 'creates a new conversation' do + allow(Rails.configuration.dispatcher).to receive(:dispatch) + post "/api/v1/accounts/#{account.id}/conversations", + headers: agent.create_new_auth_token, + params: { source_id: contact_inbox.source_id }, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body, symbolize_names: true) + expect(response_data[:additional_attributes]).to eq({}) + end + end + end + describe 'POST /api/v1/accounts/{account.id}/conversations/:id/toggle_status' do let(:conversation) { create(:conversation, account: account) } diff --git a/swagger/paths/conversation/index_or_create.yml b/swagger/paths/conversation/index_or_create.yml index e9d867005..5bf8dd324 100644 --- a/swagger/paths/conversation/index_or_create.yml +++ b/swagger/paths/conversation/index_or_create.yml @@ -100,6 +100,9 @@ post: source_id: type: string description: Contact Source Id + additional_attributes: + type: object + description: Lets you specify attributes like browser information responses: 200: diff --git a/swagger/swagger.json b/swagger/swagger.json index a9c4efaf7..f9781f24a 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -377,6 +377,10 @@ "source_id": { "type": "string", "description": "Contact Source Id" + }, + "additional_attributes": { + "type": "object", + "description": "Lets you specify attributes like browser information" } } }