Browse Source

Fixes #4596 - Articles are not indexed properly.

Rolf Schmidt 1 year ago
parent
commit
fc47594188
2 changed files with 47 additions and 5 deletions
  1. 3 5
      app/models/ticket/article.rb
  2. 44 0
      spec/requests/ticket_spec.rb

+ 3 - 5
app/models/ticket/article.rb

@@ -36,10 +36,10 @@ class Ticket::Article < ApplicationModel
   belongs_to :origin_by,  class_name: 'User', optional: true
 
   before_validation :check_mentions, on: :create
-  before_save :touch_ticket_if_needed
   before_create :check_subject, :check_body, :check_message_id_md5
   before_update :check_subject, :check_body, :check_message_id_md5
   after_destroy :store_delete, :update_time_units
+  after_commit :ticket_touch, if: :persisted?
 
   store :preferences
 
@@ -397,9 +397,7 @@ returns
     Ticket::TimeAccounting.update_ticket(ticket)
   end
 
-  def touch_ticket_if_needed
-    return if !internal_changed?
-
-    ticket&.touch # rubocop:disable Rails/SkipsModelValidations
+  def ticket_touch
+    ticket.touch # rubocop:disable Rails/SkipsModelValidations
   end
 end

+ 44 - 0
spec/requests/ticket_spec.rb

@@ -2445,4 +2445,48 @@ RSpec.describe 'Ticket', type: :request do
         .and include('organization' => hash_including('open_ids' => [ticket2.id, ticket1.id]))
     end
   end
+
+  describe 'Articles are not indexed properly #4596', performs_jobs: true, searchindex: true do
+    let(:ticket) { create(:ticket, group: Group.first) }
+
+    def new_article_body
+      params = {
+        article: {
+          body:         SecureRandom.uuid,
+          content_type: 'text/plain',
+          internal:     false,
+        },
+      }
+      authenticated_as(agent)
+      put "/api/v1/tickets/#{ticket.id}", params: params, as: :json
+      expect(response).to have_http_status(:ok)
+
+      perform_enqueued_jobs
+      SearchIndexBackend.refresh
+
+      params[:article][:body]
+    end
+
+    def delete_article_body
+      article = ticket.articles.last
+      delete "/api/v1/ticket_articles/#{article.id}"
+      expect(response).to have_http_status(:ok)
+
+      perform_enqueued_jobs
+      SearchIndexBackend.refresh
+
+      article.body
+    end
+
+    before do
+      ticket
+      searchindex_model_reload([Ticket])
+    end
+
+    it 'does find articles after creations', :aggregate_failures do
+      expect(SearchIndexBackend.search(new_article_body, 'Ticket', limit: 1)).to be_present
+      expect(SearchIndexBackend.search(new_article_body, 'Ticket', limit: 1)).to be_present
+      expect(SearchIndexBackend.search(delete_article_body, 'Ticket', limit: 1)).to be_blank
+    end
+  end
 end