pay_me 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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