diff --git a/app/controllers/public/api/v1/inboxes/conversations_controller.rb b/app/controllers/public/api/v1/inboxes/conversations_controller.rb index 3d86ca87c..c79952372 100644 --- a/app/controllers/public/api/v1/inboxes/conversations_controller.rb +++ b/app/controllers/public/api/v1/inboxes/conversations_controller.rb @@ -33,7 +33,7 @@ class Public::Api::V1::Inboxes::ConversationsController < Public::Api::V1::Inbox end def create_conversation - ::Conversation.create!(conversation_params) + ConversationBuilder.new(params: conversation_params, contact_inbox: @contact_inbox).perform end def trigger_typing_event(event) @@ -41,11 +41,6 @@ class Public::Api::V1::Inboxes::ConversationsController < Public::Api::V1::Inbox end def conversation_params - { - account_id: @contact_inbox.contact.account_id, - inbox_id: @contact_inbox.inbox_id, - contact_id: @contact_inbox.contact_id, - contact_inbox_id: @contact_inbox.id - } + params.permit(custom_attributes: {}) end end diff --git a/spec/controllers/public/api/v1/inbox/conversations_controller_spec.rb b/spec/controllers/public/api/v1/inbox/conversations_controller_spec.rb index 19f08d49b..0bd8cbfd0 100644 --- a/spec/controllers/public/api/v1/inbox/conversations_controller_spec.rb +++ b/spec/controllers/public/api/v1/inbox/conversations_controller_spec.rb @@ -44,6 +44,17 @@ RSpec.describe 'Public Inbox Contact Conversations API', type: :request do data = response.parsed_body expect(data['id']).not_to be_nil end + + it 'creates a conversation with custom attributes but prevents other attributes' do + post "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations", + params: { custom_attributes: { 'test' => 'test' }, additional_attributes: { 'test' => 'test' } } + + expect(response).to have_http_status(:success) + data = response.parsed_body + conversation = api_channel.inbox.conversations.find_by(display_id: data['id']) + expect(conversation.custom_attributes).to eq('test' => 'test') + expect(conversation.additional_attributes).to be_empty + end end describe 'POST /public/api/v1/inboxes/{identifier}/contact/{source_id}/conversations/{conversation_id}/toggle_typing' do diff --git a/swagger/definitions/index.yml b/swagger/definitions/index.yml index ccc288180..ef9213d2a 100644 --- a/swagger/definitions/index.yml +++ b/swagger/definitions/index.yml @@ -138,6 +138,9 @@ public_message_create_payload: public_message_update_payload: $ref: ./request/public/message/update_payload.yml +public_conversation_create_payload: + $ref: ./request/public/conversation/create_payload.yml + ## ---------- RESPONSE ------------- ## ## -------------------------------- ## diff --git a/swagger/definitions/request/public/conversation/create_payload.yml b/swagger/definitions/request/public/conversation/create_payload.yml new file mode 100644 index 000000000..37cd9f7ef --- /dev/null +++ b/swagger/definitions/request/public/conversation/create_payload.yml @@ -0,0 +1,5 @@ +type: object +properties: + custom_attributes: + type: object + description: Custom attributes of the conversation diff --git a/swagger/paths/public/inboxes/conversations/create.yml b/swagger/paths/public/inboxes/conversations/create.yml index 5f694ff34..4c2a85d22 100644 --- a/swagger/paths/public/inboxes/conversations/create.yml +++ b/swagger/paths/public/inboxes/conversations/create.yml @@ -4,6 +4,12 @@ operationId: create-a-conversation summary: Create a conversation description: Create a conversation security: [] +parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/public_conversation_create_payload' responses: 200: description: Success diff --git a/swagger/swagger.json b/swagger/swagger.json index 70a4d5904..cd8f3e7d3 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -847,6 +847,16 @@ "description": "Create a conversation", "security": [ + ], + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/public_conversation_create_payload" + } + } ], "responses": { "200": { @@ -6617,6 +6627,15 @@ } } }, + "public_conversation_create_payload": { + "type": "object", + "properties": { + "custom_attributes": { + "type": "object", + "description": "Custom attributes of the conversation" + } + } + }, "extended_contact": { "allOf": [ {