From 040e09414bf8546fbd6c23b90ccd74e8f551590f Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 24 Apr 2024 15:34:33 +1000 Subject: [PATCH 1/4] Add ofn:data:check_invalid_address_used task It checks for invalid addresses, ie address with address1, city, phone or country_id set to null. It will return: - a list of invalid address in use (associated to another model) - a list of invalid address not in use, ie that we can delete --- lib/tasks/check_invalid_address_used.rake | 106 ++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 lib/tasks/check_invalid_address_used.rake diff --git a/lib/tasks/check_invalid_address_used.rake b/lib/tasks/check_invalid_address_used.rake new file mode 100644 index 0000000000..7ec96e6c65 --- /dev/null +++ b/lib/tasks/check_invalid_address_used.rake @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require 'csv' + +namespace :ofn do + namespace :data do + # Invalid address are define by having: address1, city, phone, or country_id set to null + desc 'Check if any invalid address are in use' + task check_invalid_address_used: :environment do # rubocop:disable Metrics/BlockLength + puts "Checking for invalid address" + invalid_addresses = Spree::Address + .where("address1 IS NULL OR city IS NULL OR phone IS NULL OR country_id IS NULL") + .pluck(:id) + + if invalid_addresses.empty? + puts "No invalid address found" + next + end + + puts "Checking if any of #{invalid_addresses.length} invalid addresses are in use" + + # Customer : + # - bill_address + # - ship_address + customer_used_address = check_bill_ship_address(Customer, invalid_addresses) + p "Customers #{customer_used_address}" + + # Subscription : + # - bill_address + # - ship_address + subscriptions_used_address = check_bill_ship_address(Subscription, invalid_addresses) + p "Subscriptions #{subscriptions_used_address}" + + # EnterpriseGroup : + # - enterprise_group address + enterprise_group_used_address = check_address(EnterpriseGroup, invalid_addresses) + p "EnterpriseGroup #{enterprise_group_used_address}" + + # User : + # - bill_address + # - ship_address + users_used_address = check_bill_ship_address(Spree::User, invalid_addresses) + p "User #{users_used_address}" + + # Order : + # - bill_address + # - ship_address + orders_used_address = check_bill_ship_address(Spree::Order, invalid_addresses) + p "Order #{orders_used_address}" + + # Shipment : + # - address + shipments_used_address = check_address(Spree::Shipment, invalid_addresses) + p "Shipments #{shipments_used_address}" + + # Enterprise : + # - address + # - business_address + enterprises = Enterprise + .left_joins(:address, :business_address) + .where( + "address_id IN(?) OR business_address_id IN(?)", invalid_addresses, invalid_addresses + ) + enterprise_used_address = enterprises.map do |e| + next e.address_id if check_correct_address_id(e.address_id, invalid_addresses) + + e.business_address_id if check_correct_address_id(e.business_address_id, invalid_addresses) + end + p "Enterprises #{enterprise_used_address}" + + address_to_be_fixed = customer_used_address.union( + subscriptions_used_address, users_used_address, orders_used_address, shipments_used_address, + enterprise_used_address + ) + address_to_be_deleted = invalid_addresses - address_to_be_fixed + + p "#{address_to_be_deleted.length} addresses can be deleted:" + p address_to_be_deleted + + p "#{address_to_be_fixed.length} addresses need to be fixed:" + p address_to_be_fixed + end + + private + + def check_bill_ship_address(klass, addresses) + objects = klass + .left_joins(:bill_address, :ship_address) + .where("bill_address_id in(?) OR ship_address_id in(?)", addresses, addresses) + + objects.map do |o| + next o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses) + + o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses) + end + end + + def check_address(klass, addresses) + klass.joins(:address).where(address: addresses).pluck(:address_id) + end + + def check_correct_address_id(id, missing_ids) + !id.nil? && missing_ids.include?(id) + end + end +end From 9583bef0d8ea3102babc485336b51c646ad200ca Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 24 Apr 2024 16:42:13 +1000 Subject: [PATCH 2/4] Per review, handle case where a model can be linked to invalid addresses --- lib/tasks/check_invalid_address_used.rake | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/tasks/check_invalid_address_used.rake b/lib/tasks/check_invalid_address_used.rake index 7ec96e6c65..912bb423ef 100644 --- a/lib/tasks/check_invalid_address_used.rake +++ b/lib/tasks/check_invalid_address_used.rake @@ -62,10 +62,13 @@ namespace :ofn do "address_id IN(?) OR business_address_id IN(?)", invalid_addresses, invalid_addresses ) enterprise_used_address = enterprises.map do |e| - next e.address_id if check_correct_address_id(e.address_id, invalid_addresses) - - e.business_address_id if check_correct_address_id(e.business_address_id, invalid_addresses) - end + res = [] + res << e.address_id if check_correct_address_id(e.address_id, invalid_addresses) + res << e.business_address_id if check_correct_address_id( + e.business_address_id, invalid_addresses + ) + res + end.flatten p "Enterprises #{enterprise_used_address}" address_to_be_fixed = customer_used_address.union( @@ -89,10 +92,11 @@ namespace :ofn do .where("bill_address_id in(?) OR ship_address_id in(?)", addresses, addresses) objects.map do |o| - next o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses) - - o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses) - end + res = [] + res << o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses) + res << o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses) + res + end.flatten end def check_address(klass, addresses) From 77a8e4d29a098031921a5dbd9887790ef8ae8a02 Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 24 Apr 2024 16:49:47 +1000 Subject: [PATCH 3/4] Print code to run to delete address if needed --- lib/tasks/check_invalid_address_used.rake | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/tasks/check_invalid_address_used.rake b/lib/tasks/check_invalid_address_used.rake index 912bb423ef..2d831d265b 100644 --- a/lib/tasks/check_invalid_address_used.rake +++ b/lib/tasks/check_invalid_address_used.rake @@ -77,10 +77,18 @@ namespace :ofn do ) address_to_be_deleted = invalid_addresses - address_to_be_fixed - p "#{address_to_be_deleted.length} addresses can be deleted:" + puts "\n\n" + puts "#{address_to_be_deleted.length} addresses can be deleted:" p address_to_be_deleted - p "#{address_to_be_fixed.length} addresses need to be fixed:" + if address_to_be_deleted.present? + puts "\n\n" + puts "Run the following code to delete the addresses:" + puts "Spree::Address.where(id: #{address_to_be_deleted}).delete_all" + end + + puts "\n\n" + puts "#{address_to_be_fixed.length} addresses need to be fixed:" p address_to_be_fixed end From a977bd633bb7c5b9b8c5c87b0d34ef6011f5d04d Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Mon, 29 Apr 2024 09:58:13 +1000 Subject: [PATCH 4/4] Move rake file to the correct folder --- lib/tasks/{ => data}/check_invalid_address_used.rake | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/tasks/{ => data}/check_invalid_address_used.rake (100%) diff --git a/lib/tasks/check_invalid_address_used.rake b/lib/tasks/data/check_invalid_address_used.rake similarity index 100% rename from lib/tasks/check_invalid_address_used.rake rename to lib/tasks/data/check_invalid_address_used.rake