Merge pull request #7063 from betagouv/US/drop_old_method_for_archive

feat(archive): drop old feature, enable new way for creating archive (parallel download and use safer zip method [binary])
This commit is contained in:
mfo 2022-03-18 14:43:55 +01:00 committed by GitHub
commit 6a67f9c859
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 1 additions and 140 deletions

View file

@ -16,14 +16,6 @@ class ProcedureArchiveService
end end
def collect_files_archive(archive, instructeur) def collect_files_archive(archive, instructeur)
if Flipper.enabled?(:zip_using_binary, @procedure)
new_collect_files_archive(archive, instructeur)
else
old_collect_files_archive(archive, instructeur)
end
end
def new_collect_files_archive(archive, instructeur)
dossiers = Dossier.visible_by_administration dossiers = Dossier.visible_by_administration
.where(groupe_instructeur: archive.groupe_instructeurs) .where(groupe_instructeur: archive.groupe_instructeurs)
@ -42,47 +34,6 @@ class ProcedureArchiveService
InstructeurMailer.send_archive(instructeur, @procedure, archive).deliver_later InstructeurMailer.send_archive(instructeur, @procedure, archive).deliver_later
end end
def old_collect_files_archive(archive, instructeur)
dossiers = Dossier.visible_by_administration
.where(groupe_instructeur: archive.groupe_instructeurs)
dossiers = if archive.time_span_type == 'everything'
dossiers.state_termine
else
dossiers.processed_in_month(archive.month)
end
files = create_list_of_attachments(dossiers)
tmp_file = Tempfile.new(['tc', '.zip'])
Zip::OutputStream.open(tmp_file) do |zipfile|
bug_reports = ''
files.each do |attachment, pj_filename|
zipfile.put_next_entry("#{zip_root_folder}/#{pj_filename}")
begin
zipfile.puts(attachment.download)
rescue
bug_reports += "Impossible de récupérer le fichier #{pj_filename}\n"
end
end
if !bug_reports.empty?
zipfile.put_next_entry("#{zip_root_folder}/LISEZMOI.txt")
zipfile.puts(bug_reports)
end
end
archive.file.attach(
io: File.open(tmp_file),
filename: archive.filename(@procedure),
# we don't want to run virus scanner on this file
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }
)
tmp_file.delete
archive.make_available!
InstructeurMailer.send_archive(instructeur, @procedure, archive).deliver_later
end
def self.procedure_files_size(procedure) def self.procedure_files_size(procedure)
dossiers_files_size(procedure.dossiers) dossiers_files_size(procedure.dossiers)
end end

View file

@ -33,97 +33,7 @@ describe ProcedureArchiveService do
end end
end end
describe '#old_collect_files_archive' do describe '#collect_files_archive' do
before do
create_dossier_for_month(year, month)
create_dossier_for_month(2020, month)
end
after { Timecop.return }
context 'for a specific month' do
let(:archive) { create(:archive, time_span_type: 'monthly', status: 'pending', month: date_month, groupe_instructeurs: groupe_instructeurs) }
let(:year) { 2021 }
let(:mailer) { double('mailer', deliver_later: true) }
it 'collect files' do
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
service.collect_files_archive(archive, instructeur)
archive.file.open do |f|
files = ZipTricks::FileReader.read_zip_structure(io: f)
expect(files.size).to be 2
expect(files.first.filename).to include("export")
expect(files.last.filename).to include("attestation")
end
expect(archive.file.attached?).to be_truthy
end
context 'with a missing file' do
let(:pj) do
PiecesJustificativesService::FakeAttachment.new(
file: StringIO.new('coucou'),
filename: "export-dossier.pdf",
name: 'pdf_export_for_instructeur',
id: 1,
created_at: Time.zone.now
)
end
let(:bad_pj) do
PiecesJustificativesService::FakeAttachment.new(
file: nil,
filename: "cni.png",
name: 'cni.png',
id: 2,
created_at: Time.zone.now
)
end
let(:documents) { [pj, bad_pj] }
before do
allow(PiecesJustificativesService).to receive(:liste_documents).and_return(documents)
end
it 'collect files without raising exception' do
expect { service.collect_files_archive(archive, instructeur) }.not_to raise_exception
end
it 'add bug report to archive' do
service.collect_files_archive(archive, instructeur)
archive.file.open do |f|
files = ZipTricks::FileReader.read_zip_structure(io: f)
expect(files.size).to be 4
expect(files.last.filename).to eq("procedure-#{procedure.id}/LISEZMOI.txt")
expect(extract(f, files.last)).to match(/Impossible de .*cni.*png/)
end
end
end
end
context 'for all months' do
let(:archive) { create(:archive, time_span_type: 'everything', status: 'pending', groupe_instructeurs: groupe_instructeurs) }
let(:mailer) { double('mailer', deliver_later: true) }
it 'collect files' do
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
service.collect_files_archive(archive, instructeur)
archive = Archive.last
archive.file.open do |f|
files = ZipTricks::FileReader.read_zip_structure(io: f)
expect(files.size).to be 4
end
expect(archive.file.attached?).to be_truthy
end
end
end
describe '#new_collect_files_archive' do
before { Flipper.enable_actor(:zip_using_binary, procedure) }
let!(:dossier) { create_dossier_for_month(year, month) } let!(:dossier) { create_dossier_for_month(year, month) }
let!(:dossier_2020) { create_dossier_for_month(2020, month) } let!(:dossier_2020) { create_dossier_for_month(2020, month) }