From 5d5e75ce9ca62a153f75df788a6a4b7982ff703c Mon Sep 17 00:00:00 2001
From: Sojan Jose
Date: Sun, 31 Jan 2021 13:05:07 +0530
Subject: [PATCH] Chore: Fix Deserialisation Error in Jobs (#1683)
- Ignore Jobs on de-serialization error
- Show empty conversations in chat UI
Fixes: #1480
---
.../widgets/conversation/ConversationCard.vue | 6 ++++++
.../dashboard/i18n/locale/en/chatlist.json | 3 ++-
app/jobs/application_job.rb | 4 ++++
.../partials/_conversation.json.jbuilder | 4 +++-
.../accounts/conversations_controller_spec.rb | 20 ++++++++++++++++---
5 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue
index 84ddd6b15..0b39013bf 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue
@@ -35,6 +35,12 @@
{{ this.$t(`${attachmentIconKey}.CONTENT`) }}
+
+
+
+ {{ this.$t(`CHAT_LIST.NO_MESSAGES`) }}
+
+
{{ dynamicTime(chat.timestamp) }}
diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json
index a0b31427f..228554789 100644
--- a/app/javascript/dashboard/i18n/locale/en/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json
@@ -79,6 +79,7 @@
},
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
- "REPLY_TO_TWEET": "Reply to this tweet"
+ "REPLY_TO_TWEET": "Reply to this tweet",
+ "NO_MESSAGES": "No Messages"
}
}
diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb
index a009ace51..c577b1908 100644
--- a/app/jobs/application_job.rb
+++ b/app/jobs/application_job.rb
@@ -1,2 +1,6 @@
class ApplicationJob < ActiveJob::Base
+ # https://api.rubyonrails.org/v5.2.1/classes/ActiveJob/Exceptions/ClassMethods.html
+ discard_on ActiveJob::DeserializationError do |_job, error|
+ Rails.logger.error("Skipping job because of ActiveJob::DeserializationError (#{error.message})")
+ end
end
diff --git a/app/views/api/v1/conversations/partials/_conversation.json.jbuilder b/app/views/api/v1/conversations/partials/_conversation.json.jbuilder
index 517f31054..50afe3b44 100644
--- a/app/views/api/v1/conversations/partials/_conversation.json.jbuilder
+++ b/app/views/api/v1/conversations/partials/_conversation.json.jbuilder
@@ -11,7 +11,9 @@ json.meta do
end
json.id conversation.display_id
-if conversation.unread_incoming_messages.count.zero?
+if conversation.messages.count.zero?
+ json.messages []
+elsif conversation.unread_incoming_messages.count.zero?
json.messages [conversation.messages.includes([{ attachments: [{ file_attachment: [:blob] }] }]).last.try(:push_event_data)]
else
json.messages conversation.unread_messages.includes([:user, { attachments: [{ file_attachment: [:blob] }] }]).last(10).map(&:push_event_data)
diff --git a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
index 5c88f2402..e2e025e82 100644
--- a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
@@ -14,19 +14,33 @@ RSpec.describe 'Conversations API', type: :request do
context 'when it is an authenticated user' do
let(:agent) { create(:user, account: account, role: :agent) }
+ let(:conversation) { create(:conversation, account: account) }
before do
- conversation = create(:conversation, account: account)
create(:inbox_member, user: agent, inbox: conversation.inbox)
end
- it 'returns all conversations' do
+ it 'returns all conversations with messages' do
+ message = create(:message, conversation: conversation, account: account)
get "/api/v1/accounts/#{account.id}/conversations",
headers: agent.create_new_auth_token,
as: :json
expect(response).to have_http_status(:success)
- expect(JSON.parse(response.body, symbolize_names: true)[:data][:meta][:all_count]).to eq(1)
+ body = JSON.parse(response.body, symbolize_names: true)
+ expect(body[:data][:meta][:all_count]).to eq(1)
+ expect(body[:data][:payload].first[:messages].first[:id]).to eq(message.id)
+ end
+
+ it 'returns conversations with empty messages array for conversations with out messages ' do
+ get "/api/v1/accounts/#{account.id}/conversations",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ body = JSON.parse(response.body, symbolize_names: true)
+ expect(body[:data][:meta][:all_count]).to eq(1)
+ expect(body[:data][:payload].first[:messages]).to eq([])
end
end
end