summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md4
-rw-r--r--app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb20
-rw-r--r--solidus_subscriptions.gemspec2
-rw-r--r--spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb23
4 files changed, 48 insertions, 1 deletions
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
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/solidus_subscriptions.gemspec b/solidus_subscriptions.gemspec
index 46fec6e..e5f01a6 100644
--- a/solidus_subscriptions.gemspec
+++ b/solidus_subscriptions.gemspec
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
spec.add_dependency 'httparty', '~> 0.18'
spec.add_dependency 'i18n'
spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 3']
- spec.add_dependency 'solidus_support', '~> 0.5'
+ spec.add_dependency 'solidus_support', '~> 0.7'
spec.add_dependency 'state_machines'
spec.add_development_dependency 'rspec-activemodel-mocks'
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