From a38f22fbee56f0e287c090deb0625281086f3f6b Mon Sep 17 00:00:00 2001 From: David Cook Date: Thu, 2 May 2024 12:05:40 +1000 Subject: [PATCH] Save deleted_by user when deleting products --- app/controllers/api/v0/products_controller.rb | 2 +- app/models/spree/product.rb | 6 ++++++ app/reflexes/products_reflex.rb | 2 +- spec/controllers/api/v0/products_controller_spec.rb | 1 + spec/models/spree/product_spec.rb | 10 ++++++++++ spec/reflexes/products_reflex_spec.rb | 1 + 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v0/products_controller.rb b/app/controllers/api/v0/products_controller.rb index eead37ca49..5d81346591 100644 --- a/app/controllers/api/v0/products_controller.rb +++ b/app/controllers/api/v0/products_controller.rb @@ -42,7 +42,7 @@ module Api authorize! :delete, Spree::Product @product = product_finder.find_product authorize! :delete, @product - @product.destroy + @product.destroy(deleted_by: current_api_user) render json: @product, serializer: Api::Admin::ProductSerializer, status: :no_content end diff --git a/app/models/spree/product.rb b/app/models/spree/product.rb index 4fd670f90e..b5bfdd3608 100755 --- a/app/models/spree/product.rb +++ b/app/models/spree/product.rb @@ -33,6 +33,7 @@ module Spree searchable_scopes :active, :with_properties belongs_to :supplier, class_name: 'Enterprise', optional: false, touch: true + belongs_to :deleted_by, class_name: "Spree::User", optional: true has_one :image, class_name: "Spree::Image", as: :viewable, dependent: :destroy @@ -260,6 +261,11 @@ module Spree variants.map(&:import_date).compact.max end + def destroy(deleted_by: nil) + update_attribute(:deleted_by, deleted_by) if deleted_by.present? + super() + end + def destruction transaction do touch_distributors diff --git a/app/reflexes/products_reflex.rb b/app/reflexes/products_reflex.rb index 9cad290331..3f7f396960 100644 --- a/app/reflexes/products_reflex.rb +++ b/app/reflexes/products_reflex.rb @@ -26,7 +26,7 @@ class ProductsReflex < ApplicationReflex product = product_finder(id).find_product authorize! :delete, product - if product.destroy + if product.destroy(deleted_by: current_user) flash[:success] = I18n.t('admin.products_v3.delete_product.success') else flash[:error] = I18n.t('admin.products_v3.delete_product.error') diff --git a/spec/controllers/api/v0/products_controller_spec.rb b/spec/controllers/api/v0/products_controller_spec.rb index 4abba9f3bd..5ec3363c16 100644 --- a/spec/controllers/api/v0/products_controller_spec.rb +++ b/spec/controllers/api/v0/products_controller_spec.rb @@ -81,6 +81,7 @@ describe Api::V0::ProductsController, type: :controller do expect(response.status).to eq(204) expect { product.reload }.not_to raise_error expect(product.deleted_at).not_to be_nil + expect(product.deleted_by).to eq current_api_user end it "is denied access to deleting another enterprises' product" do diff --git a/spec/models/spree/product_spec.rb b/spec/models/spree/product_spec.rb index 7efd2da024..34bdbaee46 100644 --- a/spec/models/spree/product_spec.rb +++ b/spec/models/spree/product_spec.rb @@ -28,6 +28,12 @@ module Spree expect(product.deleted_at).not_to be_nil expect(product.variants.all? { |v| !v.deleted_at.nil? }).to be_truthy end + + it "should set deleted_by user if provided" do + user = create(:user) + product.destroy(deleted_by: user) + expect(product.reload.deleted_by).to eq user + end end end @@ -340,6 +346,10 @@ module Spree it "removes variants from order cycles" do expect { product.destroy }.to change { ExchangeVariant.count } end + + #todo: it "aborts if exchange variants failed to delete" + # expect(product.deleted_at).to be_nil + # expect(product.deleted_by).to be_nil end it "updates units when saved change to variant unit" do diff --git a/spec/reflexes/products_reflex_spec.rb b/spec/reflexes/products_reflex_spec.rb index 97bf617161..5e4bab3b1b 100644 --- a/spec/reflexes/products_reflex_spec.rb +++ b/spec/reflexes/products_reflex_spec.rb @@ -29,6 +29,7 @@ describe ProductsReflex, type: :reflex, feature: :admin_style_v3 do subject.run(action_name) product.reload expect(product.deleted_at).not_to be_nil + expect(product.deleted_by).to eq current_user expect(flash[:success]).to eq('Successfully deleted the product') end