chore: Ability to create contact with identifiers (#2802)

This commit is contained in:
Sojan Jose
2021-08-13 13:02:46 +05:30
committed by GitHub
parent d492a65c24
commit acb39cbc8f
7 changed files with 53 additions and 11 deletions

View File

@@ -22,7 +22,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
render json: { error: 'Specify search string with parameter q' }, status: :unprocessable_entity if params[:q].blank? && return render json: { error: 'Specify search string with parameter q' }, status: :unprocessable_entity if params[:q].blank? && return
contacts = resolved_contacts.where( contacts = resolved_contacts.where(
'name ILIKE :search OR email ILIKE :search OR phone_number ILIKE :search', 'name ILIKE :search OR email ILIKE :search OR phone_number ILIKE :search OR contacts.identifier LIKE :search',
search: "%#{params[:q]}%" search: "%#{params[:q]}%"
) )
@contacts_count = contacts.count @contacts_count = contacts.count
@@ -108,7 +108,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
end end
def contact_params def contact_params
params.require(:contact).permit(:name, :email, :phone_number, additional_attributes: {}, custom_attributes: {}) params.require(:contact).permit(:name, :identifier, :email, :phone_number, additional_attributes: {}, custom_attributes: {})
end end
def contact_custom_attributes def contact_custom_attributes

View File

@@ -1,7 +1,8 @@
module ExceptionList module ExceptionList
REST_CLIENT_EXCEPTIONS = [RestClient::NotFound, RestClient::GatewayTimeout, RestClient::BadRequest, REST_CLIENT_EXCEPTIONS = [RestClient::NotFound, RestClient::GatewayTimeout, RestClient::BadRequest,
RestClient::MethodNotAllowed, RestClient::Forbidden, RestClient::InternalServerError, RestClient::MethodNotAllowed, RestClient::Forbidden, RestClient::InternalServerError,
RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout, SocketError].freeze RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout,
RestClient::MovedPermanently, SocketError].freeze
SMTP_EXCEPTIONS = [ SMTP_EXCEPTIONS = [
Net::SMTPSyntaxError Net::SMTPSyntaxError
].freeze ].freeze

View File

@@ -188,6 +188,19 @@ RSpec.describe 'Contacts API', type: :request do
expect(response.body).to include(contact2.email) expect(response.body).to include(contact2.email)
expect(response.body).not_to include(contact1.email) expect(response.body).not_to include(contact1.email)
end end
it 'matches the contact respecting the identifier character casing' do
contact_normal = create(:contact, name: 'testcontact', account: account, identifier: 'testidentifer')
contact_special = create(:contact, name: 'testcontact', account: account, identifier: 'TestIdentifier')
get "/api/v1/accounts/#{account.id}/contacts/search",
params: { q: 'TestIdentifier' },
headers: admin.create_new_auth_token,
as: :json
expect(response).to have_http_status(:success)
expect(response.body).to include(contact_special.identifier)
expect(response.body).not_to include(contact_normal.identifier)
end
end end
end end
@@ -284,7 +297,7 @@ RSpec.describe 'Contacts API', type: :request do
expect(json_response['payload']['contact']['custom_attributes']).to eq({ 'test' => 'test', 'test1' => 'test1' }) expect(json_response['payload']['contact']['custom_attributes']).to eq({ 'test' => 'test', 'test1' => 'test1' })
end end
it 'creates the contact identifier when inbox id is passed' do it 'creates the contact inbox when inbox id is passed' do
expect do expect do
post "/api/v1/accounts/#{account.id}/contacts", headers: admin.create_new_auth_token, post "/api/v1/accounts/#{account.id}/contacts", headers: admin.create_new_auth_token,
params: valid_params.merge({ inbox_id: inbox.id }) params: valid_params.merge({ inbox_id: inbox.id })

View File

@@ -5,7 +5,13 @@ properties:
required: true required: true
name: name:
type: string type: string
description: name of the contact
email: email:
type: string type: string
description: email of the contact
phone_number: phone_number:
type: string type: string
description: phone number of the contact
identifier:
type: string
description: A unique identifier for the contact in external system

View File

@@ -2,7 +2,13 @@ type: object
properties: properties:
name: name:
type: string type: string
description: name of the contact
email: email:
type: string type: string
description: email of the contact
phone_number: phone_number:
type: string type: string
description: phone number of the contact
identifier:
type: string
description: A unique identifier for the contact in external system

View File

@@ -8,6 +8,7 @@ get:
- name: q - name: q
in: query in: query
type: string type: string
description: Search using contact `name`, `identifier`, `email` or `phone number`
- $ref: '#/parameters/contact_sort_param' - $ref: '#/parameters/contact_sort_param'
- $ref: '#/parameters/page' - $ref: '#/parameters/page'
responses: responses:

View File

@@ -1281,7 +1281,8 @@
{ {
"name": "q", "name": "q",
"in": "query", "in": "query",
"type": "string" "type": "string",
"description": "Search using contact `name`, `identifier`, `email` or `phone number`"
}, },
{ {
"$ref": "#/parameters/contact_sort_param" "$ref": "#/parameters/contact_sort_param"
@@ -3376,13 +3377,20 @@
"required": true "required": true
}, },
"name": { "name": {
"type": "string" "type": "string",
"description": "name of the contact"
}, },
"email": { "email": {
"type": "string" "type": "string",
"description": "email of the contact"
}, },
"phone_number": { "phone_number": {
"type": "string" "type": "string",
"description": "phone number of the contact"
},
"identifier": {
"type": "string",
"description": "A unique identifier for the contact in external system"
} }
} }
}, },
@@ -3390,13 +3398,20 @@
"type": "object", "type": "object",
"properties": { "properties": {
"name": { "name": {
"type": "string" "type": "string",
"description": "name of the contact"
}, },
"email": { "email": {
"type": "string" "type": "string",
"description": "email of the contact"
}, },
"phone_number": { "phone_number": {
"type": "string" "type": "string",
"description": "phone number of the contact"
},
"identifier": {
"type": "string",
"description": "A unique identifier for the contact in external system"
} }
} }
}, },