Merge pull request #10716 from mfo/US/fix-bad-data
ETQ instance DS, je souhaite que l'intégrité des données entre les champs et les dossiers soient garantie par une contrainte en base de donnée
This commit is contained in:
commit
0771d207f3
4 changed files with 88 additions and 1 deletions
|
@ -0,0 +1,33 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Maintenance
|
||||
# On our production environment, the fk between `champs.dossier_id` and `dossiers.id` had not been created
|
||||
# this maintenance task cleans up orphaned champ pointing to deleted dossier
|
||||
# next step is to validate the recreated fk
|
||||
# For our own record, use it with PG_STATEMENT_TIMEOUT=300000 ....
|
||||
class DeleteOrphanedChampsWithMissingDossierTask < MaintenanceTasks::Task
|
||||
def collection
|
||||
Champ.select(:id, :type).where.missing(:dossier)
|
||||
end
|
||||
|
||||
def process(champ)
|
||||
champ.reload # in case we need more data on this champ
|
||||
|
||||
case champ.type
|
||||
when 'Champs::CarteChamp' then
|
||||
champ.geo_areas.delete_all
|
||||
when 'Champs::RepetitionChamp' then
|
||||
champ.champs.delete_all
|
||||
when 'Champs::SiretChamp' then
|
||||
etablissement = champ.etablissement
|
||||
champ.update(etablissement_id: nil)
|
||||
etablissement.delete
|
||||
end
|
||||
champ.delete
|
||||
end
|
||||
|
||||
def count
|
||||
# no count, it otherwise it will timeout
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddMissingIndexChampsToDossier < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_foreign_key :champs, :dossiers, if_not_exists: true, validate: false
|
||||
end
|
||||
end
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.0].define(version: 2024_07_29_160650) do
|
||||
ActiveRecord::Schema[7.0].define(version: 2024_08_26_130121) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_buffercache"
|
||||
enable_extension "pg_stat_statements"
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rails_helper"
|
||||
|
||||
module Maintenance
|
||||
RSpec.describe DeleteOrphanedChampsWithMissingDossierTask do
|
||||
describe "#process" do
|
||||
let(:procedure) { create(:procedure, types_de_champ_public:) }
|
||||
let(:dossier) { create(:dossier, :with_populated_champs, procedure:) }
|
||||
let(:champ) { dossier.champs.first }
|
||||
|
||||
subject(:process) { described_class.process(champ) }
|
||||
|
||||
context 'with other champs' do
|
||||
let(:types_de_champ_public) { [{ type: :text }] }
|
||||
it 'delete champ' do
|
||||
expect { subject }.to change { Champ.exists?(champ.id) }.from(true).to(false)
|
||||
end
|
||||
end
|
||||
|
||||
context "with carte" do
|
||||
let(:types_de_champ_public) { [{ type: :carte }] }
|
||||
it 'deletes champ.geo_areas' do
|
||||
geo_area_ids = champ.geo_areas.ids
|
||||
expect { subject }.to change { GeoArea.where(id: geo_area_ids).count }.from(2).to(0)
|
||||
expect(Champ.exists?(champ.id)).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context "with repetition" do
|
||||
let(:types_de_champ_public) { [{ type: :repetition, mandatory: true, children: [{ type: :text }] }] }
|
||||
it 'deletes champ.champs (children)' do
|
||||
expect { subject }.to change { champ.champs.count }.from(2).to(0)
|
||||
expect(Champ.exists?(champ.id)).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context "with siret" do
|
||||
let(:types_de_champ_public) { [{ type: :siret }] }
|
||||
it 'delete champ.etablissement' do
|
||||
expect { subject }.to change { Etablissement.exists?(champ.etablissement_id) }.from(true).to(false)
|
||||
expect(Champ.exists?(champ.id)).to be_falsey
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue