solidus_stripe 4.3.0 → 5.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +98 -23
- data/.github/stale.yml +1 -17
- data/.gitignore +3 -0
- data/.rubocop.yml +94 -2
- data/.yardopts +1 -0
- data/CHANGELOG.md +1 -231
- data/Gemfile +10 -25
- data/LICENSE +2 -2
- data/Procfile.dev +3 -0
- data/README.md +155 -223
- data/Rakefile +7 -3
- data/app/assets/javascripts/spree/backend/solidus_stripe.js +2 -0
- data/app/assets/stylesheets/spree/backend/solidus_stripe.css +4 -0
- data/app/controllers/solidus_stripe/intents_controller.rb +36 -52
- data/app/controllers/solidus_stripe/webhooks_controller.rb +28 -0
- data/app/models/concerns/solidus_stripe/log_entries.rb +31 -0
- data/app/models/solidus_stripe/customer.rb +21 -0
- data/app/models/solidus_stripe/gateway.rb +231 -0
- data/app/models/solidus_stripe/payment_intent.rb +111 -0
- data/app/models/solidus_stripe/payment_method.rb +106 -0
- data/app/models/solidus_stripe/payment_source.rb +31 -0
- data/app/models/solidus_stripe/slug_entry.rb +20 -0
- data/app/models/solidus_stripe.rb +7 -0
- data/app/subscribers/solidus_stripe/webhook/charge_subscriber.rb +28 -0
- data/app/subscribers/solidus_stripe/webhook/payment_intent_subscriber.rb +112 -0
- data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +29 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/_stripe.html.erb +14 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_card.html.erb +8 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_default.html.erb +7 -0
- data/app/views/spree/admin/payments/source_views/_stripe.html.erb +15 -0
- data/app/views/spree/api/payments/source_views/_stripe.json.jbuilder +8 -0
- data/bin/dev +13 -0
- data/bin/dummy-app +29 -0
- data/bin/rails +38 -3
- data/bin/rails-dummy-app +3 -0
- data/bin/rails-engine +1 -11
- data/bin/rails-new +55 -0
- data/bin/rails-sandbox +1 -14
- data/bin/rspec +10 -0
- data/bin/sandbox +12 -74
- data/bin/setup +1 -0
- data/bin/update-migrations +56 -0
- data/codecov.yml +12 -0
- data/config/locales/en.yml +16 -1
- data/config/routes.rb +5 -11
- data/coverage.rb +42 -0
- data/db/migrate/20230109183332_create_solidus_stripe_payment_sources.rb +10 -0
- data/db/migrate/20230303154931_create_solidus_stripe_setup_intent.rb +10 -0
- data/db/migrate/20230306105520_create_solidus_stripe_payment_intents.rb +10 -0
- data/db/migrate/20230308122414_create_solidus_stripe_webhook_endpoints.rb +10 -0
- data/db/migrate/20230310152615_add_payment_method_reference_to_stripe_intents.rb +6 -0
- data/db/migrate/20230310171444_normalize_stripe_intent_id_attributes.rb +6 -0
- data/db/migrate/20230313150008_create_solidus_stripe_customers.rb +16 -0
- data/db/migrate/20230323154931_drop_solidus_stripe_setup_intent.rb +13 -0
- data/db/migrate/20230403094916_rename_webhook_endpoint_to_payment_method_slug_entries.rb +5 -0
- data/db/seeds.rb +6 -24
- data/lib/generators/solidus_stripe/install/install_generator.rb +121 -14
- data/lib/generators/solidus_stripe/install/templates/app/assets/stylesheets/spree/frontend/solidus_stripe.css +13 -0
- data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_confirm_controller.js +39 -0
- data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_payment_controller.js +89 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/_stripe.html.erb +16 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_card.html.erb +8 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_default.html.erb +7 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/payment/_stripe.html.erb +39 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/orders/payment_info/_stripe.html.erb +20 -0
- data/lib/generators/solidus_stripe/install/templates/config/initializers/solidus_stripe.rb +31 -0
- data/lib/solidus_stripe/configuration.rb +24 -3
- data/lib/solidus_stripe/engine.rb +19 -6
- data/lib/solidus_stripe/money_to_stripe_amount_converter.rb +109 -0
- data/lib/solidus_stripe/refunds_synchronizer.rb +96 -0
- data/lib/solidus_stripe/seeds.rb +19 -0
- data/lib/solidus_stripe/testing_support/factories.rb +153 -0
- data/lib/solidus_stripe/version.rb +1 -1
- data/lib/solidus_stripe/webhook/event.rb +90 -0
- data/lib/solidus_stripe.rb +0 -2
- data/solidus_stripe.gemspec +29 -5
- data/spec/lib/solidus_stripe/configuration_spec.rb +21 -0
- data/spec/lib/solidus_stripe/money_to_stripe_amount_converter_spec.rb +133 -0
- data/spec/lib/solidus_stripe/refunds_synchronizer_spec.rb +238 -0
- data/spec/lib/solidus_stripe/seeds_spec.rb +43 -0
- data/spec/lib/solidus_stripe/webhook/event_spec.rb +134 -0
- data/spec/models/concerns/solidus_stripe/log_entries_spec.rb +54 -0
- data/spec/models/solidus_stripe/customer_spec.rb +47 -0
- data/spec/models/solidus_stripe/gateway_spec.rb +283 -0
- data/spec/models/solidus_stripe/payment_intent_spec.rb +17 -0
- data/spec/models/solidus_stripe/payment_method_spec.rb +137 -0
- data/spec/models/solidus_stripe/payment_source_spec.rb +25 -0
- data/spec/requests/solidus_stripe/intents_controller_spec.rb +29 -0
- data/spec/requests/solidus_stripe/webhooks_controller/charge/refunded_spec.rb +31 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/canceled_spec.rb +23 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/payment_failed_spec.rb +23 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/succeeded_spec.rb +29 -0
- data/spec/requests/solidus_stripe/webhooks_controller_spec.rb +52 -0
- data/spec/solidus_stripe_spec_helper.rb +10 -0
- data/spec/subscribers/solidus_stripe/webhook/charge_subscriber_spec.rb +33 -0
- data/spec/subscribers/solidus_stripe/webhook/payment_intent_subscriber_spec.rb +297 -0
- data/spec/support/solidus_stripe/backend_test_helper.rb +210 -0
- data/spec/support/solidus_stripe/checkout_test_helper.rb +339 -0
- data/spec/support/solidus_stripe/factories.rb +5 -0
- data/spec/support/solidus_stripe/webhook/data_fixtures.rb +106 -0
- data/spec/support/solidus_stripe/webhook/event_with_context_factory.rb +82 -0
- data/spec/support/solidus_stripe/webhook/request_helper.rb +32 -0
- data/spec/system/backend/solidus_stripe/orders/payments_spec.rb +119 -0
- data/spec/system/frontend/.keep +0 -0
- data/spec/system/frontend/solidus_stripe/checkout_spec.rb +187 -0
- data/tmp/.keep +0 -0
- metadata +210 -69
- data/.travis.yml +0 -28
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +0 -122
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +0 -148
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-init.js +0 -20
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +0 -84
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +0 -160
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +0 -16
- data/app/assets/javascripts/spree/frontend/solidus_stripe.js +0 -6
- data/app/controllers/solidus_stripe/payment_request_controller.rb +0 -52
- data/app/controllers/spree/stripe_controller.rb +0 -13
- data/app/decorators/models/spree/order_update_attributes_decorator.rb +0 -39
- data/app/decorators/models/spree/payment_decorator.rb +0 -11
- data/app/decorators/models/spree/refund_decorator.rb +0 -9
- data/app/models/solidus_stripe/address_from_params_service.rb +0 -72
- data/app/models/solidus_stripe/create_intents_payment_service.rb +0 -114
- data/app/models/solidus_stripe/prepare_order_for_payment_service.rb +0 -46
- data/app/models/solidus_stripe/shipping_rates_service.rb +0 -46
- data/app/models/spree/payment_method/stripe_credit_card.rb +0 -217
- data/bin/r +0 -13
- data/bin/sandbox_rails +0 -18
- data/db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb +0 -21
- data/lib/assets/stylesheets/spree/frontend/solidus_stripe.scss +0 -11
- data/lib/solidus_stripe/testing_support/card_input_helper.rb +0 -34
- data/lib/tasks/solidus_stripe/db/seed.rake +0 -14
- data/lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder +0 -3
- data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +0 -28
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +0 -1
- data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/existing_payment/_stripe.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +0 -8
- data/lib/views/frontend/spree/checkout/payment/v2/_javascript.html.erb +0 -78
- data/lib/views/frontend/spree/checkout/payment/v3/_elements.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -40
- data/lib/views/frontend/spree/checkout/payment/v3/_intents.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/v3/_stripe.html.erb +0 -2
- data/lib/views/frontend/spree/orders/_stripe_payment_request_button.html.erb +0 -14
- data/spec/features/stripe_checkout_spec.rb +0 -486
- data/spec/models/solidus_stripe/address_from_params_service_spec.rb +0 -87
- data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +0 -127
- data/spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb +0 -65
- data/spec/models/solidus_stripe/shipping_rates_service_spec.rb +0 -54
- data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +0 -316
- data/spec/requests/payment_requests_spec.rb +0 -152
- data/spec/spec_helper.rb +0 -37
- data/spec/support/solidus_address_helper.rb +0 -15
@@ -0,0 +1,8 @@
|
|
1
|
+
<% card = stripe_payment_method.card %>
|
2
|
+
<%#
|
3
|
+
Add credit card logos:
|
4
|
+
https://support.stripe.com/questions/where-to-find-logos-for-accepted-credit-card-types
|
5
|
+
%>
|
6
|
+
💳 <%= card.brand %>
|
7
|
+
<span>∗∗∗∗ ∗∗∗∗ ∗∗∗∗ <%= card.last4 %> </span>
|
8
|
+
(<%= t 'spree.expiration' %>: <%= card.exp_month %>/<%= card.exp_year %>)
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% logger.error(
|
2
|
+
%{Can't find a partial for payments with type #{payment_type} } +
|
3
|
+
%{please add a partial named "#{partial_base}/_#{payment_type}.html.erb".}
|
4
|
+
) %>
|
5
|
+
|
6
|
+
<%= stripe_payment_method.type.humanize %>
|
7
|
+
(<%= time_ago_in_words Time.at(stripe_payment_method.created) %>)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= intent_id = SolidusStripe::PaymentMethod.intent_id_for_payment(payment) %>
|
2
|
+
|
3
|
+
<fieldset data-hook="credit_card">
|
4
|
+
<legend align="center"><%= SolidusStripe::PaymentSource.model_name.human %></legend>
|
5
|
+
|
6
|
+
<div class="row">
|
7
|
+
<div class="col-4">
|
8
|
+
<%= link_to(
|
9
|
+
"Open in the Stripe dashboard ↗",
|
10
|
+
payment.payment_method.stripe_dashboard_url(intent_id),
|
11
|
+
target: :_blank,
|
12
|
+
) %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</fieldset>
|
data/bin/dev
ADDED
data/bin/dummy-app
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
extension_name="solidus_stripe"
|
6
|
+
app_name="dummy-app"
|
7
|
+
|
8
|
+
bin/rails-new "$app_name"
|
9
|
+
|
10
|
+
# Stay away from the bundler env of the containing extension.
|
11
|
+
function unbundled {
|
12
|
+
echo "~~> Running: $@"
|
13
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
14
|
+
}
|
15
|
+
|
16
|
+
cd ./dummy-app
|
17
|
+
|
18
|
+
# Coverage
|
19
|
+
echo "require_relative '../../coverage.rb' if ENV['COVERAGE']" >> config/boot.rb
|
20
|
+
echo "gem 'rspec_junit_formatter', require: false" >> Gemfile
|
21
|
+
echo "gem 'simplecov', '~> 0.22', require: false" >> Gemfile
|
22
|
+
echo "gem 'simplecov-cobertura', require: false" >> Gemfile
|
23
|
+
unbundled bundle install
|
24
|
+
|
25
|
+
unbundled bundle add solidus --github solidusio/solidus --branch "${SOLIDUS_BRANCH:-master}" --version '> 0.a'
|
26
|
+
unbundled bundle exec rake db:drop db:create
|
27
|
+
unbundled bundle exec rails generate solidus:install --auto-accept --payment-method=none --no-seed --no-sample "$@"
|
28
|
+
unbundled bundle add $extension_name --path ..
|
29
|
+
unbundled bundle exec rails generate $extension_name:install --migrate --load-seeds=false --specs=all
|
data/bin/rails
CHANGED
@@ -1,7 +1,42 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
case ARGV.first
|
4
|
+
when "dummy-app", "sandbox"
|
5
|
+
app_name = ARGV.shift
|
6
|
+
root = "#{__dir__}/.."
|
7
|
+
app_root = "#{root}/#{app_name}"
|
8
|
+
|
9
|
+
unless File.exist? "#{app_root}/bin/rails"
|
10
|
+
warn "Creating the #{app_name} app..."
|
11
|
+
Dir.chdir root do
|
12
|
+
system "#{root}/bin/#{app_name}" or begin
|
13
|
+
warn "Automatic creation of the #{app_name} app failed"
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir.chdir app_root
|
20
|
+
exec "#{app_root}/bin/rails", *ARGV
|
21
|
+
when "engine"
|
22
|
+
ARGV.shift
|
23
|
+
|
24
|
+
# Rails will try to match the contents of bin/rails to /(APP|ENGINE)_PATH/
|
25
|
+
# and use that file instead of running, this disrupts the sandbox creation
|
26
|
+
# so we need to break the match in order for this to work.
|
27
|
+
# rubocop:disable Lint/LiteralInInterpolation
|
28
|
+
Object.const_set "ENGINE_#{:ROOT}", File.expand_path('..', __dir__)
|
29
|
+
Object.const_set "ENGINE_#{:PATH}", File.expand_path('../lib/solidus_stripe/engine', __dir__)
|
30
|
+
# rubocop:enable Lint/LiteralInInterpolation
|
31
|
+
|
32
|
+
# Set up gems listed in the Gemfile.
|
33
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
34
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
35
|
+
|
36
|
+
require 'rails/all'
|
37
|
+
require 'rails/engine/commands'
|
38
|
+
when "g", "generate"
|
39
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "engine", *ARGV
|
5
40
|
else
|
6
|
-
exec "#{__dir__}/rails
|
41
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "sandbox", *ARGV
|
7
42
|
end
|
data/bin/rails-dummy-app
ADDED
data/bin/rails-engine
CHANGED
@@ -1,13 +1,3 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# This command will automatically be run when you run "rails" with Rails gems
|
3
|
-
# installed from the root of your application.
|
4
2
|
|
5
|
-
|
6
|
-
ENGINE_PATH = File.expand_path('../lib/solidus_stripe/engine', __dir__)
|
7
|
-
|
8
|
-
# Set up gems listed in the Gemfile.
|
9
|
-
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
10
|
-
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
11
|
-
|
12
|
-
require 'rails/all'
|
13
|
-
require 'rails/engine/commands'
|
3
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "engine", *ARGV
|
data/bin/rails-new
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
app_name="$1"
|
6
|
+
|
7
|
+
root_path="$PWD"
|
8
|
+
app_path="${root_path}/${app_name}"
|
9
|
+
ruby_version=`ruby -e'puts RUBY_VERSION'`
|
10
|
+
rails_version=`bundle exec ruby -rrails/version -e'puts Rails.version'`
|
11
|
+
solidus_version=`bundle exec ruby -rspree/core/version -e'puts Spree::VERSION'`
|
12
|
+
cache_path="tmp/cache/rails-new/${app_name}-${rails_version}-${solidus_version}-${ruby_version}.zip"
|
13
|
+
|
14
|
+
# Stay away from the bundler env of the containing extension.
|
15
|
+
function unbundled {
|
16
|
+
echo "~~> Running: $@"
|
17
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
18
|
+
}
|
19
|
+
|
20
|
+
# "sqlite" is set by the ORB extension instead of "sqlite3",
|
21
|
+
# all other options are already in the format expected by `rails new`.
|
22
|
+
test "$DB" = "sqlite" && export DB="sqlite3"
|
23
|
+
|
24
|
+
rm -rf "$app_path"
|
25
|
+
mkdir -p tmp/cache/rails-new
|
26
|
+
|
27
|
+
if [ -f "${cache_path}" ]; then
|
28
|
+
echo "~~> Using cached rails ${app_name}"
|
29
|
+
unzip -q "${cache_path}" -d ./
|
30
|
+
cd "${app_path}"
|
31
|
+
unbundled bundle install
|
32
|
+
cd "${root_path}"
|
33
|
+
else
|
34
|
+
echo "~~> Creating rails ${app_name}"
|
35
|
+
rails _${rails_version}_ new ${app_name} \
|
36
|
+
--database=${DB:-sqlite3} \
|
37
|
+
--skip-git \
|
38
|
+
--skip-rc
|
39
|
+
|
40
|
+
cd "$app_path"
|
41
|
+
unbundled bundle add listen --group development
|
42
|
+
unbundled bundle add solidus --github solidusio/solidus --branch "${BRANCH:-master}" --version '> 0.a'
|
43
|
+
unbundled bundle exec rake db:drop db:create
|
44
|
+
unbundled bundle exec rails generate solidus:install --auto-accept --payment-method=none
|
45
|
+
cd "${root_path}"
|
46
|
+
|
47
|
+
echo "~~> Creating rails ${app_name} cache"
|
48
|
+
rm -rf ${app_name}/tmp/solidus_starter_frontend*
|
49
|
+
zip -q -r "${cache_path}" ${app_name}
|
50
|
+
fi
|
51
|
+
|
52
|
+
if [ ! -d "${app_name}" ]; then
|
53
|
+
echo '~~> Creation of the ${app_name} rails application failed'
|
54
|
+
exit 1
|
55
|
+
fi
|
data/bin/rails-sandbox
CHANGED
@@ -1,16 +1,3 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
unless File.exist? "#{app_root}/bin/rails"
|
6
|
-
warn 'Creating the sandbox app...'
|
7
|
-
Dir.chdir "#{__dir__}/.." do
|
8
|
-
system "#{__dir__}/sandbox" or begin
|
9
|
-
warn 'Automatic creation of the sandbox app failed'
|
10
|
-
exit 1
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
Dir.chdir app_root
|
16
|
-
exec 'bin/rails', *ARGV
|
3
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "sandbox", *ARGV
|
data/bin/rspec
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
system(
|
3
|
+
"bin/rails dummy-app generate solidus_stripe:install --force --migrate --specs=all --sync --no-load-seeds",
|
4
|
+
out: "tmp/rspec-sync.log",
|
5
|
+
err: :out,
|
6
|
+
) or abort(File.read("tmp/rspec-sync.log"))
|
7
|
+
|
8
|
+
system("bin/update-migrations", "dummy-app") unless ENV['CI']
|
9
|
+
Dir.chdir "dummy-app/"
|
10
|
+
exec "bundle", "exec", "rspec", *ARGV
|
data/bin/sandbox
CHANGED
@@ -2,85 +2,23 @@
|
|
2
2
|
|
3
3
|
set -e
|
4
4
|
|
5
|
-
case "$DB" in
|
6
|
-
postgres|postgresql)
|
7
|
-
RAILSDB="postgresql"
|
8
|
-
;;
|
9
|
-
mysql)
|
10
|
-
RAILSDB="mysql"
|
11
|
-
;;
|
12
|
-
sqlite|'')
|
13
|
-
RAILSDB="sqlite3"
|
14
|
-
;;
|
15
|
-
*)
|
16
|
-
echo "Invalid DB specified: $DB"
|
17
|
-
exit 1
|
18
|
-
;;
|
19
|
-
esac
|
20
|
-
|
21
|
-
if [ ! -z $SOLIDUS_BRANCH ]
|
22
|
-
then
|
23
|
-
BRANCH=$SOLIDUS_BRANCH
|
24
|
-
else
|
25
|
-
BRANCH="master"
|
26
|
-
fi
|
27
|
-
|
28
5
|
extension_name="solidus_stripe"
|
6
|
+
app_name="sandbox"
|
7
|
+
|
8
|
+
bin/rails-new "$app_name"
|
29
9
|
|
30
10
|
# Stay away from the bundler env of the containing extension.
|
31
11
|
function unbundled {
|
32
|
-
|
12
|
+
echo "~~> Running: $@"
|
13
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
33
14
|
}
|
34
15
|
|
35
|
-
|
36
|
-
unbundled bundle
|
37
|
-
|
38
|
-
--skip-git \
|
39
|
-
--skip-keeps \
|
40
|
-
--skip-rc \
|
41
|
-
--skip-spring \
|
42
|
-
--skip-test \
|
43
|
-
--skip-javascript
|
16
|
+
cd "./$app_name"
|
17
|
+
unbundled bundle add $extension_name --path ..
|
18
|
+
unbundled bundle exec rails generate $extension_name:install --migrate --specs=all
|
44
19
|
|
45
|
-
if [
|
46
|
-
echo
|
47
|
-
|
20
|
+
if [[ -n "$SOLIDUS_STRIPE_API_KEY" ]]; then
|
21
|
+
echo "~~> Creating the stripe payment method using env credentials..."
|
22
|
+
unbundled bundle exec rails runner \
|
23
|
+
'p SolidusStripe::PaymentMethod.create!(name: "SolidusStripe", preference_source: "solidus_stripe_env_credentials", position: -1)'
|
48
24
|
fi
|
49
|
-
|
50
|
-
cd ./sandbox
|
51
|
-
cat <<RUBY >> Gemfile
|
52
|
-
gem 'solidus', github: 'solidusio/solidus', branch: '$BRANCH'
|
53
|
-
gem 'solidus_auth_devise', '>= 2.1.0'
|
54
|
-
gem 'rails-i18n'
|
55
|
-
gem 'solidus_i18n'
|
56
|
-
|
57
|
-
gem '$extension_name', path: '..'
|
58
|
-
|
59
|
-
group :test, :development do
|
60
|
-
platforms :mri do
|
61
|
-
gem 'pry-byebug'
|
62
|
-
end
|
63
|
-
end
|
64
|
-
RUBY
|
65
|
-
|
66
|
-
unbundled bundle install --gemfile Gemfile
|
67
|
-
|
68
|
-
unbundled bundle exec rake db:drop db:create
|
69
|
-
|
70
|
-
unbundled bundle exec rails generate spree:install \
|
71
|
-
--auto-accept \
|
72
|
-
--user_class=Spree::User \
|
73
|
-
--enforce_available_locales=true \
|
74
|
-
--with-authentication=false \
|
75
|
-
--payment-method=none \
|
76
|
-
$@
|
77
|
-
|
78
|
-
unbundled bundle exec rails generate solidus:auth:install
|
79
|
-
unbundled bundle exec rails generate ${extension_name}:install
|
80
|
-
|
81
|
-
echo
|
82
|
-
echo "🚀 Sandbox app successfully created for $extension_name!"
|
83
|
-
echo "🚀 Using $RAILSDB and Solidus $BRANCH"
|
84
|
-
echo "🚀 Use 'export DB=[postgres|mysql|sqlite]' to control the DB adapter"
|
85
|
-
echo "🚀 Use 'export SOLIDUS_BRANCH=<BRANCH-NAME>' to control the Solidus version"
|
86
|
-
echo "🚀 This app is intended for test purposes."
|
data/bin/setup
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
app = ARGV.shift || abort("Please provide the APP_NAME as the first argument")
|
4
|
+
extension_name = "solidus_stripe"
|
5
|
+
|
6
|
+
source_migrations = {}
|
7
|
+
Dir['db/migrate/*.rb'].sort.each do |path|
|
8
|
+
basename = File.basename(path, ".rb").sub(/^\d+_/, '')
|
9
|
+
source_migrations[basename] = path
|
10
|
+
end
|
11
|
+
|
12
|
+
app_migrations = {}
|
13
|
+
Dir["#{app}/db/migrate/*.#{extension_name}.rb"].sort.each do |path|
|
14
|
+
_timestamp, basename = File.basename(path, ".#{extension_name}.rb").split('_', 2)
|
15
|
+
app_migrations[basename] = path
|
16
|
+
end
|
17
|
+
|
18
|
+
migrate_app = -> do
|
19
|
+
puts "migrating #{app}..."
|
20
|
+
Dir.chdir(app) { system("bin/rails db:migrate RAILS_ENV=test") }
|
21
|
+
end
|
22
|
+
|
23
|
+
base_time = Time.now.utc.to_i
|
24
|
+
install_migration = ->(basename) do
|
25
|
+
path = source_migrations[basename]
|
26
|
+
base_time += 1
|
27
|
+
puts "installing #{basename}..."
|
28
|
+
timestamp = Time.at(base_time).strftime("%F%T").delete('-:') # rubocop:disable Rails/TimeZone
|
29
|
+
contents = File.read(path)
|
30
|
+
|
31
|
+
File.write("#{app}/db/migrate/#{timestamp}_#{basename}.#{extension_name}.rb", contents)
|
32
|
+
end
|
33
|
+
|
34
|
+
reinstall_migrations = -> do
|
35
|
+
app_migrations.each_value { |path| File.delete(path) }
|
36
|
+
Dir["#{app}/db/*{.sqlite3,schema.rb}"].each { File.delete(_1) }
|
37
|
+
source_migrations.each_key(&install_migration)
|
38
|
+
migrate_app.call
|
39
|
+
end
|
40
|
+
|
41
|
+
exit reinstall_migrations.call if ARGV.shift == "--force"
|
42
|
+
|
43
|
+
app_migrations.each_key do |basename|
|
44
|
+
source_content = File.read(source_migrations[basename]) if source_migrations[basename]
|
45
|
+
app_content = File.read(app_migrations[basename])
|
46
|
+
|
47
|
+
next if source_content == app_content
|
48
|
+
|
49
|
+
reinstall_migrations.call
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
53
|
+
if (missing_migrations = source_migrations.keys - app_migrations.keys).any?
|
54
|
+
missing_migrations.each(&install_migration)
|
55
|
+
migrate_app.call
|
56
|
+
end
|
data/codecov.yml
ADDED
data/config/locales/en.yml
CHANGED
@@ -2,4 +2,19 @@
|
|
2
2
|
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
3
|
|
4
4
|
en:
|
5
|
-
|
5
|
+
solidus_stripe:
|
6
|
+
loading: "Loading..."
|
7
|
+
|
8
|
+
intent_status: &intent_status
|
9
|
+
canceled: "Your payment has been canceled."
|
10
|
+
processing: "Your payment is processing."
|
11
|
+
requires_action: "Some action is needed on your payment before proceeding."
|
12
|
+
requires_capture: "Payment successfully authorized!"
|
13
|
+
requires_confirmation: "Please confirm the payment in order to proceed."
|
14
|
+
requires_payment_method: "Your payment was not successful, please try again."
|
15
|
+
succeeded: "Payment succeeded!"
|
16
|
+
|
17
|
+
activerecord:
|
18
|
+
models:
|
19
|
+
solidus_stripe/payment_source: Solidus Stripe Payment Source
|
20
|
+
solidus_stripe/payment_method: Solidus Stripe Payment Method
|
data/config/routes.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
post '/stripe/create_intent', to: '/solidus_stripe/intents#create_intent'
|
9
|
-
post '/stripe/create_payment', to: '/solidus_stripe/intents#create_payment'
|
10
|
-
|
11
|
-
# payment request routes:
|
12
|
-
post '/stripe/shipping_rates', to: '/solidus_stripe/payment_request#shipping_rates'
|
13
|
-
post '/stripe/update_order', to: '/solidus_stripe/payment_request#update_order'
|
3
|
+
SolidusStripe::Engine.routes.draw do
|
4
|
+
scope ':slug' do
|
5
|
+
get :after_confirmation, to: 'intents#after_confirmation'
|
6
|
+
post :webhooks, to: 'webhooks#create', format: false
|
7
|
+
end
|
14
8
|
end
|
data/coverage.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'coverage'
|
4
|
+
require 'simplecov'
|
5
|
+
|
6
|
+
SimpleCov.root File.expand_path(__dir__)
|
7
|
+
|
8
|
+
if ENV['CODECOV_TOKEN']
|
9
|
+
require 'simplecov-cobertura'
|
10
|
+
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
12
|
+
SimpleCov::Formatter::CoberturaFormatter,
|
13
|
+
SimpleCov.formatter,
|
14
|
+
])
|
15
|
+
else
|
16
|
+
warn "Provide a CODECOV_TOKEN environment variable to enable Codecov uploads"
|
17
|
+
end
|
18
|
+
|
19
|
+
def (SimpleCov::ResultAdapter).call(result)
|
20
|
+
result = result.transform_keys do |path|
|
21
|
+
template_path = path.sub(
|
22
|
+
"#{SimpleCov.root}/dummy-app/",
|
23
|
+
"#{SimpleCov.root}/lib/generators/solidus_stripe/install/templates/"
|
24
|
+
)
|
25
|
+
File.exist?(template_path) ? template_path : path
|
26
|
+
end
|
27
|
+
result.each do |path, coverage|
|
28
|
+
next unless path.end_with?('.erb')
|
29
|
+
|
30
|
+
# Remove the extra trailing lines added by ERB
|
31
|
+
coverage[:lines] = coverage[:lines][...File.read(path).lines.size]
|
32
|
+
end
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
warn "Tracking coverage on process #{$$}..."
|
37
|
+
SimpleCov.start do
|
38
|
+
root __dir__
|
39
|
+
enable_coverage_for_eval
|
40
|
+
add_filter %r{dummy-app/(db|config|spec|tmp)/}
|
41
|
+
track_files "#{SimpleCov.root}/{dummy-app,lib,app}/**/*.{rb,erb}}"
|
42
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateSolidusStripeSetupIntent < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :solidus_stripe_setup_intents do |t|
|
4
|
+
t.string :stripe_setup_intent_id
|
5
|
+
t.references :order, null: false, foreign_key: { to_table: :spree_orders }
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateSolidusStripePaymentIntents < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :solidus_stripe_payment_intents do |t|
|
4
|
+
t.string :stripe_payment_intent_id
|
5
|
+
t.references :order, null: false, foreign_key: { to_table: :spree_orders }
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateSolidusStripeWebhookEndpoints < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :solidus_stripe_webhook_endpoints do |t|
|
4
|
+
t.references :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
5
|
+
t.string :slug, null: false, index: { unique: true }
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class AddPaymentMethodReferenceToStripeIntents < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
add_reference :solidus_stripe_setup_intents, :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
4
|
+
add_reference :solidus_stripe_payment_intents, :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class NormalizeStripeIntentIdAttributes < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
rename_column :solidus_stripe_payment_intents, :stripe_payment_intent_id, :stripe_intent_id
|
4
|
+
rename_column :solidus_stripe_setup_intents, :stripe_setup_intent_id, :stripe_intent_id
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateSolidusStripeCustomers < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :solidus_stripe_customers do |t|
|
4
|
+
t.references :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
5
|
+
|
6
|
+
t.string :source_type
|
7
|
+
t.integer :source_id
|
8
|
+
|
9
|
+
t.string :stripe_id, index: true
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
|
13
|
+
t.index [:payment_method_id, :source_type, :source_id], unique: true, name: :payment_method_and_source
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class DropSolidusStripeSetupIntent < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
drop_table "solidus_stripe_setup_intents", force: :cascade do |t|
|
4
|
+
t.string "stripe_intent_id"
|
5
|
+
t.integer "order_id", null: false
|
6
|
+
t.datetime "created_at", null: false
|
7
|
+
t.datetime "updated_at", null: false
|
8
|
+
t.integer "payment_method_id", null: false
|
9
|
+
t.index ["order_id"], name: "index_solidus_stripe_setup_intents_on_order_id"
|
10
|
+
t.index ["payment_method_id"], name: "index_solidus_stripe_setup_intents_on_payment_method_id"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/db/seeds.rb
CHANGED
@@ -1,26 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# frozen-string-literal: true
|
2
2
|
|
3
|
-
|
4
|
-
publishable_key = ENV['STRIPE_SEEDS_PUBLISHABLE_KEY']
|
3
|
+
require "solidus_stripe/seeds"
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
else
|
11
|
-
stripe_payment_method = Spree::PaymentMethod::StripeCreditCard.new do |payment_method|
|
12
|
-
payment_method.name = 'Credit Card'
|
13
|
-
payment_method.preferred_test_mode = true
|
14
|
-
payment_method.preferred_secret_key = secret_key
|
15
|
-
payment_method.preferred_publishable_key = publishable_key
|
16
|
-
end
|
17
|
-
|
18
|
-
if stripe_payment_method.save
|
19
|
-
puts "Stripe Payment Method correctly created."
|
20
|
-
else
|
21
|
-
puts "There was some problems with creating Stripe Payment Method:"
|
22
|
-
stripe_payment_method.errors.full_messages.each do |error|
|
23
|
-
puts error
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
5
|
+
# rubocop:disable Rails/Output
|
6
|
+
puts "Creating refund reason for Stripe refunds"
|
7
|
+
SolidusStripe::Seeds.refund_reasons
|
8
|
+
# rubocop:enable Rails/Output
|