diff --git a/app/services/spree/olitt/clone_store/clone_request_presenter.rb b/app/services/spree/olitt/clone_store/clone_request_presenter.rb index 3819d9a..14c0a27 100644 --- a/app/services/spree/olitt/clone_store/clone_request_presenter.rb +++ b/app/services/spree/olitt/clone_store/clone_request_presenter.rb @@ -38,7 +38,21 @@ def metadata source_store_id: @clone_request.source_store_id, queue_name: @clone_request.queue_name, queued_at: @clone_request.enqueued_at, - vendor: vendor_metadata + vendor: vendor_metadata, + public_api_key: public_api_key_metadata + } + end + + def public_api_key_metadata + api_key = public_api_key + return nil unless api_key + + { + id: api_key.id, + name: api_key.name, + key_type: api_key.key_type, + token: api_key.token, + store_id: api_key.store_id } end @@ -55,6 +69,15 @@ def vendor_metadata def admin_dashboard_path '/admin' end + + def public_api_key + store = @clone_request.store + return nil if store.blank? || !store.respond_to?(:api_keys) + + store.api_keys.active.publishable.order(created_at: :desc).first + rescue StandardError + nil + end end end end diff --git a/app/services/spree/olitt/clone_store/clone_request_provisioner.rb b/app/services/spree/olitt/clone_store/clone_request_provisioner.rb index 3ad02a7..4143bf7 100644 --- a/app/services/spree/olitt/clone_store/clone_request_provisioner.rb +++ b/app/services/spree/olitt/clone_store/clone_request_provisioner.rb @@ -27,6 +27,7 @@ def call store = @clone_request.store || build_store(source_store: source_store, vendor: vendor) store.save! unless store.persisted? + ensure_public_api_key!(store) @clone_request.update!( store: store, @@ -193,6 +194,13 @@ def activate_vendor(vendor) vendor.approve! if vendor.respond_to?(:approve!) && !%w[active approved].include?(vendor.state) end + def ensure_public_api_key!(store) + return unless store.respond_to?(:api_keys) + + store.api_keys.active.publishable.first || + store.api_keys.create!(name: 'Storefront key', key_type: 'publishable') + end + def existing_vendor(email) ::Spree::Vendor.unscoped.find_by(notification_email: email) || ::Spree::Vendor.unscoped.find_by(name: email) end diff --git a/spec/services/spree/olitt/clone_store/clone_request_presenter_spec.rb b/spec/services/spree/olitt/clone_store/clone_request_presenter_spec.rb index 9b4be4c..bdb0f96 100644 --- a/spec/services/spree/olitt/clone_store/clone_request_presenter_spec.rb +++ b/spec/services/spree/olitt/clone_store/clone_request_presenter_spec.rb @@ -3,6 +3,15 @@ describe Spree::Olitt::CloneStore::CloneRequestPresenter do describe '#as_json' do it 'returns data, clone_request_id, status, and meta with extra fields' do + public_api_key = instance_double( + Spree::ApiKey, + id: 55, + name: 'Storefront key', + key_type: 'publishable', + token: 'pk_test_123456', + store_id: 10 + ) + clone_request = instance_double( Spree::Olitt::CloneStore::CloneRequest, id: 123, @@ -19,10 +28,12 @@ vendor_email: 'vendor@example.com', vendor: instance_double(Spree::Vendor, slug: 'vendor-slug'), admin_user: instance_double(Spree.admin_user_class, id: 77), - store: nil, + store: instance_double(Spree::Store, api_keys: instance_double(ActiveRecord::Relation)), fallback_store_payload: { data: { id: '10', type: 'store', attributes: { name: 'Clone' } } } ) + allow(clone_request.store.api_keys).to receive_message_chain(:active, :publishable, :order, :first).and_return(public_api_key) + presenter = described_class.new(clone_request: clone_request, serializer: ->(_store) { raise 'unused' }) payload = presenter.as_json @@ -41,6 +52,13 @@ admin_user_id: 77, email: 'vendor@example.com', next_path: '/admin' + }, + public_api_key: { + id: 55, + name: 'Storefront key', + key_type: 'publishable', + token: 'pk_test_123456', + store_id: 10 } }) end diff --git a/spec/services/spree/olitt/clone_store/clone_request_provisioner_spec.rb b/spec/services/spree/olitt/clone_store/clone_request_provisioner_spec.rb index 263b6c1..3578624 100644 --- a/spec/services/spree/olitt/clone_store/clone_request_provisioner_spec.rb +++ b/spec/services/spree/olitt/clone_store/clone_request_provisioner_spec.rb @@ -27,6 +27,7 @@ expect(Spree::RoleUser.exists?(user: clone_request.admin_user, resource: clone_request.vendor)).to be(true) expect(Spree::VendorUser.exists?(vendor: clone_request.vendor, admin_user: clone_request.admin_user)).to be(true) expect(clone_request.store.vendor_id).to eq(clone_request.vendor.id) + expect(clone_request.store.api_keys.active.publishable.count).to be >= 1 end end end \ No newline at end of file