Files
openfoodnetwork/lib/tasks/data/remove_transient_data.rb
Maikel Linke c8cfbbb0b2 Use standard ApplicationRecord in task class
It's best practice to use the ApplicationRecord. But when Rake is
loaded, our application is not loaded yet and the ApplicationRecord
class wasn't available yet. Requiring within the task solves the problem
because Rake loads the Rails environment before executing this task.

I also removed the unused highline loading.
2022-09-29 11:56:10 +10:00

46 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class RemoveTransientData
RETENTION_PERIOD = 3.months.ago.to_date
# This model lets us operate on the sessions DB table using ActiveRecord's
# methods within the scope of this service. This relies on the AR's
# convention where a Session model maps to a sessions table.
class Session < ApplicationRecord
end
def call
Rails.logger.info("#{self.class.name}: processing")
Spree::StateChange.where("created_at < ?", RETENTION_PERIOD).delete_all
Spree::LogEntry.where("created_at < ?", RETENTION_PERIOD).delete_all
Session.where("updated_at < ?", RETENTION_PERIOD).delete_all
clear_old_cart_data!
end
private
def clear_old_cart_data!
old_carts = Spree::Order.
where("spree_orders.state = 'cart' AND spree_orders.updated_at < ?", RETENTION_PERIOD).
merge(orders_without_payments)
old_cart_line_items = Spree::LineItem.where(order_id: old_carts)
old_line_item_options = Spree::OptionValuesLineItem.where(line_item_id: old_cart_line_items)
old_cart_adjustments = Spree::Adjustment.where(order_id: old_carts)
old_cart_adjustments.delete_all
old_line_item_options.delete_all
old_cart_line_items.delete_all
old_carts.delete_all
end
def orders_without_payments
# Carts with failed payments are ignored, as they contain potentially useful data
Spree::Order.
joins("LEFT OUTER JOIN spree_payments ON spree_orders.id = spree_payments.order_id").
where("spree_payments.id IS NULL")
end
end