fix(exports): purge stuck (pending) exports, not generated or failed

Avec l'autre PR, ça reproduit le comportement d'avant, c'est à dire
que quoiqu'il arrive un export est purgé :
- soit 16h après sa génération (on a 16h pour le télécharger)
- soit 12h après sa création, et qu'il est bloqué

Auparavant, tous les exports étaient purgés au bout de 3h quelle que soit
le statut.
This commit is contained in:
Colin Darie 2022-07-27 10:23:21 +02:00
parent bd788ec6bf
commit f1957e51f8
4 changed files with 17 additions and 0 deletions

View file

@ -3,5 +3,6 @@ class Cron::PurgeStaleExportsJob < Cron::CronJob
def perform
Export.stale(Export::MAX_DUREE_CONSERVATION_EXPORT).destroy_all
Export.stuck(Export::MAX_DUREE_GENERATION).destroy_all
end
end

View file

@ -35,6 +35,11 @@ module TransientModelsWithPurgeableJobConcern
.where('updated_at < ?', (Time.zone.now - duration))
}
scope :stuck, lambda { |duration|
where(job_status: [job_statuses.fetch(:pending)])
.where('updated_at < ?', (Time.zone.now - duration))
}
def available?
generated?
end

View file

@ -17,6 +17,7 @@ class Export < ApplicationRecord
include TransientModelsWithPurgeableJobConcern
MAX_DUREE_CONSERVATION_EXPORT = 16.hours
MAX_DUREE_GENERATION = 12.hours
enum format: {
csv: 'csv',

View file

@ -31,6 +31,16 @@ RSpec.describe Export, type: :model do
it { expect(Export.stale(Export::MAX_DUREE_CONSERVATION_EXPORT)).to match_array([stale_export_generated, stale_export_failed]) }
end
describe '.stuck' do
let!(:export) { create(:export) }
let(:stuck_date) { Time.zone.now() - (Export::MAX_DUREE_GENERATION + 1.minute) }
let!(:stale_export_generated) { create(:export, :generated, updated_at: stuck_date) }
let!(:stale_export_failed) { create(:export, :failed, updated_at: stuck_date) }
let!(:stale_export_pending) { create(:export, :pending, updated_at: stuck_date) }
it { expect(Export.stuck(Export::MAX_DUREE_GENERATION)).to match_array([stale_export_pending]) }
end
describe '.destroy' do
let!(:groupe_instructeur) { create(:groupe_instructeur) }
let!(:export) { create(:export, groupe_instructeurs: [groupe_instructeur]) }