pay_me 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 (113) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +111 -0
  3. data/Rakefile +33 -0
  4. data/app/controllers/pay_me/api/v1/invoices_controller.rb +30 -0
  5. data/app/controllers/pay_me/api/v1/stripe_plans_controller.rb +35 -0
  6. data/app/controllers/pay_me/application_controller.rb +10 -0
  7. data/app/helpers/pay_me/application_helper.rb +4 -0
  8. data/app/subscribers/pay_me/customer_subscriber.rb +42 -0
  9. data/app/subscribers/pay_me/plan_subscriber.rb +38 -0
  10. data/app/subscribers/pay_me/subscription_subscriber.rb +50 -0
  11. data/app/subscribers/pay_me/webhook_event_subscriber.rb +11 -0
  12. data/config/routes.rb +11 -0
  13. data/db/migrate/20160725204454_create_pay_me_subscriptions.rb +16 -0
  14. data/db/migrate/20161011170659_create_pay_me_plans.rb +8 -0
  15. data/db/migrate/20171030174731_add_quantity_to_pay_me_subscription.rb +6 -0
  16. data/db/migrate/20171130192525_create_pay_me_customers.rb +11 -0
  17. data/db/migrate/20180116193943_remove_customerable_from_subscriptions.rb +11 -0
  18. data/db/migrate/20180215235017_add_past_due_to_subscriptions.rb +5 -0
  19. data/lib/generators/pay_me/controllers/controllers_generator.rb +11 -0
  20. data/lib/generators/pay_me/controllers/templates/subscriptions_controller.rb +12 -0
  21. data/lib/generators/pay_me/install_generator.rb +39 -0
  22. data/lib/generators/pay_me/migrate_to_customer_model/USAGE +8 -0
  23. data/lib/generators/pay_me/migrate_to_customer_model/migrate_to_customer_model_generator.rb +9 -0
  24. data/lib/generators/pay_me/migrate_to_customer_model/templates/migration.rb.erb +64 -0
  25. data/lib/generators/pay_me/models/models_generator.rb +13 -0
  26. data/lib/generators/pay_me/models/templates/customer.rb +14 -0
  27. data/lib/generators/pay_me/models/templates/plan.rb +14 -0
  28. data/lib/generators/pay_me/models/templates/subscription.rb +14 -0
  29. data/lib/generators/pay_me/policies/policies_generator.rb +11 -0
  30. data/lib/generators/pay_me/policies/templates/subscription_policy.rb +34 -0
  31. data/lib/generators/pay_me/templates/pay_me_initializer.rb +17 -0
  32. data/lib/pay_me.rb +28 -0
  33. data/lib/pay_me/active_record.rb +6 -0
  34. data/lib/pay_me/concerns/controllers/customerable.rb +116 -0
  35. data/lib/pay_me/concerns/models/customerable.rb +54 -0
  36. data/lib/pay_me/concerns/models/stripe_customerable.rb +24 -0
  37. data/lib/pay_me/concerns/models/stripe_plannable.rb +31 -0
  38. data/lib/pay_me/concerns/models/stripe_subscribable.rb +43 -0
  39. data/lib/pay_me/configuration.rb +27 -0
  40. data/lib/pay_me/engine.rb +8 -0
  41. data/lib/pay_me/models.rb +4 -0
  42. data/lib/pay_me/railtie.rb +2 -0
  43. data/lib/pay_me/route_helpers.rb +21 -0
  44. data/lib/pay_me/services/customer.rb +141 -0
  45. data/lib/pay_me/version.rb +3 -0
  46. data/lib/pay_me/view_models/charge.rb +48 -0
  47. data/lib/tasks/pay_me_tasks.rake +4 -0
  48. data/lib/tasks/stripe.rake +22 -0
  49. data/test/controllers/pay_me/api/v1/invoices_controller_test.rb +82 -0
  50. data/test/controllers/pay_me/api/v1/plans_controller_test.rb +62 -0
  51. data/test/dummy/README.rdoc +28 -0
  52. data/test/dummy/Rakefile +6 -0
  53. data/test/dummy/app/assets/javascripts/application.js +13 -0
  54. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  55. data/test/dummy/app/controllers/api/v1/users_controller.rb +10 -0
  56. data/test/dummy/app/controllers/application_controller.rb +5 -0
  57. data/test/dummy/app/controllers/pay_me/api/v1/subscriptions_controller.rb +12 -0
  58. data/test/dummy/app/helpers/application_helper.rb +2 -0
  59. data/test/dummy/app/models/pay_me/customer.rb +5 -0
  60. data/test/dummy/app/models/pay_me/plan.rb +5 -0
  61. data/test/dummy/app/models/pay_me/subscription.rb +5 -0
  62. data/test/dummy/app/models/user.rb +8 -0
  63. data/test/dummy/app/policies/pay_me/subscription_policy.rb +34 -0
  64. data/test/dummy/app/serializers/pay_me/subscription_serializer.rb +3 -0
  65. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  66. data/test/dummy/bin/bundle +3 -0
  67. data/test/dummy/bin/rails +4 -0
  68. data/test/dummy/bin/rake +4 -0
  69. data/test/dummy/bin/setup +29 -0
  70. data/test/dummy/config.ru +4 -0
  71. data/test/dummy/config/application.rb +25 -0
  72. data/test/dummy/config/boot.rb +5 -0
  73. data/test/dummy/config/database.yml +25 -0
  74. data/test/dummy/config/environment.rb +5 -0
  75. data/test/dummy/config/environments/development.rb +41 -0
  76. data/test/dummy/config/environments/production.rb +79 -0
  77. data/test/dummy/config/environments/test.rb +42 -0
  78. data/test/dummy/config/initializers/assets.rb +11 -0
  79. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  80. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  81. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  82. data/test/dummy/config/initializers/inflections.rb +16 -0
  83. data/test/dummy/config/initializers/mime_types.rb +4 -0
  84. data/test/dummy/config/initializers/pay_me.rb +17 -0
  85. data/test/dummy/config/initializers/session_store.rb +3 -0
  86. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  87. data/test/dummy/config/locales/en.yml +23 -0
  88. data/test/dummy/config/routes.rb +10 -0
  89. data/test/dummy/config/secrets.yml +22 -0
  90. data/test/dummy/db/migrate/20160630181300_create_pay_me_users.rb +12 -0
  91. data/test/dummy/db/migrate/20180118001940_api_me_migrate_to_customer_model.rb +9 -0
  92. data/test/dummy/db/schema.rb +53 -0
  93. data/test/dummy/public/404.html +67 -0
  94. data/test/dummy/public/422.html +67 -0
  95. data/test/dummy/public/500.html +66 -0
  96. data/test/dummy/public/favicon.ico +0 -0
  97. data/test/integration/customer_test.rb +395 -0
  98. data/test/lib/generators/pay_me/pay_me/migrate_to_customer_model_generator_test.rb +16 -0
  99. data/test/models/pay_me/customer_test.rb +9 -0
  100. data/test/models/pay_me/subscription_test.rb +9 -0
  101. data/test/models/pay_me/user_test.rb +6 -0
  102. data/test/pay_me_test.rb +7 -0
  103. data/test/support/concerns/api_test_helper.rb +15 -0
  104. data/test/support/concerns/stripe_helpers.rb +25 -0
  105. data/test/test_helper.rb +52 -0
  106. data/test/unit/concerns/customerable.rb +21 -0
  107. data/test/unit/models/customerable_test.rb +18 -0
  108. data/test/unit/services/customer_test.rb +75 -0
  109. data/test/unit/stubs/customerable.rb +28 -0
  110. data/test/unit/stubs/customerable_test.rb +16 -0
  111. data/test/webhooks/customer_webhook_test.rb +74 -0
  112. data/test/webhooks/plan_webhook_test.rb +74 -0
  113. metadata +288 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e18795d8af901a878f1d13c1a86de08fa1f2d50f73376813e46fc438311bd36e
4
+ data.tar.gz: adfdcca8ec3e7060f0076a5de4192161e47b775b91d556e59f539052e38ce505
5
+ SHA512:
6
+ metadata.gz: 7acc778c322a0a4af83d521ba81e797f9ba8c283e658e346c358f52e0e63fa29b444582d9eb6b29288b927ea8c65631efdb1431caefb15ef577c1f19cc7de3fc
7
+ data.tar.gz: 9da7a3ffdfdc90bba5e8203e47e99e32d02c68ba09a639409de79c10186b929e2c859eadb08fd741f397e328621f9e621a8a3299875283503dc32e4d42ceebab
@@ -0,0 +1,111 @@
1
+ PayMe
2
+ =========
3
+
4
+ ## This gem is currently a work in progress, follows semver, and may change significantly until version 1.0
5
+
6
+ ### A gem for attaching a payment system to business login in Rails
7
+ TODO...
8
+
9
+ ### Details
10
+ TODO...
11
+
12
+ ### Testing
13
+ Ensure you have `STRIPE_TEST_SECRET_KEY` as an ENV variable.
14
+ This progect uses [dotenv](https://github.com/bkeepers/dotenv) so you can create a `.env` file.
15
+ You can run the tests using `rake test`.
16
+
17
+ ### Installation
18
+ Add the gem to your Gemfile: `gem 'pay_me'`.
19
+
20
+ Run `bundle install` to install it.
21
+
22
+ Run `rails g pay_me:install`
23
+
24
+ Add the following to your routes
25
+ ```ruby
26
+ ...
27
+ pay_me_customerable_for :users
28
+ ...
29
+ ```
30
+
31
+ Add the following to your customer model controller
32
+ ```ruby
33
+ require 'pay_me/concerns/controllers/customerable'
34
+ ...
35
+ class UsersController < BaseController
36
+ include PayMe::Concerns::Controllers::Customerable
37
+ ...
38
+ ```
39
+
40
+ Add the following to your customer model
41
+ ```ruby
42
+ require 'pay_me/concerns/models/customerable'
43
+ ...
44
+ class User < ActiveRecord::Base
45
+ include PayMe::Concerns::Models::Customerable
46
+ ...
47
+ ```
48
+ The model will also need a `receipt_email` attribute and `customer_id`.
49
+
50
+ The installer will automatically add the following to your `secrets.yml` for `development` `test` and `production`.
51
+ `secrets.yml`
52
+ ```yml
53
+ development:
54
+ ###
55
+ # Other configs
56
+ ###
57
+ stripe_publishable_key: <%= ENV['STRIPE_PUBLISHABLE_KEY'] %>
58
+ stripe_secret_key: <%= ENV['STRIPE_SECRET_KEY'] %>
59
+ stripe_webhook_secret: <%= ENV['STRIPE_WEBHOOK_SECRET'] %>
60
+ stripe_signing_secret: <%= ENV['STRIPE_SIGNING_SECRET'] %>
61
+
62
+ ```
63
+
64
+ or using inheritance:
65
+ `secrets.yml`
66
+ ```yml
67
+ stripe: &stripe
68
+ stripe_publishable_key: <%= ENV['STRIPE_PUBLISHABLE_KEY'] %>
69
+ stripe_secret_key: <%= ENV['STRIPE_SECRET_KEY'] %>
70
+ stripe_webhook_secret: <%= ENV['STRIPE_WEBHOOK_SECRET'] %>
71
+ stripe_signing_secret: <%= ENV['STRIPE_SIGNING_SECRET'] %>
72
+
73
+ development:
74
+ <<: *stripe
75
+ ...
76
+
77
+ test:
78
+ <<: *stripe
79
+ ...
80
+
81
+ production:
82
+ <<: *stripe
83
+ ...
84
+ ```
85
+
86
+ You will need to add the stripe keys to your `ENV`.
87
+ - `STRIPE_PUBLISHABLE_KEY` is your stripe publishable key.
88
+ - `STRIPE_SECRET_KEY` is your stripe secret key.
89
+ - `STRIPE_WEBHOOK_SECRET` is a secret that is used for stripe as a password for basic authentication to the webhook. You can use `rake secret` to generate a suitable secret. This is also used when configuring the stripe webhook in stripe: `https://stripe:STRIPE_WEBHOOK_SECRET@myapplication.com/pay_me-stripe_webhooks`
90
+ - `STRIPE_SIGNING_SECRET` is used by stripe to sign webhooks. It can be found in your stripe webhook settings.
91
+
92
+ PayMe adds to rake task for caching Stripe plans locally to reduce calls to stripe.
93
+ They are:
94
+ - `pay_me:stripe:add_stripe_plans` This will add missing Stripe plans, but not delete local ones that no longer exist on stripe.
95
+ - `pay_me:stripe:sync_stripe_plans` This will add missing Stripe plans and delete local ones that don't exist on stripe.
96
+
97
+ You are now setup!
98
+
99
+ ### Stripe Configuration Checklist
100
+ - [ ] Get API keys and add to `ENV`
101
+ - [ ] Add webhook URL and webhook secret to `ENV`
102
+ - [ ] Get webhook signing secret and add to `ENV`
103
+ - [ ] Add plan(s) to Stripe.
104
+ TODO...
105
+
106
+ ### Usage
107
+ #### Todo:
108
+ - [ ] TODO...
109
+
110
+ ## License
111
+ Copyright (c) 2015, Pay Me is developed and maintained by Wildland
@@ -0,0 +1,33 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'PayMe'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+ task default: :test
@@ -0,0 +1,30 @@
1
+ require_dependency 'pay_me/application_controller'
2
+ module PayMe
3
+ module Api
4
+ module V1
5
+ class InvoicesController < ApplicationController # TODO ApiMe Integration
6
+ def index
7
+ invoices = PayMe.configuration.stripe_invoice_class.list
8
+
9
+ render status: 200, json: {
10
+ invoices: invoices.map do |invoice|
11
+ invoice.as_json.tap do |i|
12
+ i.store('stripe_id', i.delete('id'))
13
+ end
14
+ end
15
+ }
16
+ end
17
+
18
+ def show
19
+ invoice = PayMe.configuration.stripe_invoice_class.retrieve(params[:id])
20
+
21
+ render status: 200, json: {
22
+ invoice: invoice.as_json.tap do |i|
23
+ i.store('stripe_id', i.delete('id'))
24
+ end
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ require_dependency 'pay_me/application_controller'
2
+
3
+ module PayMe
4
+ module Api
5
+ module V1
6
+ class StripePlansController < ApplicationController # TODO ApiMe Integration
7
+ def index
8
+ plans = Stripe::Plan.list
9
+
10
+ pay_me_plans = PayMe::Plan.all.pluck(:plan_id)
11
+
12
+ plans = plans.to_a.select{ |p| pay_me_plans.include?(p['id']) }
13
+
14
+ render status: 200, json: {
15
+ stripePlans: plans.map do |plan|
16
+ plan.as_json.tap do |p|
17
+ p.store('stripe_id', p.delete('id'))
18
+ end
19
+ end
20
+ }
21
+ end
22
+
23
+ def show
24
+ plan = Stripe::Plan.retrieve(params[:id])
25
+
26
+ render status: 200, json: {
27
+ stripePlans: plan.as_json.tap do |p|
28
+ p.store('stripe_id', p.delete('id'))
29
+ end
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ module PayMe
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+
5
+ rescue_from Stripe::StripeError do |e|
6
+ logger.error { e.to_s }
7
+ render status: e.http_status, json: { reason: e.message, errors: [e.message] }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module PayMe
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,42 @@
1
+ module PayMe
2
+ class CustomerSubscriber < WebhookEventSubscriber
3
+ def call(event)
4
+ case event.type
5
+ when 'customer.created'
6
+ customer_created(event.data.object)
7
+ when 'customer.deleted'
8
+ customer_deleted(event.data.object)
9
+ when 'customer.updated'
10
+ customer_updated(event.data.object)
11
+ end
12
+ end
13
+
14
+ def customer_created(stripe_customer)
15
+ ActiveRecord::Base.transaction do
16
+ PayMe::Customer.created_webhook!(stripe_customer)
17
+ unless PayMe::Customer.exists?(customer_id: stripe_customer.id)
18
+ @logger.warn "[STRIPE] Stripe customer stripe_ID:#{stripe_customer.id} created through stripe interface."
19
+ end
20
+ end
21
+ end
22
+
23
+ def customer_deleted(stripe_customer)
24
+ ActiveRecord::Base.transaction do
25
+ PayMe::Customer.deleted_webhook!(stripe_customer)
26
+ if PayMe::Customer.exists?(customer_id: stripe_customer.id)
27
+ @logger.warn "[STRIPE] Stripe customer stripe_ID:#{stripe_customer.id} deleted through stripe interface."
28
+ PayMe::Customer.find_by!(customer_id: stripe_customer.id).destroy
29
+ end
30
+ end
31
+ end
32
+
33
+ def customer_updated(stripe_customer)
34
+ ActiveRecord::Base.transaction do
35
+ PayMe::Customer.updated_webhook!(stripe_customer)
36
+ unless PayMe::Customer.exists?(customer_id: stripe_customer.id)
37
+ @logger.warn "[STRIPE] Unable to find stripe customer stripe_ID:#{stripe_customer.id} on update."
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,38 @@
1
+ module PayMe
2
+ class PlanSubscriber < WebhookEventSubscriber
3
+ def call(event)
4
+ case event.type
5
+ when 'plan.created'
6
+ plan_created(event.data.object)
7
+ when 'plan.deleted'
8
+ plan_deleted(event.data.object)
9
+ when 'plan.updated'
10
+ plan_updated(event.data.object)
11
+ end
12
+ end
13
+
14
+ def plan_created(stripe_plan)
15
+ ActiveRecord::Base.transaction do
16
+ PayMe::Plan.created_webhook!(stripe_plan)
17
+ unless PayMe::Plan.exists?(plan_id: stripe_plan.id)
18
+ PayMe::Plan.create!(plan_id: stripe_plan.id)
19
+ end
20
+ end
21
+ end
22
+
23
+ def plan_deleted(stripe_plan)
24
+ ActiveRecord::Base.transaction do
25
+ PayMe::Plan.deleted_webhook!(stripe_plan)
26
+ if PayMe::Plan.exists?(plan_id: stripe_plan.id)
27
+ PayMe::Plan.find_by!(plan_id: stripe_plan.id).destroy
28
+ end
29
+ end
30
+ end
31
+
32
+ def plan_updated(stripe_plan)
33
+ ActiveRecord::Base.transaction do
34
+ PayMe::Plan.updated_webhook!(stripe_plan)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,50 @@
1
+ module PayMe
2
+ class SubscriptionSubscriber < WebhookEventSubscriber
3
+ def call(event)
4
+ case event.type
5
+ when 'customer.subscription.created'
6
+ subscription_created(event.data.object)
7
+ when 'customer.subscription.deleted'
8
+ subscription_deleted(event.data.object)
9
+ when 'customer.subscription.updated'
10
+ subscription_updated(event.data.object)
11
+ end
12
+ end
13
+
14
+ def subscription_created(stripe_subscription)
15
+ ActiveRecord::Base.transaction do
16
+ PayMe::Subscription.created_webhook!(stripe_subscription)
17
+ unless PayMe::Subscription.exists?(subscription_id: stripe_subscription.id)
18
+ @logger.warn "[STRIPE] Stripe subscription stripe_ID:#{stripe_subscription.id} created in stripe interface."
19
+ end
20
+ end
21
+ end
22
+
23
+ def subscription_deleted(stripe_subscription)
24
+ ActiveRecord::Base.transaction do
25
+ PayMe::Subscription.deleted_webhook!(stripe_subscription)
26
+ if PayMe::Subscription.exists?(subscription_id: stripe_subscription.id)
27
+ @logger.warn "[STRIPE] Stripe subscription stripe_ID:#{stripe_subscription.id} delete in stripe interface."
28
+ PayMe::Subscription.destroy(subscription_id: stripe_subscription.id)
29
+ end
30
+ end
31
+ end
32
+
33
+ def subscription_updated(stripe_subscription)
34
+ ActiveRecord::Base.transaction do
35
+ PayMe::Subscription.updated_webhook!(stripe_subscription)
36
+ @subscription = PayMe::Subscription.find_by!(subscription_id: stripe_subscription.id)
37
+ case stripe_subscription.status
38
+ when 'trialing', 'active'
39
+ @subscription.update!(is_active: true, past_due: false)
40
+ when 'past_due'
41
+ @subscription.update!(is_active: true, past_due: true)
42
+ when 'canceled', 'unpaid'
43
+ @subscription.update!(is_active: false, past_due: false)
44
+ end
45
+ end
46
+ rescue ActiveRecord::RecordNotFound => e
47
+ @logger.warn "[STRIPE] Unable to find stripe subscription stripe_ID:#{stripe_subscription.id}"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ module PayMe
2
+ class WebhookEventSubscriber
3
+ def initialize(logger)
4
+ @logger = logger
5
+ end
6
+
7
+ def call(event)
8
+ @logger.info "[STRIPE] Event :#{event.type}:#{event.id}"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ PayMe::Engine.routes.draw do
2
+ namespace :api do
3
+ namespace :v1 do
4
+ resources :invoices, only: [:index, :show]
5
+ resources :stripe_plans, only: [:index, :show]
6
+ resources :plans, only: [:index, :show]
7
+ resources :subscriptions, only: [:index, :show]
8
+ end
9
+ end
10
+ mount StripeEvent::Engine, at: '/stripe_webhooks'
11
+ end
@@ -0,0 +1,16 @@
1
+ class CreatePayMeSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ create_table :pay_me_subscriptions do |t|
4
+ t.string :subscription_id, null: false
5
+ t.boolean :is_active, null: false
6
+ t.references :customerable, polymorphic: true, null: false
7
+
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_index :pay_me_subscriptions, :subscription_id, unique: true
12
+ add_index :pay_me_subscriptions,
13
+ [:customerable_id, :customerable_type],
14
+ unique: true, name: 'subscription_customerable_index'
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ class CreatePayMePlans < ActiveRecord::Migration
2
+ def change
3
+ create_table :pay_me_plans do |t|
4
+ t.string :plan_id, null: false
5
+ end
6
+ add_reference :pay_me_subscriptions, :pay_me_plan, index: true
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ class AddQuantityToPayMeSubscription < ActiveRecord::Migration
2
+ def change
3
+ add_column :pay_me_subscriptions, :quantity, :integer
4
+ add_column :pay_me_subscriptions, :coupon_id, :string
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ class CreatePayMeCustomers < ActiveRecord::Migration
2
+ def change
3
+ create_table :pay_me_customers do |t|
4
+ t.string :customer_id
5
+
6
+ t.timestamps null: false
7
+ end
8
+
9
+ add_reference(:pay_me_subscriptions, :pay_me_customers, index: true)
10
+ end
11
+ end