Improved ticket search.
This commit is contained in:
parent
2bb247f6e9
commit
c28c8514c4
4 changed files with 86 additions and 30 deletions
|
@ -393,7 +393,9 @@ class TicketsController < ApplicationController
|
|||
def search
|
||||
|
||||
# permit nested conditions
|
||||
params.require(:condition).permit!
|
||||
if params[:condition]
|
||||
params.require(:condition).permit!
|
||||
end
|
||||
|
||||
# build result list
|
||||
tickets = Ticket.search(
|
||||
|
|
|
@ -421,6 +421,10 @@ generate condition query to search for tickets based on condition
|
|||
condition example
|
||||
|
||||
{
|
||||
'ticket.title' => {
|
||||
operator: 'contains', # contains not
|
||||
value: 'some value',
|
||||
},
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1,2,5]
|
||||
|
|
|
@ -58,6 +58,7 @@ search tickets via database
|
|||
|
||||
result = Ticket.search(
|
||||
current_user: User.find(123),
|
||||
query: 'some query', # query or condition is required
|
||||
condition: {
|
||||
'tickets.owner_id' => {
|
||||
operator: 'is',
|
||||
|
@ -89,6 +90,7 @@ returns
|
|||
|
||||
# get params
|
||||
query = params[:query]
|
||||
condition = params[:condition]
|
||||
limit = params[:limit] || 12
|
||||
current_user = params[:current_user]
|
||||
full = false
|
||||
|
@ -97,7 +99,7 @@ returns
|
|||
end
|
||||
|
||||
# try search index backend
|
||||
if !params[:condition] && SearchIndexBackend.enabled?
|
||||
if !condition && SearchIndexBackend.enabled?
|
||||
query_extention = {}
|
||||
query_extention['bool'] = {}
|
||||
query_extention['bool']['must'] = []
|
||||
|
@ -160,7 +162,7 @@ returns
|
|||
.order('tickets.created_at DESC')
|
||||
.limit(limit)
|
||||
else
|
||||
query_condition, bind_condition = selector2sql(params[:condition])
|
||||
query_condition, bind_condition = selector2sql(condition)
|
||||
tickets_all = Ticket.select('DISTINCT(tickets.id), tickets.created_at')
|
||||
.where(access_condition)
|
||||
.where(query_condition, *bind_condition)
|
||||
|
|
|
@ -225,8 +225,9 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
test '02.04 ticket with correct ticket id' do
|
||||
title = "ticket with corret ticket id testagent#{rand(999_999_999)}"
|
||||
ticket = Ticket.create!(
|
||||
title: 'ticket with corret ticket id',
|
||||
title: title,
|
||||
group: Group.lookup(name: 'Users'),
|
||||
customer_id: @customer_without_org.id,
|
||||
state: Ticket::State.lookup(name: 'new'),
|
||||
|
@ -240,13 +241,13 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['id'])
|
||||
assert_equal('ticket with corret ticket id', result['title'])
|
||||
assert_equal(title, result['title'])
|
||||
assert_equal(ticket.customer_id, result['customer_id'])
|
||||
assert_equal(1, result['updated_by_id'])
|
||||
assert_equal(1, result['created_by_id'])
|
||||
|
||||
params = {
|
||||
title: 'ticket with corret ticket id - 2',
|
||||
title: "#{title} - 2",
|
||||
customer_id: @agent.id,
|
||||
}
|
||||
put "/api/v1/tickets/#{ticket.id}", params.to_json, @headers.merge('Authorization' => credentials)
|
||||
|
@ -254,7 +255,7 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['id'])
|
||||
assert_equal('ticket with corret ticket id - 2', result['title'])
|
||||
assert_equal("#{title} - 2", result['title'])
|
||||
assert_equal(@agent.id, result['customer_id'])
|
||||
assert_equal(@agent.id, result['updated_by_id'])
|
||||
assert_equal(1, result['created_by_id'])
|
||||
|
@ -266,19 +267,42 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
}
|
||||
post '/api/v1/ticket_articles', params.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(201)
|
||||
article_result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, article_result.class)
|
||||
assert_equal(ticket.id, article_result['ticket_id'])
|
||||
assert_equal('Tickets Agent', article_result['from'])
|
||||
assert_equal('some subject', article_result['subject'])
|
||||
assert_equal('some body', article_result['body'])
|
||||
assert_equal('text/plain', article_result['content_type'])
|
||||
assert_equal(false, article_result['internal'])
|
||||
assert_equal(@agent.id, article_result['created_by_id'])
|
||||
assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, article_result['sender_id'])
|
||||
assert_equal(Ticket::Article::Type.lookup(name: 'note').id, article_result['type_id'])
|
||||
|
||||
Scheduler.worker(true)
|
||||
get "/api/v1/tickets/search?query=\"#{CGI.escape(title)}\"", {}, @headers.merge('Authorization' => credentials)
|
||||
assert_response(200)
|
||||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['ticket_id'])
|
||||
assert_equal('Tickets Agent', result['from'])
|
||||
assert_equal('some subject', result['subject'])
|
||||
assert_equal('some body', result['body'])
|
||||
assert_equal('text/plain', result['content_type'])
|
||||
assert_equal(false, result['internal'])
|
||||
assert_equal(@agent.id, result['created_by_id'])
|
||||
assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
|
||||
assert_equal(Ticket::Article::Type.lookup(name: 'note').id, result['type_id'])
|
||||
assert_equal(ticket.id, result['tickets'][0])
|
||||
assert_equal(1, result['tickets_count'])
|
||||
|
||||
delete "/api/v1/ticket_articles/#{result['id']}", {}.to_json, @headers.merge('Authorization' => credentials)
|
||||
params = {
|
||||
condition: {
|
||||
'ticket.title' => {
|
||||
operator: 'contains',
|
||||
value: title,
|
||||
},
|
||||
},
|
||||
}
|
||||
post '/api/v1/tickets/search', params.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(200)
|
||||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['tickets'][0])
|
||||
assert_equal(1, result['tickets_count'])
|
||||
|
||||
delete "/api/v1/ticket_articles/#{article_result['id']}", {}.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(200)
|
||||
|
||||
params = {
|
||||
|
@ -517,8 +541,9 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
test '03.04 ticket with correct ticket id' do
|
||||
title = "ticket with corret ticket id testme#{rand(999_999_999)}"
|
||||
ticket = Ticket.create!(
|
||||
title: 'ticket with corret ticket id',
|
||||
title: title,
|
||||
group: Group.lookup(name: 'Users'),
|
||||
customer_id: @customer_without_org.id,
|
||||
state: Ticket::State.lookup(name: 'new'),
|
||||
|
@ -532,13 +557,13 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['id'])
|
||||
assert_equal('ticket with corret ticket id', result['title'])
|
||||
assert_equal(title, result['title'])
|
||||
assert_equal(ticket.customer_id, result['customer_id'])
|
||||
assert_equal(1, result['updated_by_id'])
|
||||
assert_equal(1, result['created_by_id'])
|
||||
|
||||
params = {
|
||||
title: 'ticket with corret ticket id - 2',
|
||||
title: "#{title} - 2",
|
||||
customer_id: @agent.id,
|
||||
}
|
||||
put "/api/v1/tickets/#{ticket.id}", params.to_json, @headers.merge('Authorization' => credentials)
|
||||
|
@ -546,7 +571,7 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['id'])
|
||||
assert_equal('ticket with corret ticket id - 2', result['title'])
|
||||
assert_equal("#{title} - 2", result['title'])
|
||||
assert_equal(ticket.customer_id, result['customer_id'])
|
||||
assert_equal(@customer_without_org.id, result['updated_by_id'])
|
||||
assert_equal(1, result['created_by_id'])
|
||||
|
@ -558,18 +583,41 @@ class TicketsControllerTest < ActionDispatch::IntegrationTest
|
|||
}
|
||||
post '/api/v1/ticket_articles', params.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(201)
|
||||
article_result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, article_result.class)
|
||||
assert_equal(ticket.id, article_result['ticket_id'])
|
||||
assert_equal('Tickets Customer1', article_result['from'])
|
||||
assert_equal('some subject', article_result['subject'])
|
||||
assert_equal('some body', article_result['body'])
|
||||
assert_equal('text/plain', article_result['content_type'])
|
||||
assert_equal(@customer_without_org.id, article_result['created_by_id'])
|
||||
assert_equal(Ticket::Article::Sender.lookup(name: 'Customer').id, article_result['sender_id'])
|
||||
assert_equal(Ticket::Article::Type.lookup(name: 'note').id, article_result['type_id'])
|
||||
|
||||
Scheduler.worker(true)
|
||||
get "/api/v1/tickets/search?query=\"#{CGI.escape(title)}\"", {}, @headers.merge('Authorization' => credentials)
|
||||
assert_response(200)
|
||||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['ticket_id'])
|
||||
assert_equal('Tickets Customer1', result['from'])
|
||||
assert_equal('some subject', result['subject'])
|
||||
assert_equal('some body', result['body'])
|
||||
assert_equal('text/plain', result['content_type'])
|
||||
assert_equal(@customer_without_org.id, result['created_by_id'])
|
||||
assert_equal(Ticket::Article::Sender.lookup(name: 'Customer').id, result['sender_id'])
|
||||
assert_equal(Ticket::Article::Type.lookup(name: 'note').id, result['type_id'])
|
||||
assert_equal(ticket.id, result['tickets'][0])
|
||||
assert_equal(1, result['tickets_count'])
|
||||
|
||||
delete "/api/v1/ticket_articles/#{result['id']}", {}.to_json, @headers.merge('Authorization' => credentials)
|
||||
params = {
|
||||
condition: {
|
||||
'ticket.title' => {
|
||||
operator: 'contains',
|
||||
value: title,
|
||||
},
|
||||
},
|
||||
}
|
||||
post '/api/v1/tickets/search', params.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(200)
|
||||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
assert_equal(ticket.id, result['tickets'][0])
|
||||
assert_equal(1, result['tickets_count'])
|
||||
|
||||
delete "/api/v1/ticket_articles/#{article_result['id']}", {}.to_json, @headers.merge('Authorization' => credentials)
|
||||
assert_response(401)
|
||||
result = JSON.parse(@response.body)
|
||||
assert_equal(Hash, result.class)
|
||||
|
|
Loading…
Reference in a new issue