fix(dossier): sync search_terms after merge
Use a job instead of a lot of reloads
This commit is contained in:
parent
11dd1b7d76
commit
f6ebfe0e47
8 changed files with 93 additions and 44 deletions
8
app/jobs/dossier_update_search_terms_job.rb
Normal file
8
app/jobs/dossier_update_search_terms_job.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
class DossierUpdateSearchTermsJob < ApplicationJob
|
||||
discard_on ActiveRecord::RecordNotFound
|
||||
|
||||
def perform(dossier)
|
||||
dossier.update_search_terms
|
||||
dossier.save!(touch: false)
|
||||
end
|
||||
end
|
|
@ -68,6 +68,7 @@ module DossierCloneConcern
|
|||
assign_to_groupe_instructeur(editing_fork.groupe_instructeur)
|
||||
end
|
||||
reload
|
||||
update_search_terms_later
|
||||
editing_fork.destroy_editing_fork!
|
||||
end
|
||||
|
||||
|
|
23
app/models/concerns/dossier_searchable_concern.rb
Normal file
23
app/models/concerns/dossier_searchable_concern.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
module DossierSearchableConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
before_save :update_search_terms
|
||||
|
||||
def update_search_terms
|
||||
self.search_terms = [
|
||||
user&.email,
|
||||
*champs_public.flat_map(&:search_terms),
|
||||
*etablissement&.search_terms,
|
||||
individual&.nom,
|
||||
individual&.prenom
|
||||
].compact_blank.join(' ')
|
||||
|
||||
self.private_search_terms = champs_private.flat_map(&:search_terms).compact_blank.join(' ')
|
||||
end
|
||||
|
||||
def update_search_terms_later
|
||||
DossierUpdateSearchTermsJob.perform_later(self)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -50,6 +50,7 @@ class Dossier < ApplicationRecord
|
|||
include DossierFilteringConcern
|
||||
include DossierPrefillableConcern
|
||||
include DossierRebaseConcern
|
||||
include DossierSearchableConcern
|
||||
include DossierSectionsConcern
|
||||
include DossierCloneConcern
|
||||
|
||||
|
@ -455,7 +456,6 @@ class Dossier < ApplicationRecord
|
|||
delegate :france_connect_information, to: :user, allow_nil: true
|
||||
|
||||
before_save :build_default_champs_for_new_dossier, if: Proc.new { revision_id_was.nil? && parent_dossier_id.nil? && editing_fork_origin_id.nil? }
|
||||
before_save :update_search_terms
|
||||
|
||||
after_save :send_web_hook
|
||||
|
||||
|
@ -504,17 +504,6 @@ class Dossier < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
def update_search_terms
|
||||
self.search_terms = [
|
||||
user&.email,
|
||||
*champs_public.flat_map(&:search_terms),
|
||||
*etablissement&.search_terms,
|
||||
individual&.nom,
|
||||
individual&.prenom
|
||||
].compact.join(' ')
|
||||
self.private_search_terms = champs_private.flat_map(&:search_terms).compact.join(' ')
|
||||
end
|
||||
|
||||
def build_default_champs_for_new_dossier
|
||||
revision.build_champs_public.each do |champ|
|
||||
champs_public << champ
|
||||
|
|
15
spec/jobs/dossier_update_search_terms_job_spec.rb
Normal file
15
spec/jobs/dossier_update_search_terms_job_spec.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
RSpec.describe DossierUpdateSearchTermsJob, type: :job do
|
||||
let(:dossier) { create(:dossier) }
|
||||
let(:champ_public) { dossier.champs_public.first }
|
||||
let(:champ_private) { dossier.champs_private.first }
|
||||
|
||||
subject(:perform_job) { described_class.perform_now(dossier) }
|
||||
|
||||
context 'with an update' do
|
||||
before do
|
||||
create(:champ_text, dossier: dossier, value: "un nouveau champ")
|
||||
end
|
||||
|
||||
it { expect { perform_job }.to change { dossier.reload.search_terms }.to(/un nouveau champ/) }
|
||||
end
|
||||
end
|
|
@ -82,6 +82,10 @@ RSpec.describe DossierCloneConcern do
|
|||
it { expect { subject }.not_to change { dossier.reload.champs.order(:created_at).reject { _1.stable_id.in?([99, 994]) }.map(&:value) } }
|
||||
it { expect { subject }.to change { dossier.reload.champs.find { _1.stable_id == 99 }.value }.from('old value').to('new value') }
|
||||
it { expect { subject }.to change { dossier.reload.champs.find { _1.stable_id == 994 }.value }.from('old value').to('new value in repetition') }
|
||||
|
||||
it 'update dossier search terms' do
|
||||
expect { subject }.to have_enqueued_job(DossierUpdateSearchTermsJob).with(dossier)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with new revision' do
|
||||
|
|
41
spec/models/concern/dossier_searchable_concern_spec.rb
Normal file
41
spec/models/concern/dossier_searchable_concern_spec.rb
Normal file
|
@ -0,0 +1,41 @@
|
|||
describe DossierSearchableConcern do
|
||||
let(:champ_public) { dossier.champs_public.first }
|
||||
let(:champ_private) { dossier.champs_private.first }
|
||||
|
||||
subject { dossier }
|
||||
|
||||
describe '#update_search_terms' do
|
||||
let(:etablissement) { dossier.etablissement }
|
||||
let(:dossier) { create(:dossier, :with_entreprise, user: user) }
|
||||
let(:etablissement) { build(:etablissement, entreprise_nom: 'Dupont', entreprise_prenom: 'Thomas', association_rna: '12345', association_titre: 'asso de test', association_objet: 'tests unitaires') }
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, etablissement: etablissement, user: user, procedure: procedure) }
|
||||
let(:france_connect_information) { build(:france_connect_information, given_name: 'Chris', family_name: 'Harrisson') }
|
||||
let(:user) { build(:user, france_connect_information: france_connect_information) }
|
||||
|
||||
before do
|
||||
champ_public.update_attribute(:value, "champ public")
|
||||
champ_private.update_attribute(:value, "champ privé")
|
||||
|
||||
dossier.update_search_terms
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to eq("#{user.email} champ public #{etablissement.entreprise_siren} #{etablissement.entreprise_numero_tva_intracommunautaire} #{etablissement.entreprise_forme_juridique} #{etablissement.entreprise_forme_juridique_code} #{etablissement.entreprise_nom_commercial} #{etablissement.entreprise_raison_sociale} #{etablissement.entreprise_siret_siege_social} #{etablissement.entreprise_nom} #{etablissement.entreprise_prenom} #{etablissement.association_rna} #{etablissement.association_titre} #{etablissement.association_objet} #{etablissement.siret} #{etablissement.naf} #{etablissement.libelle_naf} #{etablissement.adresse} #{etablissement.code_postal} #{etablissement.localite} #{etablissement.code_insee_localite}") }
|
||||
it { expect(dossier.private_search_terms).to eq('champ privé') }
|
||||
|
||||
context 'with an update' do
|
||||
before do
|
||||
dossier.update(
|
||||
champs_public_attributes: [{ id: champ_public.id, value: 'nouvelle valeur publique' }],
|
||||
champs_private_attributes: [{ id: champ_private.id, value: 'nouvelle valeur privee' }]
|
||||
)
|
||||
|
||||
perform_enqueued_jobs(only: DossierUpdateSearchTermsJob)
|
||||
dossier.reload
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to include('nouvelle valeur publique') }
|
||||
it { expect(dossier.private_search_terms).to include('nouvelle valeur privee') }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -279,38 +279,6 @@ describe Dossier do
|
|||
|
||||
subject { dossier }
|
||||
|
||||
describe '#update_search_terms' do
|
||||
let(:etablissement) { build(:etablissement, entreprise_nom: 'Dupont', entreprise_prenom: 'Thomas', association_rna: '12345', association_titre: 'asso de test', association_objet: 'tests unitaires') }
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, etablissement: etablissement, user: user, procedure: procedure) }
|
||||
let(:france_connect_information) { build(:france_connect_information, given_name: 'Chris', family_name: 'Harrisson') }
|
||||
let(:user) { build(:user, france_connect_information: france_connect_information) }
|
||||
let(:champ_public) { dossier.champs_public.first }
|
||||
let(:champ_private) { dossier.champs_private.first }
|
||||
|
||||
before do
|
||||
champ_public.update_attribute(:value, "champ public")
|
||||
champ_private.update_attribute(:value, "champ privé")
|
||||
|
||||
dossier.update_search_terms
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to eq("#{user.email} champ public #{etablissement.entreprise_siren} #{etablissement.entreprise_numero_tva_intracommunautaire} #{etablissement.entreprise_forme_juridique} #{etablissement.entreprise_forme_juridique_code} #{etablissement.entreprise_nom_commercial} #{etablissement.entreprise_raison_sociale} #{etablissement.entreprise_siret_siege_social} #{etablissement.entreprise_nom} #{etablissement.entreprise_prenom} #{etablissement.association_rna} #{etablissement.association_titre} #{etablissement.association_objet} #{etablissement.siret} #{etablissement.naf} #{etablissement.libelle_naf} #{etablissement.adresse} #{etablissement.code_postal} #{etablissement.localite} #{etablissement.code_insee_localite}") }
|
||||
it { expect(dossier.private_search_terms).to eq('champ privé') }
|
||||
|
||||
context 'with an update' do
|
||||
before do
|
||||
dossier.update(
|
||||
champs_public_attributes: [{ id: champ_public.id, value: 'nouvelle valeur publique' }],
|
||||
champs_private_attributes: [{ id: champ_private.id, value: 'nouvelle valeur privee' }]
|
||||
)
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to include('nouvelle valeur publique') }
|
||||
it { expect(dossier.private_search_terms).to include('nouvelle valeur privee') }
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, procedure: procedure, user: user) }
|
||||
|
|
Loading…
Add table
Reference in a new issue