core/app/services/spree/addresses/update.rb

Summary

Maintainability
A
45 mins
Test Coverage
C
73%
module Spree
  module Addresses
    class Update
      prepend Spree::ServiceModule::Base
      include Spree::Addresses::Helper

      attr_accessor :country

      def call(address:, address_params:)
        address_params[:country_id] ||= address.country_id
        address_params = fill_country_and_state_ids(address_params)
        address_params[:user_id] = address.user_id if address.user_id.present?

        if address&.editable?
          address.update(address_params) ? success(address) : failure(address)
        else
          if new_address(address_params).valid?
            address.destroy
            success(new_address)
          else
            failure(new_address)
          end
        end
      end

      private

      def new_address(address_params = {})
        @new_address ||= ::Spree::Address.find_or_create_by(address_params.except(:id, :updated_at, :created_at))
      end
    end
  end
end