From d97bba60a4b9e56e549de0fecf7c83b2b6f0a093 Mon Sep 17 00:00:00 2001 From: luca-landa Date: Fri, 12 Feb 2021 15:06:47 +0100 Subject: Remove variant from subscriptions on soft deletion --- .../variant/auto_delete_from_subscriptions.rb | 20 +++++++++++++++++++ .../variant/auto_delete_from_subscriptions_spec.rb | 23 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb create mode 100644 spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb diff --git a/app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb b/app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb new file mode 100644 index 0000000..bba173e --- /dev/null +++ b/app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module SolidusSubscriptions + module Spree + module Variant + module AutoDeleteFromSubscriptions + def self.prepended(base) + base.after_discard(:remove_from_subscriptions) + base.after_destroy(:remove_from_subscriptions) + end + + def remove_from_subscriptions + SolidusSubscriptions::LineItem.where(subscribable: self).delete_all + end + end + end + end +end + +Spree::Variant.prepend(SolidusSubscriptions::Spree::Variant::AutoDeleteFromSubscriptions) diff --git a/spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb b/spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb new file mode 100644 index 0000000..422e992 --- /dev/null +++ b/spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +RSpec.describe SolidusSubscriptions::Spree::Variant::AutoDeleteFromSubscriptions, type: :model do + subject { create(:variant, subscribable: true) } + + describe '.discard' do + it 'deletes itself from subscriptions' do + subscription = create(:subscription) + create(:subscription_line_item, subscription: subscription, subscribable: subject) + + expect { subject.discard }.to change { SolidusSubscriptions::LineItem.count }.by(-1) + end + end + + describe '.destroy' do + it 'deletes itself from subscriptions' do + subscription = create(:subscription) + create(:subscription_line_item, subscription: subscription, subscribable: subject) + + expect { subject.destroy }.to change { SolidusSubscriptions::LineItem.count }.by(-1) + end + end +end -- cgit v1.2.3 From bc147b0232f766e3af9d62212f3525c49d2808c8 Mon Sep 17 00:00:00 2001 From: luca-landa Date: Fri, 5 Mar 2021 18:56:01 +0100 Subject: Add docs for variant soft deletion support --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6c3ed60..bc7c8bf 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,10 @@ SolidusSubscriptions.configure do |config| end ``` +### Subscription product deletion +When a product is soft deleted, its subscription line items need to be deleted as well, in order to avoid error on subscription processing. +If the product class is `Spree::Variant`, this corner case is handled automatically on the variant soft deletion, otherwise it should be handled manually. + ## Development ### Testing the extension -- cgit v1.2.3