summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Desantis <desa.alessandro@gmail.com>2021-03-12 15:25:10 +0100
committerGitHub <noreply@github.com>2021-03-12 15:25:10 +0100
commit5c9ec3fd21305e8e3004f26d40cedd327b0995a7 (patch)
tree194c20731c601dee77603c1a6b28746fa3f89547
parent349d5e456396f11e1cfe4bdb068542e9c45fe302 (diff)
parentbc147b0232f766e3af9d62212f3525c49d2808c8 (diff)
Merge pull request #211 from solidusio-contrib/luca-landa/handle-subscriptions-with-deleted-products
Remove variant from subscriptions on soft deletion
-rw-r--r--README.md4
-rw-r--r--app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb20
-rw-r--r--spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb23
3 files changed, 47 insertions, 0 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/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