solidus_bolt 0.2.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -2
  3. data/app/assets/javascripts/solidus_bolt.js +16 -2
  4. data/app/controllers/spree/admin/bolt_callback_urls_controller.rb +39 -0
  5. data/app/controllers/spree/admin/bolts_controller.rb +0 -2
  6. data/app/decorators/models/solidus_bolt/order_decorator.rb +1 -0
  7. data/app/models/solidus_bolt/bolt_configuration.rb +8 -0
  8. data/app/services/solidus_bolt/merchant_configuration/get_callback_urls_service.rb +36 -0
  9. data/app/services/solidus_bolt/merchant_configuration/set_callback_urls_service.rb +55 -0
  10. data/app/views/spree/admin/bolt_callback_urls/new.html.erb +24 -0
  11. data/app/views/spree/admin/bolts/_configuration.html.erb +2 -2
  12. data/app/views/spree/admin/bolts/_form.html.erb +0 -4
  13. data/app/views/spree/admin/bolts/show.html.erb +3 -0
  14. data/config/routes.rb +5 -0
  15. data/db/migrate/20220725133701_remove_merchant_id_and_division_public_id_on_bolt_configuration.rb +6 -0
  16. data/db/seeds.rb +0 -2
  17. data/lib/solidus_bolt/testing_support/factories.rb +1 -3
  18. data/lib/solidus_bolt/version.rb +1 -1
  19. data/lib/views/frontend/spree/shared/_login_bar_items.html.erb +1 -1
  20. data/solidus_bolt.gemspec +0 -1
  21. data/spec/decorators/models/solidus_bolt/order_decorator_spec.rb +1 -0
  22. data/spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_GetCallbackUrlsService/_call/receives_the_correct_response.yml +54 -0
  23. data/spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_SetCallbackUrlsService/_call/receives_the_correct_response.yml +54 -0
  24. data/spec/models/solidus_bolt/bolt_configuration_spec.rb +24 -4
  25. data/spec/requests/spree/admin/bolt_spec.rb +0 -4
  26. data/spec/services/solidus_bolt/merchant_configuration/get_callback_urls_service_spec.rb +15 -0
  27. data/spec/services/solidus_bolt/merchant_configuration/set_callback_urls_service_spec.rb +20 -0
  28. data/spec/services/solidus_bolt/webhooks/create_service_spec.rb +6 -4
  29. data/spec/support/bolt_configuration.rb +1 -3
  30. data/spec/support/vcr.rb +1 -1
  31. metadata +15 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9f19675a463bcfbccc9fe98a89fc973d5bdfb34d66a57e48ad3882441877863
4
- data.tar.gz: d79c693485c474464c5563be4710c7c3898031ef879df7d9cb639d9ea203d195
3
+ metadata.gz: 85a81224dbf00b809093c50581fa790f56f6389a85753a002eff55ed149ddbff
4
+ data.tar.gz: 84ee9afd0a6dd580df9d3ffcbe2550a3e957d5c43fafc209e42cd79965caf9c2
5
5
  SHA512:
6
- metadata.gz: 6fe90bea4b8ccd2712913f0ac7241a4b00458b066aa90cceda1adab3a6b0bad29fc0136f116b3edbf39d03d3b586cfbf89c9b071e0477fa4ec1f1501a100da42
7
- data.tar.gz: 646680ba9a1f2a81337135e242696a759ae04f469d442e3b5241d1c255035443a0a066fc05fe220d16481dbf1314c1a2d1b246a97de7e0db47dd7e7aa0e091c3
6
+ metadata.gz: ed702363808663ef10223d943f670c2bc90b248be1f4953b9288b631b36ec9a40908d1c7d3b295bb6f5cbf27b92820845dbe49e8f51a3336a1da68372c247f18
7
+ data.tar.gz: 2398a99717a2d8f76b1b20c790062b5543d0f7323d90dc55637814bbeadac6d55c3078008a0213f2c6461630dd51362316d5d1b2a2c987fe37acac41cd4e34e8
data/README.md CHANGED
@@ -27,8 +27,6 @@ Many of the API calls handled by this gem use the variables set in Bolt Configur
27
27
 
28
28
  ```
29
29
  BOLT_ENVIRONMENT
30
- BOLT_MERCHANT_PUBLIC_ID
31
- BOLT_DIVISION_PUBLIC_ID
32
30
  BOLT_API_KEY
33
31
  BOLT_SIGNING_SECRET
34
32
  BOLT_PUBLISHABLE_KEY
@@ -16,6 +16,8 @@ const tokenize = async (paymentField, paymentMethodId, frontend) => {
16
16
  if (result["token"]) {
17
17
  updateOrder(result, paymentMethodId, frontend)
18
18
  } else {
19
+ const submitButton = document.getElementById("bolt-submit-button")
20
+ submitButton.disabled = false;
19
21
  console.log(`error ${result["type"]}: ${result["message"]}`);
20
22
  }
21
23
  });
@@ -29,6 +31,11 @@ const redirectToNextStep = (frontend) => {
29
31
  }
30
32
  }
31
33
 
34
+ async function getResponseText(response) {
35
+ const text = await response.text();
36
+ return text;
37
+ }
38
+
32
39
  const updateOrder = async (card, paymentMethodId, frontend) => {
33
40
  await fetch(`/api/checkouts/${Spree.current_order_id}`, {
34
41
  method: 'PATCH',
@@ -37,6 +44,7 @@ const updateOrder = async (card, paymentMethodId, frontend) => {
37
44
  'X-Spree-Order-Token': Spree.current_order_token
38
45
  },
39
46
  body: JSON.stringify({
47
+ 'state': 'payment',
40
48
  'order': {
41
49
  'payments_attributes': [{
42
50
  'payment_method_id': paymentMethodId,
@@ -53,8 +61,14 @@ const updateOrder = async (card, paymentMethodId, frontend) => {
53
61
  }
54
62
  })
55
63
  })
56
- .then(() => {
57
- redirectToNextStep(frontend)
64
+ .then((response) => {
65
+ if(response.ok) {
66
+ redirectToNextStep(frontend)
67
+ } else {
68
+ getResponseText(response).then(text => {
69
+ console.error(text);
70
+ });
71
+ }
58
72
  })
59
73
  .catch((response) => {
60
74
  console.log('Error updating order')
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Admin
5
+ class BoltCallbackUrlsController < Spree::Admin::BaseController
6
+ def new
7
+ callback_urls = SolidusBolt::MerchantConfiguration::GetCallbackUrlsService.call
8
+
9
+ @oauth_logout = callback_urls['callback_urls'].find { |c| c['type'] == 'oauth_logout' }['url']
10
+ @oauth_redirect = callback_urls['callback_urls'].find { |c| c['type'] == 'oauth_redirect' }['url']
11
+ end
12
+
13
+ def update
14
+ SolidusBolt::MerchantConfiguration::SetCallbackUrlsService.call(
15
+ oauth_logout: params[:bolt_callback_urls][:oauth_logout],
16
+ oauth_redirect: params[:bolt_callback_urls][:oauth_redirect]
17
+ )
18
+ flash[:success] = "Successfully updated callback urls."
19
+
20
+ redirect_to new_admin_bolt_callback_urls_path
21
+ rescue SolidusBolt::ServerError => e
22
+ flash[:error] = e.message
23
+
24
+ render :new
25
+ end
26
+
27
+ private
28
+
29
+ def bolt_webhook_params
30
+ params
31
+ .require(:bolt_webhook)
32
+ .permit(
33
+ :event,
34
+ :webhook_url,
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -30,8 +30,6 @@ module Spree
30
30
  .require(:solidus_bolt_bolt_configuration)
31
31
  .permit(
32
32
  :environment,
33
- :merchant_public_id,
34
- :division_public_id,
35
33
  :api_key,
36
34
  :signing_secret,
37
35
  :publishable_key
@@ -5,6 +5,7 @@ module SolidusBolt
5
5
  def bolt_cart
6
6
  {
7
7
  total_amount: display_total.cents,
8
+ tax_amount: display_tax_total.cents,
8
9
  order_reference: number,
9
10
  currency: currency,
10
11
  shipments: bolt_shipments_payload,
@@ -15,6 +15,14 @@ module SolidusBolt
15
15
 
16
16
  validate :config_can_be_created, on: :create
17
17
 
18
+ def merchant_public_id
19
+ publishable_key&.split('.')&.first
20
+ end
21
+
22
+ def division_public_id
23
+ publishable_key&.split('.')&.second
24
+ end
25
+
18
26
  def self.fetch
19
27
  first_or_create
20
28
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusBolt
4
+ module MerchantConfiguration
5
+ class GetCallbackUrlsService < SolidusBolt::BaseService
6
+ attr_reader :oauth_redirect, :oauth_logout, :get_account
7
+
8
+ def call
9
+ get_callbacks
10
+ end
11
+
12
+ private
13
+
14
+ def get_callbacks # rubocop:disable Naming/AccessorMethodName
15
+ url = "#{api_base_url}/#{api_version}/merchant/callbacks"
16
+ handle_result(
17
+ HTTParty.get(
18
+ url, headers: headers, query: query
19
+ )
20
+ )
21
+ end
22
+
23
+ def query
24
+ {
25
+ division_id: @config.division_public_id
26
+ }
27
+ end
28
+
29
+ def headers
30
+ {
31
+ 'Content-Type' => 'application/json',
32
+ }.merge(authentication_header)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusBolt
4
+ module MerchantConfiguration
5
+ class SetCallbackUrlsService < SolidusBolt::BaseService
6
+ attr_reader :oauth_redirect, :oauth_logout, :get_account
7
+
8
+ def initialize(oauth_redirect: nil, oauth_logout: nil, get_account: nil)
9
+ @oauth_redirect = oauth_redirect
10
+ @oauth_logout = oauth_logout
11
+ @get_account = get_account
12
+
13
+ super
14
+ end
15
+
16
+ def call
17
+ set_callbacks
18
+ end
19
+
20
+ private
21
+
22
+ def set_callbacks
23
+ url = "#{api_base_url}/#{api_version}/merchant/callbacks"
24
+ handle_result(
25
+ HTTParty.post(
26
+ url, headers: headers, body: body.to_json
27
+ )
28
+ )
29
+ end
30
+
31
+ def body
32
+ {
33
+ division_id: @config.division_public_id,
34
+ callback_urls: callback_urls
35
+ }
36
+ end
37
+
38
+ def callback_urls
39
+ callback_urls = []
40
+
41
+ callback_urls << { type: 'oauth_redirect', url: oauth_redirect } if oauth_redirect.present?
42
+ callback_urls << { type: 'oauth_logout', url: oauth_logout } if oauth_logout.present?
43
+ callback_urls << { type: 'get_account', url: get_account } if get_account.present?
44
+
45
+ callback_urls
46
+ end
47
+
48
+ def headers
49
+ {
50
+ 'Content-Type' => 'application/json',
51
+ }.merge(authentication_header)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ <% admin_breadcrumb(plural_resource_name(SolidusBolt::BoltConfiguration)) %>
2
+
3
+ <%= form_for :bolt_callback_urls, url: admin_bolt_callback_urls_path, method: :patch do |f| %>
4
+ <fieldset class="form-group no-border-bottom no-border-top">
5
+ <div class="row">
6
+ <div id="general_fields" class="col-9">
7
+ <div class="row">
8
+ <div class="col-12">
9
+ <%= f.label :oauth_redirect %>
10
+ <%= f.text_field :oauth_redirect, class: 'fullwidth', value: @oauth_redirect || 'https://domain.com/webhooks/bolt' %>
11
+ </div>
12
+ <div class="col-12">
13
+ <%= f.label :oauth_logout %>
14
+ <%= f.text_field :oauth_logout, class: 'fullwidth', value: @oauth_logout || 'https://domain.com/webhooks/bolt' %>
15
+ </div>
16
+ </div>
17
+ <div class="row p-2 justify-content-center">
18
+ <%= f.submit 'Update', class: 'btn btn-primary', data: { disable_with: 'Creating..' } %>
19
+ <%= link_to 'Cancel', admin_bolt_path, class: 'button' %>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </fieldset>
24
+ <% end %>
@@ -2,7 +2,7 @@
2
2
  <table class="index">
3
3
  <thead>
4
4
  <tr>
5
- <th><%= SolidusBolt::BoltConfiguration.human_attribute_name(:merchant_public_id) %></th>
5
+ <th><%= SolidusBolt::BoltConfiguration.human_attribute_name(:publishable_key) %></th>
6
6
  <th><%= SolidusBolt::BoltConfiguration.human_attribute_name(:environment) %></th>
7
7
  <th><%= SolidusBolt::BoltConfiguration.human_attribute_name(:created_at) %></th>
8
8
  <th><%= SolidusBolt::BoltConfiguration.human_attribute_name(:updated_at) %></th>
@@ -11,7 +11,7 @@
11
11
  </thead>
12
12
  <tbody>
13
13
  <tr>
14
- <td><%= @bolt_configuration.merchant_public_id %></td>
14
+ <td><%= @bolt_configuration.publishable_key %></td>
15
15
  <td><%= @bolt_configuration.environment %></td>
16
16
  <td>
17
17
  <%= @bolt_configuration.created_at.to_s(:long) %>
@@ -6,10 +6,6 @@
6
6
  <div class="col-12">
7
7
  <%= f.label :environment %>
8
8
  <%= f.select :environment, %w[production sandbox staging] %><br />
9
- <%= f.label 'Merchant Public Id' %><br />
10
- <%= f.text_field :merchant_public_id, class: 'fullwidth' %>
11
- <%= f.label 'Division Public Id' %><br />
12
- <%= f.text_field :division_public_id, class: 'fullwidth' %>
13
9
  <%= f.label :api_key %><br />
14
10
  <%= f.text_field :api_key, class: 'fullwidth' %>
15
11
  <%= f.label :signing_secret %><br />
@@ -11,6 +11,9 @@
11
11
  ) %>
12
12
  </li>
13
13
  <% else %>
14
+ <li>
15
+ <%= link_to 'Configure Callbacks URLs', new_admin_bolt_callback_urls_path, class: 'btn btn-primary' %>
16
+ </li>
14
17
  <li>
15
18
  <%= link_to 'Configure Webhooks', new_admin_bolt_webhook_path, class: 'btn btn-primary' %>
16
19
  </li>
data/config/routes.rb CHANGED
@@ -4,8 +4,13 @@ Spree::Core::Engine.routes.draw do
4
4
  namespace :admin do
5
5
  resource :bolt, only: [:show, :edit, :update]
6
6
  resource :bolt_webhook, only: [:new, :create]
7
+ resource :bolt_callback_urls, only: [:new, :update]
7
8
  end
8
9
 
9
10
  post '/webhooks/bolt', to: '/solidus_bolt/webhooks#update'
10
11
  post '/api/accounts/bolt', to: '/solidus_bolt/accounts#create'
12
+
13
+ devise_scope :spree_user do
14
+ get '/bolt_logout', to: '/spree/user_sessions#destroy', as: 'bolt_logout'
15
+ end
11
16
  end
@@ -0,0 +1,6 @@
1
+ class RemoveMerchantIdAndDivisionPublicIdOnBoltConfiguration < ActiveRecord::Migration[6.1]
2
+ def change
3
+ remove_column :solidus_bolt_bolt_configurations, :division_public_id, :string
4
+ remove_column :solidus_bolt_bolt_configurations, :merchant_public_id, :string
5
+ end
6
+ end
data/db/seeds.rb CHANGED
@@ -3,8 +3,6 @@
3
3
  solidus_bolt_configuration = SolidusBolt::BoltConfiguration.fetch
4
4
 
5
5
  solidus_bolt_configuration.environment = ENV.fetch('BOLT_ENVIRONMENT', 'sandbox')
6
- solidus_bolt_configuration.merchant_public_id = ENV['BOLT_MERCHANT_PUBLIC_ID']
7
- solidus_bolt_configuration.division_public_id = ENV['BOLT_DIVISION_PUBLIC_ID']
8
6
  solidus_bolt_configuration.api_key = ENV['BOLT_API_KEY']
9
7
  solidus_bolt_configuration.signing_secret = ENV['BOLT_SIGNING_SECRET']
10
8
  solidus_bolt_configuration.publishable_key = ENV['BOLT_PUBLISHABLE_KEY']
@@ -3,11 +3,9 @@
3
3
  FactoryBot.define do
4
4
  factory :bolt_configuration, class: SolidusBolt::BoltConfiguration do
5
5
  environment { 'sandbox' }
6
- merchant_public_id { SecureRandom.hex }
7
- division_public_id { SecureRandom.hex }
8
6
  api_key { SecureRandom.hex }
9
7
  signing_secret { SecureRandom.hex }
10
- publishable_key { SecureRandom.hex }
8
+ publishable_key { "#{SecureRandom.hex}.#{SecureRandom.hex}.#{SecureRandom.hex}" }
11
9
  end
12
10
 
13
11
  factory :bolt_payment_method, class: SolidusBolt::PaymentMethod do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusBolt
4
- VERSION = '0.2.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -1,6 +1,6 @@
1
1
  <% if spree_current_user %>
2
2
  <li><%= link_to t('spree.my_account'), spree.account_path %></li>
3
- <li><%= link_to t('spree.logout'), spree.logout_path, method: Devise.sign_out_via %></li>
3
+ <li><div class="bolt-account-sso" data-logged-in="true"></div></li>
4
4
  <% else %>
5
5
  <li>
6
6
  <div class="bolt-account-sso"></div>
data/solidus_bolt.gemspec CHANGED
@@ -34,7 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency 'multi_json'
35
35
  spec.add_dependency 'omniauth-bolt'
36
36
  spec.add_dependency 'rails'
37
- spec.add_dependency 'solidus_auth_devise'
38
37
  spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 4']
39
38
  spec.add_dependency 'solidus_social'
40
39
  spec.add_dependency 'solidus_support', '~> 0.5'
@@ -7,6 +7,7 @@ RSpec.describe SolidusBolt::OrderDecorator do
7
7
  it 'returns a hash with line items and price' do
8
8
  result = {
9
9
  total_amount: (order.total * 100).to_i,
10
+ tax_amount: (order.tax_total * 100).to_i,
10
11
  order_reference: order.number,
11
12
  currency: 'USD',
12
13
  shipments: array_including(hash_including(:reference)),
@@ -0,0 +1,54 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api-sandbox.bolt.com/v1/merchant/callbacks?division_id=<DIVISION_PUBLIC_ID>
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ X-Api-Key:
13
+ - "<API_KEY>"
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Accept:
17
+ - "*/*"
18
+ User-Agent:
19
+ - Ruby
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 27 Jul 2022 18:10:11 GMT
27
+ Content-Type:
28
+ - application/json; charset=UTF-8
29
+ Content-Length:
30
+ - '157'
31
+ Connection:
32
+ - keep-alive
33
+ Public-Key-Pins-Report-Only:
34
+ - max-age=2592000;pin-sha256="OGAVOYhLZd3ADKYGFZOED1c5m1ObMlRv9PyIWrO4Nd0=";pin-sha256="RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho=";pin-sha256="IXHYSIdST+XY22J5ivybYkntMIfjA5P6pMKX2hWG1BE=";report-uri="https://77aa1bd121ef22d50247a23390ce6cff.report-uri.io/r/default/hpkp/reportOnly"
35
+ Set-Cookie:
36
+ - trk=f47ec1df-c6f5-460c-baf3-2ff506846dd2; Path=/; Max-Age=31536000; HttpOnly;
37
+ Secure; SameSite=None
38
+ Strict-Transport-Security:
39
+ - max-age=31536000; includeSubDomains; preload
40
+ X-Bolt-Api-Version:
41
+ - '2022-01-01'
42
+ X-Bolt-Trace-Id:
43
+ - Root=1-62e17f83-46d90f8f25fd210e0420dbdb
44
+ X-Device-Id:
45
+ - cc0e49b483c9bdb9dce4a6f35b9fcfb75194e19da94e18882fac74a192a8fc71
46
+ X-Envoy-Upstream-Service-Time:
47
+ - '29'
48
+ Server:
49
+ - envoy
50
+ body:
51
+ encoding: UTF-8
52
+ string: '{"callback_urls":[{"url":"http://localhost:3000/bolt_logout","type":"oauth_logout"},{"url":"http://localhost:3000/users/auth/bolt","type":"oauth_redirect"}]}'
53
+ recorded_at: Wed, 27 Jul 2022 18:10:11 GMT
54
+ recorded_with: VCR 6.1.0
@@ -0,0 +1,54 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api-sandbox.bolt.com/v1/merchant/callbacks
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"division_id":"Rq4qB1QajYLn","callback_urls":[{"type":"oauth_redirect","url":"http://localhost:3000/users/auth/bolt"},{"type":"oauth_logout","url":"http://localhost:3000//user/spree_user/logout"}]}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ X-Api-Key:
13
+ - "<API_KEY>"
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Accept:
17
+ - "*/*"
18
+ User-Agent:
19
+ - Ruby
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Tue, 26 Jul 2022 21:17:15 GMT
27
+ Content-Type:
28
+ - application/json; charset=UTF-8
29
+ Content-Length:
30
+ - '4'
31
+ Connection:
32
+ - keep-alive
33
+ Public-Key-Pins-Report-Only:
34
+ - max-age=2592000;pin-sha256="OGAVOYhLZd3ADKYGFZOED1c5m1ObMlRv9PyIWrO4Nd0=";pin-sha256="RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho=";pin-sha256="IXHYSIdST+XY22J5ivybYkntMIfjA5P6pMKX2hWG1BE=";report-uri="https://77aa1bd121ef22d50247a23390ce6cff.report-uri.io/r/default/hpkp/reportOnly"
35
+ Set-Cookie:
36
+ - trk=ea8f518e-f41d-4b8c-9615-161bff916a0f; Path=/; Max-Age=31536000; HttpOnly;
37
+ Secure; SameSite=None
38
+ Strict-Transport-Security:
39
+ - max-age=31536000; includeSubDomains; preload
40
+ X-Bolt-Api-Version:
41
+ - '2022-01-01'
42
+ X-Bolt-Trace-Id:
43
+ - Root=1-62e059db-307d2def557ae7d63cda1f93
44
+ X-Device-Id:
45
+ - 65fb9d676354668c7128f58217c94230e32303007b66559078fee6aefb88e8a4
46
+ X-Envoy-Upstream-Service-Time:
47
+ - '37'
48
+ Server:
49
+ - envoy
50
+ body:
51
+ encoding: UTF-8
52
+ string: 'null'
53
+ recorded_at: Tue, 26 Jul 2022 21:17:15 GMT
54
+ recorded_with: VCR 6.1.0
@@ -5,8 +5,6 @@ RSpec.describe SolidusBolt::BoltConfiguration, type: :model do
5
5
  [
6
6
  'id',
7
7
  'environment',
8
- 'merchant_public_id',
9
- 'division_public_id',
10
8
  'api_key',
11
9
  'signing_secret',
12
10
  'publishable_key',
@@ -46,8 +44,6 @@ RSpec.describe SolidusBolt::BoltConfiguration, type: :model do
46
44
  it 'is true for a record with empty fields' do
47
45
  create(
48
46
  :bolt_configuration,
49
- merchant_public_id: '',
50
- division_public_id: '',
51
47
  api_key: '',
52
48
  signing_secret: '',
53
49
  publishable_key: ''
@@ -61,6 +57,30 @@ RSpec.describe SolidusBolt::BoltConfiguration, type: :model do
61
57
  end
62
58
  end
63
59
 
60
+ describe '#merchant_public_id' do
61
+ it 'returns the merchant_public_id' do
62
+ bolt_configuration = create(:bolt_configuration, publishable_key: 'abc.def.ghi')
63
+ expect(bolt_configuration.merchant_public_id).to eq('abc')
64
+ end
65
+
66
+ it 'returns nil if publishable_key is nil' do
67
+ bolt_configuration = create(:bolt_configuration, publishable_key: nil)
68
+ expect(bolt_configuration.division_public_id).to be_nil
69
+ end
70
+ end
71
+
72
+ describe '#division_public_id' do
73
+ it 'returns the division_public_id' do
74
+ bolt_configuration = create(:bolt_configuration, publishable_key: 'abc.def.ghi')
75
+ expect(bolt_configuration.division_public_id).to eq('def')
76
+ end
77
+
78
+ it 'returns nil if publishable_key is nil' do
79
+ bolt_configuration = create(:bolt_configuration, publishable_key: nil)
80
+ expect(bolt_configuration.division_public_id).to be_nil
81
+ end
82
+ end
83
+
64
84
  describe '#environment_url' do
65
85
  context 'when production envornment' do
66
86
  let(:config) { create(:bolt_configuration, environment: 'production') }
@@ -6,8 +6,6 @@ RSpec.describe "Spree::Admin::Bolts", type: :request do
6
6
  let(:bolt_configuration_params) {
7
7
  {
8
8
  environment: 'sandbox',
9
- merchant_public_id: SecureRandom.hex,
10
- division_public_id: SecureRandom.hex,
11
9
  api_key: SecureRandom.hex,
12
10
  signing_secret: SecureRandom.hex,
13
11
  publishable_key: SecureRandom.hex
@@ -56,8 +54,6 @@ RSpec.describe "Spree::Admin::Bolts", type: :request do
56
54
 
57
55
  updated_attributes = SolidusBolt::BoltConfiguration.fetch.attributes.slice(
58
56
  'environment',
59
- 'merchant_public_id',
60
- 'division_public_id',
61
57
  'api_key',
62
58
  'signing_secret',
63
59
  'publishable_key'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusBolt::MerchantConfiguration::GetCallbackUrlsService, :vcr, :bolt_configuration do
6
+ subject(:api) { described_class.new }
7
+
8
+ describe '#call', vcr: true do
9
+ it 'receives the correct response' do
10
+ expect(api.call).to match hash_including(
11
+ 'callback_urls' => array_including(hash_including('type', 'url'))
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusBolt::MerchantConfiguration::SetCallbackUrlsService, :vcr, :bolt_configuration do
6
+ subject(:api) { described_class.new(params) }
7
+
8
+ let(:params) {
9
+ {
10
+ oauth_redirect: 'http://localhost:3000/users/auth/bolt',
11
+ oauth_logout: 'http://localhost:3000//user/spree_user/logout'
12
+ }
13
+ }
14
+
15
+ describe '#call', vcr: true do
16
+ it 'receives the correct response' do
17
+ expect(api.call).to be_nil
18
+ end
19
+ end
20
+ end
@@ -4,13 +4,15 @@ require 'spec_helper'
4
4
 
5
5
  RSpec.describe SolidusBolt::Webhooks::CreateService, :vcr, :bolt_configuration do
6
6
  describe '#call', vcr: true do
7
- subject(:create) { described_class.call(url: 'https://solidus-test.com/webhook', event: event) }
7
+ subject(:create_service) { described_class.call(url: 'https://solidus-test.com/webhook', event: event) }
8
+
9
+ before { SolidusBolt::BoltConfiguration.fetch.update(publishable_key: 'abc.def.ghi') }
8
10
 
9
11
  context 'with an event' do
10
12
  let(:event) { 'payment' }
11
13
 
12
14
  it 'returns a webhook id' do
13
- expect(create).to match hash_including('webhook_id')
15
+ expect(create_service).to match hash_including('webhook_id')
14
16
  end
15
17
  end
16
18
 
@@ -18,7 +20,7 @@ RSpec.describe SolidusBolt::Webhooks::CreateService, :vcr, :bolt_configuration d
18
20
  let(:event) { 'all' }
19
21
 
20
22
  it 'returns a webhook id' do
21
- expect(create).to match hash_including('webhook_id')
23
+ expect(create_service).to match hash_including('webhook_id')
22
24
  end
23
25
  end
24
26
 
@@ -26,7 +28,7 @@ RSpec.describe SolidusBolt::Webhooks::CreateService, :vcr, :bolt_configuration d
26
28
  let(:event) { '' }
27
29
 
28
30
  it 'raises a server error' do
29
- expect{ create }.to raise_error SolidusBolt::ServerError
31
+ expect{ create_service }.to raise_error SolidusBolt::ServerError
30
32
  end
31
33
  end
32
34
  end
@@ -5,11 +5,9 @@ RSpec.configure do |config|
5
5
  solidus_bolt_configuration = SolidusBolt::BoltConfiguration.fetch
6
6
 
7
7
  solidus_bolt_configuration.environment = 'sandbox'
8
- solidus_bolt_configuration.merchant_public_id = ENV['BOLT_MERCHANT_PUBLIC_ID']
9
- solidus_bolt_configuration.division_public_id = ENV['BOLT_DIVISION_PUBLIC_ID']
10
8
  solidus_bolt_configuration.api_key = ENV['BOLT_API_KEY']
11
9
  solidus_bolt_configuration.signing_secret = ENV['BOLT_SIGNING_SECRET']
12
- solidus_bolt_configuration.publishable_key = ENV['BOLT_PUBLISHABLE_KEY']
10
+ solidus_bolt_configuration.publishable_key = ENV['BOLT_PUBLISHABLE_KEY'] || 'abc.def.ghi'
13
11
 
14
12
  solidus_bolt_configuration.save!
15
13
 
data/spec/support/vcr.rb CHANGED
@@ -19,8 +19,8 @@ VCR.configure do |config|
19
19
  end
20
20
 
21
21
  config.filter_sensitive_data('<PUBLISHABLE_KEY>') { SolidusBolt::BoltConfiguration.fetch.publishable_key }
22
+ config.filter_sensitive_data('<DIVISION_PUBLIC_ID>') { SolidusBolt::BoltConfiguration.fetch.division_public_id }
22
23
  config.filter_sensitive_data('<API_KEY>') { SolidusBolt::BoltConfiguration.fetch.api_key }
23
- config.filter_sensitive_data('<DIVISION_ID>') { SolidusBolt::BoltConfiguration.fetch.division_public_id }
24
24
 
25
25
  # Let's you set default VCR record mode with VCR_RECORDE_MODE=all for re-recording
26
26
  # episodes. :once is VCR default
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_bolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - piyushswain
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-07-22 00:00:00.000000000 Z
13
+ date: 2022-07-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: coffee-rails
@@ -96,20 +96,6 @@ dependencies:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
98
  version: '0'
99
- - !ruby/object:Gem::Dependency
100
- name: solidus_auth_devise
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- version: '0'
106
- type: :runtime
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: '0'
113
99
  - !ruby/object:Gem::Dependency
114
100
  name: solidus_core
115
101
  requirement: !ruby/object:Gem::Requirement
@@ -256,6 +242,7 @@ files:
256
242
  - app/controllers/solidus_bolt/accounts_controller.rb
257
243
  - app/controllers/solidus_bolt/base_controller.rb
258
244
  - app/controllers/solidus_bolt/webhooks_controller.rb
245
+ - app/controllers/spree/admin/bolt_callback_urls_controller.rb
259
246
  - app/controllers/spree/admin/bolt_webhooks_controller.rb
260
247
  - app/controllers/spree/admin/bolts_controller.rb
261
248
  - app/decorators/controllers/solidus_bolt/spree_checkout_controller/add_addresses_to_bolt.rb
@@ -279,6 +266,8 @@ files:
279
266
  - app/services/solidus_bolt/accounts/detail_service.rb
280
267
  - app/services/solidus_bolt/accounts/detect_account_service.rb
281
268
  - app/services/solidus_bolt/base_service.rb
269
+ - app/services/solidus_bolt/merchant_configuration/get_callback_urls_service.rb
270
+ - app/services/solidus_bolt/merchant_configuration/set_callback_urls_service.rb
282
271
  - app/services/solidus_bolt/oauth/token_service.rb
283
272
  - app/services/solidus_bolt/payments/capture_sync_service.rb
284
273
  - app/services/solidus_bolt/payments/credit_sync_service.rb
@@ -294,6 +283,7 @@ files:
294
283
  - app/services/solidus_bolt/users/sync_addresses_service.rb
295
284
  - app/services/solidus_bolt/users/sync_payment_sources_service.rb
296
285
  - app/services/solidus_bolt/webhooks/create_service.rb
286
+ - app/views/spree/admin/bolt_callback_urls/new.html.erb
297
287
  - app/views/spree/admin/bolt_webhooks/new.html.erb
298
288
  - app/views/spree/admin/bolts/_configuration.html.erb
299
289
  - app/views/spree/admin/bolts/_form.html.erb
@@ -330,6 +320,7 @@ files:
330
320
  - db/migrate/20220530102107_rename_bolt_configuration_merchant_id_to_division_public_id.rb
331
321
  - db/migrate/20220531075527_update_bolt_configuration_environment_column_restrictions.rb
332
322
  - db/migrate/20220629131950_remove_bearer_token_on_solidus_bolt_bolt_configuration.rb
323
+ - db/migrate/20220725133701_remove_merchant_id_and_division_public_id_on_bolt_configuration.rb
333
324
  - db/seeds.rb
334
325
  - lib/generators/solidus_bolt/install/install_generator.rb
335
326
  - lib/generators/solidus_bolt/install/templates/initializer.rb
@@ -354,6 +345,8 @@ files:
354
345
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetailService/_call/with_wrong_access_token/gives_an_error.yml
355
346
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetectAccountService/_call/receives_the_correct_response.yml
356
347
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetectAccountService/_call/returns_status_200.yml
348
+ - spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_GetCallbackUrlsService/_call/receives_the_correct_response.yml
349
+ - spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_SetCallbackUrlsService/_call/receives_the_correct_response.yml
357
350
  - spec/fixtures/vcr_cassettes/SolidusBolt_Oauth_TokenService/_call/makes_the_API_call.yml
358
351
  - spec/fixtures/vcr_cassettes/SolidusBolt_Transactions_AuthorizeService/when_repeat_payment/_call/makes_the_API_call.yml
359
352
  - spec/fixtures/vcr_cassettes/SolidusBolt_Transactions_AuthorizeService/with_auto_capture/_call/makes_the_API_call.yml
@@ -385,6 +378,8 @@ files:
385
378
  - spec/services/solidus_bolt/accounts/detail_service_spec.rb
386
379
  - spec/services/solidus_bolt/accounts/detect_account_service_spec.rb
387
380
  - spec/services/solidus_bolt/base_service_spec.rb
381
+ - spec/services/solidus_bolt/merchant_configuration/get_callback_urls_service_spec.rb
382
+ - spec/services/solidus_bolt/merchant_configuration/set_callback_urls_service_spec.rb
388
383
  - spec/services/solidus_bolt/oauth/token_service_spec.rb
389
384
  - spec/services/solidus_bolt/payments/capture_sync_service_spec.rb
390
385
  - spec/services/solidus_bolt/payments/credit_sync_service_spec.rb
@@ -448,6 +443,8 @@ test_files:
448
443
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetailService/_call/with_wrong_access_token/gives_an_error.yml
449
444
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetectAccountService/_call/receives_the_correct_response.yml
450
445
  - spec/fixtures/vcr_cassettes/SolidusBolt_Accounts_DetectAccountService/_call/returns_status_200.yml
446
+ - spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_GetCallbackUrlsService/_call/receives_the_correct_response.yml
447
+ - spec/fixtures/vcr_cassettes/SolidusBolt_MerchantConfiguration_SetCallbackUrlsService/_call/receives_the_correct_response.yml
451
448
  - spec/fixtures/vcr_cassettes/SolidusBolt_Oauth_TokenService/_call/makes_the_API_call.yml
452
449
  - spec/fixtures/vcr_cassettes/SolidusBolt_Transactions_AuthorizeService/when_repeat_payment/_call/makes_the_API_call.yml
453
450
  - spec/fixtures/vcr_cassettes/SolidusBolt_Transactions_AuthorizeService/with_auto_capture/_call/makes_the_API_call.yml
@@ -479,6 +476,8 @@ test_files:
479
476
  - spec/services/solidus_bolt/accounts/detail_service_spec.rb
480
477
  - spec/services/solidus_bolt/accounts/detect_account_service_spec.rb
481
478
  - spec/services/solidus_bolt/base_service_spec.rb
479
+ - spec/services/solidus_bolt/merchant_configuration/get_callback_urls_service_spec.rb
480
+ - spec/services/solidus_bolt/merchant_configuration/set_callback_urls_service_spec.rb
482
481
  - spec/services/solidus_bolt/oauth/token_service_spec.rb
483
482
  - spec/services/solidus_bolt/payments/capture_sync_service_spec.rb
484
483
  - spec/services/solidus_bolt/payments/credit_sync_service_spec.rb