diff --git a/app/services/filter_service.rb b/app/services/filter_service.rb index 9715ba7fc..263a6bfeb 100644 --- a/app/services/filter_service.rb +++ b/app/services/filter_service.rb @@ -32,6 +32,8 @@ class FilterService def filter_values(query_hash) if query_hash['attribute_key'] == 'status' + return Conversation.statuses.values if query_hash['values'].include?('all') + query_hash['values'].map { |x| Conversation.statuses[x.to_sym] } else query_hash['values'] diff --git a/spec/services/conversations/filter_service_spec.rb b/spec/services/conversations/filter_service_spec.rb index 4ee9450c9..29d6cb2cf 100644 --- a/spec/services/conversations/filter_service_spec.rb +++ b/spec/services/conversations/filter_service_spec.rb @@ -51,6 +51,14 @@ describe ::Conversations::FilterService do expect(result.length).to be conversations.count end + it 'filter conversations by custom_attributes and status with pagination' do + params[:payload] = payload + params[:page] = 2 + result = filter_service.new(params, user_1).perform + conversations = Conversation.where("additional_attributes ->> 'browser_language' IN (?) AND status IN (?)", ['en'], [1, 2]) + expect(result.length).to be conversations.count + end + it 'filter conversations by tags' do Conversation.last.update_labels('support') params[:payload] = [ diff --git a/swagger/paths/application/conversation/filter.yml b/swagger/paths/application/conversation/filter.yml new file mode 100644 index 000000000..39d8259cf --- /dev/null +++ b/swagger/paths/application/conversation/filter.yml @@ -0,0 +1,44 @@ +post: + tags: + - Conversation + operationId: conversationFilter + description: Filter conversations with custom filter options and pagination + summary: Conversations Filter + security: + - userApiKey: [] + - agentBotApiKey: [] + parameters: + - name: page + in: query + type: integer + - name: payload + in: body + required: true + schema: + type: array + items: + type: object + properties: + attribute_key: + type: string + description: filter attribute name + filter_operator: + type: string + description: filter operator name + values: + type: array + description: array of the attribute values to filter + query_operator: + type: string + description: query operator name + - $ref: '#/parameters/account_id' + responses: + 200: + description: Success + schema: + $ref: '#/definitions/conversation_list' + 400: + description: Bad Request Error + schema: + $ref: '#/definitions/bad_request_error' + description: Access denied diff --git a/swagger/paths/index.yml b/swagger/paths/index.yml index 4936bc1b7..7f25ec67e 100644 --- a/swagger/paths/index.yml +++ b/swagger/paths/index.yml @@ -146,7 +146,7 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat /api/v1/accounts/{account_id}/agents/{id}: patch: $ref: ./application/agents/update.yml - delete: + delete: $ref: ./application/agents/delete.yml @@ -174,6 +174,10 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat parameters: - $ref: '#/parameters/account_id' $ref: ./application/conversation/create.yml +/api/v1/accounts/{account_id}/conversations/filter: + parameters: + - $ref: '#/parameters/account_id' + $ref: ./application/conversation/filter.yml /api/v1/accounts/{account_id}/conversations/{converstion_id}: parameters: - $ref: '#/parameters/account_id' @@ -230,9 +234,9 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat $ref: ./application/inboxes/inbox_members/create.yml patch: $ref: ./application/inboxes/inbox_members/update.yml - delete: + delete: $ref: ./application/inboxes/inbox_members/delete.yml - + # Messages diff --git a/swagger/swagger.json b/swagger/swagger.json index 22978bb67..fadd07720 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -1908,6 +1908,82 @@ } } }, + "/api/v1/accounts/{account_id}/conversations/filter": { + "post": { + "tags": [ + "Conversation" + ], + "operationId": "conversationFilter", + "description": "Filter conversations with custom filter options and pagination", + "summary": "Conversations Filter", + "security": [ + { + "userApiKey": [ + + ] + }, + { + "agentBotApiKey": [ + + ] + } + ], + "parameters": [ + { + "name": "page", + "in": "query", + "type": "integer" + }, + { + "name": "payload", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "attribute_key": { + "type": "string", + "description": "filter attribute name" + }, + "filter_operator": { + "type": "string", + "description": "filter operator name" + }, + "values": { + "type": "array", + "description": "array of the attribute values to filter" + }, + "query_operator": { + "type": "string", + "description": "query operator name" + } + } + } + } + }, + { + "$ref": "#/parameters/account_id" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/conversation_list" + } + }, + "400": { + "description": "Bad Request Error", + "schema": { + "$ref": "#/definitions/bad_request_error" + } + }, + "description": "Access denied" + } + } + }, "/api/v1/accounts/{account_id}/conversations/{converstion_id}": { "parameters": [ {