bullet_train-integrations-stripe 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/bullet_train_integrations_stripe_manifest.js +0 -0
  6. data/app/controllers/account/integrations/stripe_installations_controller.rb +80 -0
  7. data/app/controllers/account/oauth/stripe_accounts_controller.rb +60 -0
  8. data/app/controllers/webhooks/incoming/oauth/stripe_account_webhooks_controller.rb +22 -0
  9. data/app/models/integrations/stripe_installation.rb +29 -0
  10. data/app/models/oauth/stripe_account.rb +53 -0
  11. data/app/models/webhooks/incoming/oauth/stripe_account_webhook.rb +33 -0
  12. data/app/views/account/integrations/stripe_installations/_breadcrumbs.html.erb +8 -0
  13. data/app/views/account/integrations/stripe_installations/_form.html.erb +18 -0
  14. data/app/views/account/integrations/stripe_installations/_index.html.erb +59 -0
  15. data/app/views/account/integrations/stripe_installations/_list.html.erb +34 -0
  16. data/app/views/account/integrations/stripe_installations/_menu_item.html.erb +10 -0
  17. data/app/views/account/integrations/stripe_installations/_stripe_installation.json.jbuilder +8 -0
  18. data/app/views/account/integrations/stripe_installations/edit.html.erb +12 -0
  19. data/app/views/account/integrations/stripe_installations/index.html.erb +6 -0
  20. data/app/views/account/integrations/stripe_installations/index.json.jbuilder +1 -0
  21. data/app/views/account/integrations/stripe_installations/new.html.erb +12 -0
  22. data/app/views/account/integrations/stripe_installations/show.html.erb +27 -0
  23. data/app/views/account/integrations/stripe_installations/show.json.jbuilder +1 -0
  24. data/app/views/account/oauth/stripe_accounts/_breadcrumbs.html.erb +8 -0
  25. data/app/views/account/oauth/stripe_accounts/_form.html.erb +14 -0
  26. data/app/views/account/oauth/stripe_accounts/_index.html.erb +52 -0
  27. data/app/views/account/oauth/stripe_accounts/_menu_item.html.erb +10 -0
  28. data/app/views/account/oauth/stripe_accounts/_oauth_stripe_account.json.jbuilder +7 -0
  29. data/app/views/account/oauth/stripe_accounts/edit.html.erb +12 -0
  30. data/app/views/account/oauth/stripe_accounts/index.html.erb +6 -0
  31. data/app/views/account/oauth/stripe_accounts/index.json.jbuilder +1 -0
  32. data/app/views/account/oauth/stripe_accounts/show.html.erb +19 -0
  33. data/app/views/account/oauth/stripe_accounts/show.json.jbuilder +1 -0
  34. data/app/views/devise/shared/oauth/_stripe.html.erb +8 -0
  35. data/config/locales/en/integrations/stripe_installations.en.yml +90 -0
  36. data/config/locales/en/oauth/stripe_accounts.en.yml +66 -0
  37. data/config/routes.rb +26 -0
  38. data/db/migrate/20180706214509_create_oauth_stripe_accounts.rb +12 -0
  39. data/db/migrate/20190310235546_create_webhooks_incoming_stripe_webhooks.rb +11 -0
  40. data/db/migrate/20190330195809_create_webhooks_incoming_oauth_stripe_account_webhooks.rb +12 -0
  41. data/db/migrate/20210316215919_create_integrations_stripe_installations.rb +11 -0
  42. data/db/migrate/20210316220614_migrate_team_connected_oauth_stripe_accounts.rb +13 -0
  43. data/db/migrate/20210316220615_remove_team_id_from_oauth_stripe_account.rb +5 -0
  44. data/db/migrate/20210317150916_add_uid_uniqueness_to_oauth_stripe_accounts.rb +5 -0
  45. data/db/migrate/20211018173808_drop_webhooks_incoming_stripe_webhooks.rb +11 -0
  46. data/lib/bullet_train/integrations/stripe/engine.rb +8 -0
  47. data/lib/bullet_train/integrations/stripe/version.rb +7 -0
  48. data/lib/bullet_train/integrations/stripe.rb +10 -0
  49. data/lib/tasks/bullet_train/integrations/stripe_tasks.rake +4 -0
  50. metadata +107 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 601ccfba8cfe6ad2c8291a15d288076eae7936ac68184672cac9bc141652f181
4
+ data.tar.gz: 3b2e87456e3693a997a93f549bbb834341a4d8eabaf21367b5ec2d4e75ca80d8
5
+ SHA512:
6
+ metadata.gz: b7098328420c44ed0eedd22dc400fdc29663c149d9b59131965e397a8f4cb27efba901b0e6f7433bce515abb2a8f9aa596e4b984ebdecd6418ed26b03f9ffa01
7
+ data.tar.gz: ea5411f17822836316a664c21db3ff6e170fb96747536a42617c759909d8e299762721796caa1fc233670effd5e1000f213784f406d6e1d2217728d52e4f749a
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 Andrew Culver
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # BulletTrain::Integrations::Stripe
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem "bullet_train-integrations-stripe"
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install bullet_train-integrations-stripe
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
@@ -0,0 +1,80 @@
1
+ class Account::Integrations::StripeInstallationsController < Account::ApplicationController
2
+ account_load_and_authorize_resource :stripe_installation, through: :team, through_association: :integrations_stripe_installations
3
+
4
+ # GET /account/teams/:team_id/integrations/stripe_installations
5
+ # GET /account/teams/:team_id/integrations/stripe_installations.json
6
+ def index
7
+ # if you only want these objects shown on their parent's show page, uncomment this:
8
+ # redirect_to [:account, @team]
9
+ end
10
+
11
+ # GET /account/integrations/stripe_installations/:id
12
+ # GET /account/integrations/stripe_installations/:id.json
13
+ def show
14
+ end
15
+
16
+ # GET /account/teams/:team_id/integrations/stripe_installations/new
17
+ def new
18
+ end
19
+
20
+ # GET /account/integrations/stripe_installations/:id/edit
21
+ def edit
22
+ end
23
+
24
+ # POST /account/teams/:team_id/integrations/stripe_installations
25
+ # POST /account/teams/:team_id/integrations/stripe_installations.json
26
+ def create
27
+ respond_to do |format|
28
+ if @stripe_installation.save
29
+ format.html { redirect_to [:account, @team, :integrations_stripe_installations], notice: I18n.t("integrations/stripe_installations.notifications.created") }
30
+ format.json { render :show, status: :created, location: [:account, @stripe_installation] }
31
+ else
32
+ format.html { render :new, status: :unprocessable_entity }
33
+ format.json { render json: @stripe_installation.errors, status: :unprocessable_entity }
34
+ end
35
+ end
36
+ end
37
+
38
+ # PATCH/PUT /account/integrations/stripe_installations/:id
39
+ # PATCH/PUT /account/integrations/stripe_installations/:id.json
40
+ def update
41
+ respond_to do |format|
42
+ if @stripe_installation.update(stripe_installation_params)
43
+ format.html { redirect_to [:account, @stripe_installation], notice: I18n.t("integrations/stripe_installations.notifications.updated") }
44
+ format.json { render :show, status: :ok, location: [:account, @stripe_installation] }
45
+ else
46
+ format.html { render :edit, status: :unprocessable_entity }
47
+ format.json { render json: @stripe_installation.errors, status: :unprocessable_entity }
48
+ end
49
+ end
50
+ end
51
+
52
+ # DELETE /account/integrations/stripe_installations/:id
53
+ # DELETE /account/integrations/stripe_installations/:id.json
54
+ def destroy
55
+ @stripe_installation.destroy
56
+ respond_to do |format|
57
+ format.html { redirect_to params[:return_to] || [:account, @team, :integrations_stripe_installations], notice: I18n.t("integrations/stripe_installations.notifications.destroyed") }
58
+ format.json { head :no_content }
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # Never trust parameters from the scary internet, only allow the white list through.
65
+ def stripe_installation_params
66
+ strong_params = params.require(:integrations_stripe_installation).permit(
67
+ :name,
68
+ # 🚅 super scaffolding will insert new fields above this line.
69
+ multiple_button_values: [],
70
+ multiple_super_select_values: [],
71
+ # 🚅 super scaffolding will insert new arrays above this line.
72
+ )
73
+
74
+ assign_checkboxes(strong_params, :multiple_button_values)
75
+ assign_select_options(strong_params, :multiple_super_select_values)
76
+ # 🚅 super scaffolding will insert processing for new fields above this line.
77
+
78
+ strong_params
79
+ end
80
+ end
@@ -0,0 +1,60 @@
1
+ class Account::Oauth::StripeAccountsController < Account::ApplicationController
2
+ account_load_and_authorize_resource :stripe_account, through: :user, through_association: :oauth_stripe_accounts
3
+
4
+ # GET /account/users/:user_id/oauth/stripe_accounts
5
+ # GET /account/users/:user_id/oauth/stripe_accounts.json
6
+ def index
7
+ redirect_to [:edit, :account, @user]
8
+ end
9
+
10
+ # GET /account/oauth/stripe_accounts/:id
11
+ # GET /account/oauth/stripe_accounts/:id.json
12
+ def show
13
+ unless @stripe_account.integrations_stripe_installations.any?
14
+ redirect_to [:edit, :account, @user]
15
+ end
16
+ end
17
+
18
+ # GET /account/users/:user_id/oauth/stripe_accounts/new
19
+ def new
20
+ end
21
+
22
+ # GET /account/oauth/stripe_accounts/:id/edit
23
+ def edit
24
+ end
25
+
26
+ # PATCH/PUT /account/oauth/stripe_accounts/:id
27
+ # PATCH/PUT /account/oauth/stripe_accounts/:id.json
28
+ def update
29
+ respond_to do |format|
30
+ if @stripe_account.update(stripe_account_params)
31
+ format.html { redirect_to [:account, @stripe_account], notice: I18n.t("oauth/stripe_accounts.notifications.updated") }
32
+ format.json { render :show, status: :ok, location: [:account, @stripe_account] }
33
+ else
34
+ format.html { render :edit, status: :unprocessable_entity }
35
+ format.json { render json: @stripe_account.errors, status: :unprocessable_entity }
36
+ end
37
+ end
38
+ end
39
+
40
+ # DELETE /account/oauth/stripe_accounts/:id
41
+ # DELETE /account/oauth/stripe_accounts/:id.json
42
+ def destroy
43
+ @stripe_account.update(user: nil)
44
+ respond_to do |format|
45
+ format.html { redirect_to [:account, @user, :oauth, :stripe_accounts], notice: I18n.t("oauth/stripe_accounts.notifications.destroyed") }
46
+ format.json { head :no_content }
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ # Never trust parameters from the scary internet, only allow the white list through.
53
+ def stripe_account_params
54
+ params.require(:oauth_stripe_account).permit
55
+ # 🚅 super scaffolding will insert new fields above this line.
56
+ # 🚅 super scaffolding will insert new arrays above this line.
57
+
58
+ # 🚅 super scaffolding will insert processing for new fields above this line.
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ class Webhooks::Incoming::Oauth::StripeAccountWebhooksController < Webhooks::Incoming::WebhooksController
2
+ def create
3
+ # we have to validate stripe webhooks based on the text content of their payload,
4
+ # so we have to do it before we convert it to json in the database.
5
+ payload = request.body.read
6
+
7
+ # this throws an exception if the signature is invalid.
8
+ Stripe::Webhook.construct_event(
9
+ payload,
10
+ request.env["HTTP_STRIPE_SIGNATURE"],
11
+ ENV["STRIPE_WEBHOOKS_ACCOUNTS_ENDPOINT_SECRET"]
12
+ )
13
+
14
+ Webhooks::Incoming::Oauth::StripeAccountWebhook.create(
15
+ data: JSON.parse(payload),
16
+ # we can mark this webhook as verified because we authenticated it earlier in this controller.
17
+ verified_at: Time.zone.now
18
+ ).process_async
19
+
20
+ render json: {status: "OK"}, status: :created
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ class Integrations::StripeInstallation < ApplicationRecord
2
+ # 🚅 add concerns above.
3
+
4
+ belongs_to :team
5
+ belongs_to :oauth_stripe_account, class_name: "Oauth::StripeAccount"
6
+ # 🚅 add belongs_to associations above.
7
+
8
+ # 🚅 add has_many associations above.
9
+
10
+ # 🚅 add has_one associations above.
11
+
12
+ # 🚅 add scopes above.
13
+
14
+ validates :name, presence: true
15
+ # 🚅 add validations above.
16
+
17
+ # 🚅 add callbacks above.
18
+
19
+ # 🚅 add delegations above.
20
+
21
+ def process_webhook(webhook)
22
+ # consider using transactions here. if an error occurs in the processing of a webhook, it's not like user-facing
23
+ # errors on the web where they see a red screen of death. instead, sidekiq will reattempt the processing of the
24
+ # entire webhook, which means that earlier portions of your logic will be run more than once unless you're careful
25
+ # to avoid it.
26
+ end
27
+
28
+ # 🚅 add methods above.
29
+ end
@@ -0,0 +1,53 @@
1
+ class Oauth::StripeAccount < ApplicationRecord
2
+ # 🚅 add concerns above.
3
+
4
+ belongs_to :user, optional: true
5
+ # 🚅 add belongs_to associations above.
6
+
7
+ has_many :webhooks_incoming_oauth_stripe_account_webhooks, class_name: "Webhooks::Incoming::Oauth::StripeAccountWebhook", foreign_key: "oauth_stripe_account_id"
8
+ has_many :integrations_stripe_installations, class_name: "Integrations::StripeInstallation", foreign_key: "oauth_stripe_account_id"
9
+ # 🚅 add has_many associations above.
10
+
11
+ # 🚅 add has_one associations above.
12
+
13
+ # 🚅 add scopes above.
14
+
15
+ validates :uid, presence: true
16
+ # 🚅 add validations above.
17
+
18
+ # 🚅 add callbacks above.
19
+
20
+ # 🚅 add delegations above.
21
+
22
+ def label_string
23
+ name
24
+ end
25
+
26
+ # TODO You should update this with an implementation appropriate for the provider you're integrating with.
27
+ # This must return _something_, otherwise new installations won't save.
28
+ def name
29
+ data.dig("info", "name").presence || "Stripe Account"
30
+ rescue
31
+ "Stripe Account"
32
+ end
33
+
34
+ def name_was
35
+ name
36
+ end
37
+
38
+ def update_from_oauth(auth)
39
+ self.uid = auth.uid
40
+ self.data = auth
41
+ save
42
+ end
43
+
44
+ # webhooks received for this account will be routed here asynchronously for processing on a worker.
45
+ def process_webhook(webhook)
46
+ # we delegate processing to any active installations.
47
+ integrations_stripe_installations.order(:id).each do |installation|
48
+ installation.process_webhook(webhook)
49
+ end
50
+ end
51
+
52
+ # 🚅 add methods above.
53
+ end
@@ -0,0 +1,33 @@
1
+ class Webhooks::Incoming::Oauth::StripeAccountWebhook < ApplicationRecord
2
+ include Webhooks::Incoming::Webhook
3
+
4
+ belongs_to :oauth_stripe_account, class_name: "Oauth::StripeAccount", optional: true
5
+
6
+ def process
7
+ # if this is a stripe connect webhook ..
8
+ if data["account"]
9
+
10
+ # if we're able to find an account in our system that this webhook should be routed to ..
11
+ if (self.oauth_stripe_account = Oauth::StripeAccount.find_by(uid: data["account"]))
12
+
13
+ # save the reference to the account.
14
+ save
15
+
16
+ # delegate processing to that account.
17
+ oauth_stripe_account.process_webhook(self)
18
+
19
+ end
20
+
21
+ # if we didn't find an account for the webhook, they've probably deleted their account. we'll just ignore it for
22
+ # now, but it's still in our database for debugging purposes. we'll probably want to send a request to stripe
23
+ # in order to disconnect their account from our application so we stop receiving webhooks.
24
+
25
+ else
26
+
27
+ # it's possible we're receiving a general webhook that isn't specific to an account.
28
+ # however, we want to know about these, so raise an error.
29
+ raise "received a webhook we weren't expecting"
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,8 @@
1
+ <% stripe_installation ||= @stripe_installation %>
2
+ <% team ||= @team || stripe_installation&.team %>
3
+ <%= render 'account/teams/breadcrumbs', team: team %>
4
+ <%= render 'account/shared/breadcrumb', label: t('.label'), url: [:account, team, :integrations_stripe_installations] %>
5
+ <% if stripe_installation&.persisted? %>
6
+ <%= render 'account/shared/breadcrumb', label: stripe_installation.label_string, url: [:account, stripe_installation] %>
7
+ <% end %>
8
+ <%= render 'account/shared/breadcrumbs/actions', only_for: 'integrations/stripe_installations' %>
@@ -0,0 +1,18 @@
1
+ <%= form_with model: stripe_installation, url: (stripe_installation.persisted? ? [:account, stripe_installation] : [:account, @team, :integrations_stripe_installations]), local: true, class: 'form' do |form| %>
2
+ <%= render 'account/shared/forms/errors', form: form %>
3
+
4
+ <% with_field_settings form: form do %>
5
+ <%= render 'shared/fields/text_field', method: :name, options: {autofocus: true} %>
6
+ <%# 🚅 super scaffolding will insert new fields above this line. %>
7
+ <% end %>
8
+
9
+ <div class="buttons">
10
+ <%= form.submit (form.object.persisted? ? t('.buttons.update') : t('.buttons.create')), class: "button" %>
11
+ <% if form.object.persisted? %>
12
+ <%= link_to t('global.buttons.cancel'), [:account, stripe_installation], class: "button-secondary" %>
13
+ <% else %>
14
+ <%= link_to t('global.buttons.cancel'), [:account, @team, :integrations_stripe_installations], class: "button-secondary" %>
15
+ <% end %>
16
+ </div>
17
+
18
+ <% end %>
@@ -0,0 +1,59 @@
1
+ <% team = @team || @team %>
2
+ <% context ||= team %>
3
+ <% collection ||= :integrations_stripe_installations %>
4
+ <% hide_actions ||= false %>
5
+ <% hide_back ||= false %>
6
+
7
+ <%= render 'account/shared/box' do |p| %>
8
+ <% p.content_for :title, t(".contexts.#{context.class.name.underscore}.header") %>
9
+ <% p.content_for :description do %>
10
+ <%= t(".contexts.#{context.class.name.underscore}.description") %>
11
+ <% end %>
12
+
13
+ <% p.content_for :body do %>
14
+ <% if stripe_installations.any? %>
15
+ <div class="space-y-0 border border-gray-200 shadow-sm rounded-md divide-y divide-gray-200">
16
+ <% stripe_installations.each do |stripe_installation| %>
17
+ <div class="flex py-1.5 px-3 items-center">
18
+ <div class="flex-1 min-w-0">
19
+ <%= stripe_installation.name %>
20
+ </div>
21
+ <div class="flex flex-0 min-w-0 space-x-2 items-center">
22
+ <% if can? :edit, stripe_installation %>
23
+ <%= link_to t('.buttons.shorthand.edit'), [:edit, :account, stripe_installation], class: 'button-secondary button-smaller' %>
24
+ <% end %>
25
+
26
+ <% if can? :destroy, stripe_installation %>
27
+ <%= link_to [:account, stripe_installation, return_to: request.path], method: :delete, data: { confirm: t('.buttons.confirmations.destroy_from_user', team_name: stripe_installation.team.label_string) }, class: 'inline-block text-gray-300 hover:text-gray-400 hover:no-underline text-lg' do %>
28
+ <i class="ti ti-close"></i>
29
+ <% end %>
30
+ <% end %>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ </div>
35
+ <% end %>
36
+ <% end %>
37
+
38
+ <% p.content_for :actions do %>
39
+ <% unless hide_actions %>
40
+ <% if context == team %>
41
+ <% if can? :create, Integrations::StripeInstallation.new(team: team) %>
42
+ <span data-turbo="false">
43
+ <%= button_to user_stripe_connect_omniauth_authorize_path(team_id: team.id), class: "#{first_button_primary(:integrations_stripe_installation)} new" do %>
44
+ <%= t('.buttons.new') %>
45
+ <% end %>
46
+ </span>
47
+ <% end %>
48
+ <% end %>
49
+
50
+ <% unless hide_back %>
51
+ <%= link_to t('global.buttons.back'), [:account, context], class: "#{first_button_primary(:integrations_stripe_installation)} back" %>
52
+ <% end %>
53
+ <% end %>
54
+ <% end %>
55
+
56
+ <% p.content_for :footer do %>
57
+ <%= raw t(".contexts.team.authentication_note", authentication_url: url_for([:edit, :account, current_user])) %>
58
+ <% end %>
59
+ <% end %>
@@ -0,0 +1,34 @@
1
+ <% context ||= @user %>
2
+ <% collection ||= :integrations_stripe_installations %>
3
+
4
+ <%= render 'account/shared/box' do |p| %>
5
+ <% p.content_for :title, t(".contexts.#{context.class.name.underscore}.header") %>
6
+ <% p.content_for :description do %>
7
+ <%= t(".contexts.#{context.class.name.underscore}.description") %>
8
+ <% end %>
9
+
10
+ <% p.content_for :body do %>
11
+ <% if stripe_installations.any? %>
12
+ <div class="space-y-0 border border-gray-200 shadow-sm rounded-md divide-y divide-gray-200">
13
+ <% stripe_installations.each do |stripe_installation| %>
14
+ <div class="flex py-1.5 px-3 items-center">
15
+ <div class="flex-1 min-w-0">
16
+ <% if can? :show, stripe_installation.team %>
17
+ <%= link_to stripe_installation.team.name, [:account, stripe_installation.team, :integrations, :stripe_installations] %>
18
+ <% else %>
19
+ <%= stripe_installation.team.name %>
20
+ <% end %>
21
+ </div>
22
+ <div class="flex-0 min-w-0 space-x-2 text-lg">
23
+ <% if can? :destroy, stripe_installation %>
24
+ <%= link_to [:account, stripe_installation, return_to: request.path], method: :delete, data: { confirm: t('.buttons.confirmations.destroy_from_user', team_name: stripe_installation.team.label_string) }, class: 'inline-block text-gray-300 hover:text-gray-400 hover:no-underline' do %>
25
+ <i class="ti ti-close"></i>
26
+ <% end %>
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ <% end %>
33
+ <% end %>
34
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <% if can? :read, Integrations::StripeInstallation.new(team: current_team) %>
2
+ <%= render 'account/shared/menu/item', {
3
+ url: main_app.polymorphic_path([:account, current_team, :integrations_stripe_installations]),
4
+ label: t('integrations/stripe_installations.navigation.label'),
5
+ } do |p| %>
6
+ <% p.content_for :icon do %>
7
+ <i class="<%= t('integrations/stripe_installations.navigation.icon') %>"></i>
8
+ <% end %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,8 @@
1
+ json.extract! stripe_installation,
2
+ :id,
3
+ :team_id,
4
+ :name,
5
+ # 🚅 super scaffolding will insert new fields above this line.
6
+ :created_at,
7
+ :updated_at
8
+ json.url account_integrations_stripe_installation_url(stripe_installation, format: :json)
@@ -0,0 +1,12 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'account/shared/box', divider: true do |p| %>
5
+ <% p.content_for :title, t('.header') %>
6
+ <% p.content_for :description, t('.description') %>
7
+ <% p.content_for :body do %>
8
+ <%= render 'form', stripe_installation: @stripe_installation %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'index', stripe_installations: @stripe_installations %>
5
+ <% end %>
6
+ <% end %>
@@ -0,0 +1 @@
1
+ json.array! @stripe_installations, partial: "integrations/stripe_installations/stripe_installation", as: :stripe_installation
@@ -0,0 +1,12 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'account/shared/box', divider: true do |p| %>
5
+ <% p.content_for :title, t('.header') %>
6
+ <% p.content_for :description, t('.description') %>
7
+ <% p.content_for :body do %>
8
+ <%= render 'form', stripe_installation: @stripe_installation %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'account/shared/box', divider: true do |p| %>
5
+ <% p.content_for :title, t('.header') %>
6
+ <% p.content_for :description do %>
7
+ <%= t('.description') %>
8
+ <%= t('.manage_description') if can? :manage, @stripe_installation %>
9
+ <% end %>
10
+
11
+ <% p.content_for :body do %>
12
+ <% with_attribute_settings object: @stripe_installation, strategy: :label do %>
13
+ <%= render 'shared/attributes/text', attribute: :name %>
14
+ <%# 🚅 super scaffolding will insert new fields above this line. %>
15
+ <% end %>
16
+ <% end %>
17
+
18
+ <% p.content_for :actions do %>
19
+ <%= link_to t('.buttons.edit'), [:edit, :account, @stripe_installation], class: first_button_primary if can? :edit, @stripe_installation %>
20
+ <%= button_to t('.buttons.destroy'), [:account, @stripe_installation], method: :delete, class: first_button_primary, data: { confirm: t('.buttons.confirmations.destroy', model_locales(@stripe_installation)) } if can? :destroy, @stripe_installation %>
21
+ <%= link_to t('global.buttons.back'), [:account, @team, :integrations_stripe_installations], class: first_button_primary %>
22
+ <% end %>
23
+ <% end %>
24
+
25
+ <%# 🚅 super scaffolding will insert new children above this line. %>
26
+ <% end %>
27
+ <% end %>
@@ -0,0 +1 @@
1
+ json.partial! "integrations/stripe_installations/stripe_installation", stripe_installation: @stripe_installation
@@ -0,0 +1,8 @@
1
+ <% stripe_account ||= @stripe_account %>
2
+ <% user ||= @user || stripe_account&.user %>
3
+ <%= render 'account/users/breadcrumbs', user: user %>
4
+ <%= render 'account/shared/breadcrumb', label: t('.label'), url: [:account, user, :oauth, :stripe_accounts] %>
5
+ <% if stripe_account&.persisted? %>
6
+ <%= render 'account/shared/breadcrumb', label: stripe_account.label_string, url: [:account, stripe_account] %>
7
+ <% end %>
8
+ <%= render 'account/shared/breadcrumbs/actions', only_for: 'oauth/stripe_accounts' %>
@@ -0,0 +1,14 @@
1
+ <%= form_with model: [:account, (@user unless stripe_account.persisted?), stripe_account], local: true, class: 'form' do |form| %>
2
+ <%= render 'account/shared/forms/errors', form: form %>
3
+
4
+ <%= render 'account/shared/alert' do %>
5
+ There are no configurable settings for this Stripe accounts by default, but you might want to add some!
6
+ <% end %>
7
+
8
+ <%# 🚅 super scaffolding will insert new fields above this line. %>
9
+
10
+ <div class="buttons">
11
+ <%= form.submit 'Save Settings', class: "button" %>
12
+ <%= link_to 'Cancel', [:account, stripe_account], class: "button-secondary" %>
13
+ </div>
14
+ <% end %>
@@ -0,0 +1,52 @@
1
+ <% context ||= @user %>
2
+ <% hide_actions ||= false %>
3
+
4
+ <%= render 'account/shared/box' do |p| %>
5
+ <% p.content_for :title, t(".contexts.#{context.class.name.underscore}.header") %>
6
+ <% p.content_for :description do %>
7
+ <%= raw t(".contexts.#{context.class.name.underscore}.#{stripe_accounts.any? ? 'description' : 'description_empty'}") %>
8
+ <% end %>
9
+
10
+ <% p.content_for :body do %>
11
+ <% if stripe_accounts.any? %>
12
+ <div class="space-y-0 border border-gray-200 shadow-sm rounded-md divide-y divide-gray-200">
13
+ <% stripe_accounts.each do |stripe_account| %>
14
+ <div class="flex py-1.5 px-3 items-center">
15
+ <div class="flex-1 min-w-0">
16
+ <% if stripe_account.integrations_stripe_installations.any? %>
17
+ <%= link_to stripe_account.name, [:account, stripe_account] %>
18
+ <% else %>
19
+ <%= stripe_account.name %>
20
+ <% end %>
21
+ </div>
22
+ <div class="flex-0 min-w-0 space-x-2 text-lg">
23
+ <% if can? :destroy, stripe_account %>
24
+ <%= link_to [:account, stripe_account], method: :delete, data: { confirm: t('.buttons.confirmations.destroy', model_locales(stripe_account)) }, class: 'inline-block text-gray-300 hover:text-gray-400 hover:no-underline' do %>
25
+ <i class="ti ti-close"></i>
26
+ <% end %>
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ <% end %>
33
+ <% end %>
34
+
35
+ <% unless hide_actions %>
36
+ <% p.content_for :actions do %>
37
+ <% if can? :create, Oauth::StripeAccount.new(user: @user) %>
38
+ <span data-turbo="false">
39
+ <%= button_to user_stripe_connect_omniauth_authorize_path, class: "#{first_button_primary(:integrations_stripe_installation)} new" do %>
40
+ <%= stripe_accounts.empty? ? t('.buttons.new') : t('.buttons.another') %>
41
+ <% end %>
42
+ </span>
43
+ <% end %>
44
+ <% end %>
45
+ <% end %>
46
+
47
+ <% p.content_for :footer do %>
48
+ <% if current_team %>
49
+ <%= raw t(".contexts.user.integration_note", integration_url: url_for([:account, current_team, :integrations_stripe_installations])) %>
50
+ <% end %>
51
+ <% end %>
52
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <% if can? :read, Oauth::StripeAccount.new(user: current_user) %>
2
+ <%= render 'account/shared/menu/item', {
3
+ url: main_app.polymorphic_path([:account, current_user, :oauth_stripe_accounts]),
4
+ label: t('oauth/stripe_accounts.navigation.label'),
5
+ } do |p| %>
6
+ <% p.content_for :icon do %>
7
+ <i class="<%= t('oauth/stripe_accounts.navigation.icon') %>"></i>
8
+ <% end %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,7 @@
1
+ json.extract! oauth_stripe_account,
2
+ :id,
3
+ :name,
4
+ # 🚅 super scaffolding will insert new fields above this line.
5
+ :created_at,
6
+ :updated_at
7
+ json.url oauth_stripe_account_url(oauth_stripe_account, format: :json)
@@ -0,0 +1,12 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'account/shared/box', divider: true do |p| %>
5
+ <% p.content_for :title, t('.header') %>
6
+ <% p.content_for :description, t('.description') %>
7
+ <% p.content_for :body do %>
8
+ <%= render 'form', stripe_account: @stripe_account %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'index', stripe_accounts: @stripe_accounts %>
5
+ <% end %>
6
+ <% end %>
@@ -0,0 +1 @@
1
+ json.array! @oauth_stripe_accounts, partial: "oauth/stripe_accounts/oauth_stripe_account", as: :oauth_stripe_account
@@ -0,0 +1,19 @@
1
+ <%= render 'account/shared/page' do |p| %>
2
+ <% p.content_for :title, t('.section') %>
3
+ <% p.content_for :body do %>
4
+ <%= render 'account/shared/box' do |p| %>
5
+ <% p.content_for :title, t('.header') %>
6
+ <% p.content_for :description, t('.description') %>
7
+
8
+ <% p.content_for :actions do %>
9
+ <%= link_to t('.buttons.edit'), [:edit, :account, @stripe_account], class: first_button_primary if can? :edit, @stripe_account %>
10
+ <%= button_to t('.buttons.destroy'), [:account, @stripe_account], method: :delete, class: first_button_primary, data: { confirm: t('.buttons.confirmations.destroy', model_locales(@stripe_account)) } if can? :destroy, @stripe_account %>
11
+ <%= link_to t('global.buttons.back'), [:account, @user, :oauth_stripe_accounts], class: first_button_primary %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <%= render 'account/integrations/stripe_installations/list', context: @user, stripe_installations: @stripe_account.integrations_stripe_installations %>
16
+ <%# 🚅 super scaffolding will insert new children above this line. %>
17
+
18
+ <% end %>
19
+ <% end %>
@@ -0,0 +1 @@
1
+ json.partial! "oauth_stripe_accounts/oauth_stripe_account", oauth_stripe_account: @oauth_stripe_account
@@ -0,0 +1,8 @@
1
+ <div>
2
+ <%= button_to user_stripe_connect_omniauth_authorize_path, class: 'button-alternative block w-full', form_class: 'block w-full', id: 'sign_in_with_stripe' do %>
3
+ <div class="full">
4
+ <i class="text-lg leading-5 mr-3 <%= t('oauth/stripe_accounts.navigation.icon') %>"></i>
5
+ <span class="group-hover:underline"><%= verb %> with Stripe</span>
6
+ </div>
7
+ <% end %>
8
+ </div>
@@ -0,0 +1,90 @@
1
+ en:
2
+ integrations/stripe_installations: &stripe_installations
3
+ label: &label Stripe Installations
4
+ breadcrumbs:
5
+ label: *label
6
+ navigation:
7
+ label: *label
8
+ icon: fab fa-stripe-s ti ti-money
9
+ buttons: &buttons
10
+ new: Add New Stripe Installation
11
+ create: Create Stripe Installation
12
+ edit: Edit Stripe Settings
13
+ update: Update Installation Settings
14
+ destroy: Remove Stripe Installation
15
+ shorthand:
16
+ edit: Settings
17
+ destroy: Delete
18
+ confirmations:
19
+ # TODO customize for your use-case.
20
+ destroy: Are you sure you want to disconnect %{stripe_installation_name} from %{team_name}? This won't remove this Stripe account from any connections it has to a user account for single sign-on. This will remove any data associated with this installation on %{team_name}. This can't be undone.
21
+ destroy_from_user: Are you sure you want to disconnect this Stripe account from %{team_name}? This will remove any data associated with this installation on %{team_name}. This can't be undone.
22
+ fields: &fields
23
+ name:
24
+ _: &name Name
25
+ label: *name
26
+ heading: *name
27
+
28
+ # 🚅 super scaffolding will insert new fields above this line.
29
+ created_at:
30
+ _: &created_at Added
31
+ label: *created_at
32
+ heading: *created_at
33
+ updated_at:
34
+ _: &updated_at Updated
35
+ label: *updated_at
36
+ heading: *updated_at
37
+ list:
38
+ section: "Stripe Installations"
39
+ contexts:
40
+ user:
41
+ header: Integration Installations
42
+ description: Since you are the registered owner of this Stripe account, you have the ability to disconnect it from any Teams where it's currently installed as an integration.
43
+ description_empty: This Stripe account hasn't been installed as an integration on any Teams.
44
+ authentication_note: "You can also <a href=\"%{authentication_url}\">connect and manage Stripe accounts for single sign-on authentication</a>."
45
+ fields: *fields
46
+ buttons: *buttons
47
+ index:
48
+ section: "%{teams_possessive} Stripe Installations"
49
+ contexts:
50
+ team:
51
+ header: Stripe Installations
52
+ description: Below is a list of Stripe Installations that have been added for %{team_name}.
53
+ description_empty: No Stripe Installations have been added for %{team_name}.
54
+ authentication_note: "You can also <a href=\"%{authentication_url}\">connect and manage Stripe accounts for single sign-on authentication</a>."
55
+ fields: *fields
56
+ buttons: *buttons
57
+ show:
58
+ section: "%{stripe_installation_name}"
59
+ header: Stripe Installation Details
60
+ description: Below are the details we have for %{stripe_installation_name}.
61
+ manage_description: You'll also find options for updating these details or removing %{stripe_installation_name} from %{team_name} entirely.
62
+ fields: *fields
63
+ buttons: *buttons
64
+ form: &form
65
+ buttons: *buttons
66
+ fields: *fields
67
+ new:
68
+ section: "New Stripe Installation for %{team_name}"
69
+ header: New Stripe Installation Details
70
+ description: Please provide the details of the new Stripe Installation you'd like to add to %{team_name}.
71
+ form: *form
72
+ edit:
73
+ section: "%{stripe_installation_name}"
74
+ header: Edit Stripe Installation Details
75
+ description: You can update the details or settings for %{stripe_installation_name} below.
76
+ form: *form
77
+ notifications:
78
+ created: Stripe Installation was successfully created.
79
+ updated: Stripe Installation was successfully updated.
80
+ destroyed: Stripe Installation was successfully removed.
81
+ account:
82
+ integrations:
83
+ stripe_installations: *stripe_installations
84
+ activerecord:
85
+ attributes:
86
+ integrations/stripe_installation:
87
+ name: *name
88
+ # 🚅 super scaffolding will insert new activerecord attributes above this line.
89
+ created_at: *created_at
90
+ updated_at: *updated_at
@@ -0,0 +1,66 @@
1
+ en:
2
+ oauth/stripe_accounts: &stripe_accounts
3
+ label: &label Stripe Accounts
4
+ breadcrumbs:
5
+ label: *label
6
+ navigation:
7
+ label: *label
8
+ icon: fab fa-stripe-s ti ti-money
9
+ buttons: &buttons
10
+ new: Connect Stripe Account
11
+ another: Connect Another Stripe Account
12
+ edit: Settings
13
+ update: Save Settings
14
+ destroy: Disconnect
15
+ shorthand:
16
+ edit: Settings
17
+ destroy: Disconnect
18
+ confirmations:
19
+ # TODO customize for your use-case.
20
+ destroy: Are you sure you want to disconnect the %{stripe_account_name} Stripe account from your user account? This will only disconnect it for use as a single-sign on option. It may still be connected as an integration elsewhere.
21
+ fields: &fields
22
+ name:
23
+ name: &name Name
24
+ label: *name
25
+ heading: *name
26
+ # 🚅 super scaffolding will insert new fields above this line.
27
+ created_at:
28
+ name: &created_at Connected
29
+ heading: *created_at
30
+ index:
31
+ section: '%{users_possessive} Stripe Accounts'
32
+ contexts:
33
+ user:
34
+ header: Connected Stripe Accounts
35
+ description: You can sign into your account with any of the following Stripe Accounts. You can also manage where these accounts are used as integrations.
36
+ description_empty: "You can connect a Stripe account to your user account for single sign-on below."
37
+ integration_note: "You can also <a href=\"%{integration_url}\">install Stripe as an integration</a>."
38
+ fields: *fields
39
+ buttons: *buttons
40
+ show:
41
+ section: "%{stripe_account_name}"
42
+ header: Connected Stripe Account
43
+ description: "Your %{stripe_account_name} Stripe account is currently connected for single sign-on authentication."
44
+ fields: *fields
45
+ buttons: *buttons
46
+ form: &form
47
+ buttons: *buttons
48
+ fields: *fields
49
+ edit:
50
+ section: "%{stripe_account_name}"
51
+ header: Stripe Account Settings
52
+ description: You may not need this page if your Stripe integration doesn't have any configurable settings, but we leave the page here by default in case you need it.
53
+ form: *form
54
+ notifications:
55
+ created: Great! We've added that Stripe account to your account!
56
+ updated: Stripe account settings were successfully updated.
57
+ destroyed: We've disconnected that Stripe account from your account.
58
+ account:
59
+ oauth:
60
+ stripe_accounts: *stripe_accounts
61
+ activerecord:
62
+ attributes:
63
+ oauth/stripe_account:
64
+ name: *name
65
+ # 🚅 super scaffolding will insert new activerecord attributes above this line.
66
+ created_at: *created_at
data/config/routes.rb ADDED
@@ -0,0 +1,26 @@
1
+ Rails.application.routes.draw do
2
+ namespace :webhooks do
3
+ namespace :incoming do
4
+ namespace :oauth do
5
+ resources :stripe_account_webhooks
6
+ end
7
+ end
8
+ end
9
+
10
+ namespace :account do
11
+ shallow do
12
+ # user specific resources.
13
+ resources :users do
14
+ namespace :oauth do
15
+ resources :stripe_accounts
16
+ end
17
+ end
18
+
19
+ resources :teams do
20
+ namespace :integrations do
21
+ resources :stripe_installations
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ class CreateOauthStripeAccounts < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :oauth_stripe_accounts do |t|
4
+ t.string :uid
5
+ t.jsonb :data
6
+ t.references :team, foreign_key: true
7
+ t.references :user, foreign_key: true
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class CreateWebhooksIncomingStripeWebhooks < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :webhooks_incoming_stripe_webhooks do |t|
4
+ t.jsonb :data
5
+ t.datetime :processed_at
6
+ t.datetime :verified_at
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateWebhooksIncomingOauthStripeAccountWebhooks < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :webhooks_incoming_oauth_stripe_account_webhooks do |t|
4
+ t.jsonb :data
5
+ t.datetime :processed_at
6
+ t.datetime :verified_at
7
+ t.references :oauth_stripe_account, optional: true, index: {name: "index_stripe_webhooks_on_stripe_account_id"}
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class CreateIntegrationsStripeInstallations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :integrations_stripe_installations do |t|
4
+ t.references :team, null: false, foreign_key: true
5
+ t.references :oauth_stripe_account, null: false, foreign_key: true, index: {name: "index_stripe_installations_on_stripe_account_id"}
6
+ t.string :name
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class MigrateTeamConnectedOauthStripeAccounts < ActiveRecord::Migration[6.1]
2
+ def up
3
+ Oauth::StripeAccount.find_each do |oauth_stripe_account|
4
+ if (team = oauth_stripe_account.team)
5
+ team.integrations_stripe_installations.find_or_create_by(oauth_stripe_account: oauth_stripe_account)
6
+ end
7
+ end
8
+ end
9
+
10
+ def down
11
+ raise ActiveRecord::IrreversibleMigration
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveTeamIdFromOauthStripeAccount < ActiveRecord::Migration[6.1]
2
+ def change
3
+ remove_reference :oauth_stripe_accounts, :team, null: false, foreign_key: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddUidUniquenessToOauthStripeAccounts < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_index :oauth_stripe_accounts, :uid, unique: true
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class DropWebhooksIncomingStripeWebhooks < ActiveRecord::Migration[6.1]
2
+ def change
3
+ drop_table :webhooks_incoming_stripe_webhooks do |t|
4
+ t.jsonb :data
5
+ t.datetime :processed_at
6
+ t.datetime :verified_at
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module BulletTrain
2
+ module Integrations
3
+ module Stripe
4
+ class Engine < ::Rails::Engine
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module BulletTrain
2
+ module Integrations
3
+ module Stripe
4
+ VERSION = "1.0.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require "bullet_train/integrations/stripe/version"
2
+ require "bullet_train/integrations/stripe/engine"
3
+
4
+ module BulletTrain
5
+ module Integrations
6
+ module Stripe
7
+ # Your code goes here...
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :bullet_train_integrations_stripe do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bullet_train-integrations-stripe
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Culver
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 7.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 7.0.0
27
+ description: Example Stripe platform integration for Bullet Train applications.
28
+ email:
29
+ - andrew.culver@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - MIT-LICENSE
35
+ - README.md
36
+ - Rakefile
37
+ - app/assets/config/bullet_train_integrations_stripe_manifest.js
38
+ - app/controllers/account/integrations/stripe_installations_controller.rb
39
+ - app/controllers/account/oauth/stripe_accounts_controller.rb
40
+ - app/controllers/webhooks/incoming/oauth/stripe_account_webhooks_controller.rb
41
+ - app/models/integrations/stripe_installation.rb
42
+ - app/models/oauth/stripe_account.rb
43
+ - app/models/webhooks/incoming/oauth/stripe_account_webhook.rb
44
+ - app/views/account/integrations/stripe_installations/_breadcrumbs.html.erb
45
+ - app/views/account/integrations/stripe_installations/_form.html.erb
46
+ - app/views/account/integrations/stripe_installations/_index.html.erb
47
+ - app/views/account/integrations/stripe_installations/_list.html.erb
48
+ - app/views/account/integrations/stripe_installations/_menu_item.html.erb
49
+ - app/views/account/integrations/stripe_installations/_stripe_installation.json.jbuilder
50
+ - app/views/account/integrations/stripe_installations/edit.html.erb
51
+ - app/views/account/integrations/stripe_installations/index.html.erb
52
+ - app/views/account/integrations/stripe_installations/index.json.jbuilder
53
+ - app/views/account/integrations/stripe_installations/new.html.erb
54
+ - app/views/account/integrations/stripe_installations/show.html.erb
55
+ - app/views/account/integrations/stripe_installations/show.json.jbuilder
56
+ - app/views/account/oauth/stripe_accounts/_breadcrumbs.html.erb
57
+ - app/views/account/oauth/stripe_accounts/_form.html.erb
58
+ - app/views/account/oauth/stripe_accounts/_index.html.erb
59
+ - app/views/account/oauth/stripe_accounts/_menu_item.html.erb
60
+ - app/views/account/oauth/stripe_accounts/_oauth_stripe_account.json.jbuilder
61
+ - app/views/account/oauth/stripe_accounts/edit.html.erb
62
+ - app/views/account/oauth/stripe_accounts/index.html.erb
63
+ - app/views/account/oauth/stripe_accounts/index.json.jbuilder
64
+ - app/views/account/oauth/stripe_accounts/show.html.erb
65
+ - app/views/account/oauth/stripe_accounts/show.json.jbuilder
66
+ - app/views/devise/shared/oauth/_stripe.html.erb
67
+ - config/locales/en/integrations/stripe_installations.en.yml
68
+ - config/locales/en/oauth/stripe_accounts.en.yml
69
+ - config/routes.rb
70
+ - db/migrate/20180706214509_create_oauth_stripe_accounts.rb
71
+ - db/migrate/20190310235546_create_webhooks_incoming_stripe_webhooks.rb
72
+ - db/migrate/20190330195809_create_webhooks_incoming_oauth_stripe_account_webhooks.rb
73
+ - db/migrate/20210316215919_create_integrations_stripe_installations.rb
74
+ - db/migrate/20210316220614_migrate_team_connected_oauth_stripe_accounts.rb
75
+ - db/migrate/20210316220615_remove_team_id_from_oauth_stripe_account.rb
76
+ - db/migrate/20210317150916_add_uid_uniqueness_to_oauth_stripe_accounts.rb
77
+ - db/migrate/20211018173808_drop_webhooks_incoming_stripe_webhooks.rb
78
+ - lib/bullet_train/integrations/stripe.rb
79
+ - lib/bullet_train/integrations/stripe/engine.rb
80
+ - lib/bullet_train/integrations/stripe/version.rb
81
+ - lib/tasks/bullet_train/integrations/stripe_tasks.rake
82
+ homepage: https://github.com/bullet-train-co/bullet_train-integrations-stripe
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ homepage_uri: https://github.com/bullet-train-co/bullet_train-integrations-stripe
87
+ source_code_uri: https://github.com/bullet-train-co/bullet_train-integrations-stripe
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubygems_version: 3.2.22
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Example Stripe platform integration for Bullet Train applications.
107
+ test_files: []