disco_app 0.13.6.pre.puma.pre.3 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/images/disco_app/logo.png +0 -0
  3. data/app/clients/disco_app/rollbar_client.rb +53 -0
  4. data/app/clients/disco_app/rollbar_client_error.rb +2 -0
  5. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +1 -1
  6. data/app/controllers/disco_app/concerns/authenticated_controller.rb +10 -1
  7. data/app/controllers/disco_app/concerns/user_authenticated_controller.rb +2 -2
  8. data/app/controllers/disco_app/user_sessions_controller.rb +1 -1
  9. data/app/controllers/disco_app/webhooks_controller.rb +1 -1
  10. data/app/controllers/sessions_controller.rb +1 -1
  11. data/app/jobs/application_job.rb +2 -0
  12. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +26 -9
  13. data/app/jobs/disco_app/shop_job.rb +1 -1
  14. data/app/models/application_record.rb +3 -0
  15. data/app/models/disco_app/app_settings.rb +1 -1
  16. data/app/models/disco_app/application_charge.rb +8 -2
  17. data/app/models/disco_app/concerns/can_be_liquified.rb +5 -4
  18. data/app/models/disco_app/concerns/plan.rb +12 -3
  19. data/app/models/disco_app/concerns/plan_code.rb +4 -1
  20. data/app/models/disco_app/concerns/shop.rb +9 -1
  21. data/app/models/disco_app/concerns/subscription.rb +11 -4
  22. data/app/models/disco_app/concerns/synchronises.rb +1 -1
  23. data/app/models/disco_app/plan.rb +1 -1
  24. data/app/models/disco_app/plan_code.rb +1 -1
  25. data/app/models/disco_app/recurring_application_charge.rb +9 -2
  26. data/app/models/disco_app/shop.rb +1 -1
  27. data/app/models/disco_app/source.rb +1 -1
  28. data/app/models/disco_app/subscription.rb +1 -1
  29. data/app/models/disco_app/user.rb +1 -1
  30. data/app/services/disco_app/partner_app_service.rb +151 -0
  31. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +1 -1
  32. data/db/migrate/20170315062548_create_disco_app_sources.rb +1 -1
  33. data/db/migrate/20170315062629_add_sources_to_shop_subscriptions.rb +1 -1
  34. data/db/migrate/20170327214540_create_disco_app_users.rb +1 -1
  35. data/db/migrate/20170606160751_fix_disco_app_users_index.rb +1 -1
  36. data/lib/disco_app/version.rb +1 -1
  37. data/lib/generators/disco_app/disco_app_generator.rb +17 -18
  38. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +2 -1
  39. data/lib/generators/disco_app/templates/root/README.md +26 -0
  40. data/lib/tasks/partner_app.rake +26 -0
  41. data/lib/tasks/rollbar.rake +24 -0
  42. data/test/controllers/disco_app/charges_controller_test.rb +11 -11
  43. data/test/controllers/disco_app/subscriptions_controller_test.rb +4 -4
  44. data/test/controllers/disco_app/webhooks_controller_test.rb +5 -5
  45. data/test/controllers/home_controller_test.rb +1 -1
  46. data/test/controllers/proxy_controller_test.rb +3 -3
  47. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +1 -1
  48. data/test/dummy/app/controllers/proxy_controller.rb +1 -1
  49. data/test/dummy/app/jobs/application_job.rb +2 -0
  50. data/test/dummy/app/models/application_record.rb +3 -0
  51. data/test/dummy/app/models/cart.rb +1 -1
  52. data/test/dummy/app/models/disco_app/shop.rb +1 -1
  53. data/test/dummy/app/models/js_configuration.rb +1 -1
  54. data/test/dummy/app/models/product.rb +1 -1
  55. data/test/dummy/app/models/widget_configuration.rb +1 -1
  56. data/test/dummy/config/application.rb +0 -3
  57. data/test/dummy/config/environments/test.rb +2 -2
  58. data/test/dummy/config/initializers/shopify_session_repository.rb +1 -1
  59. data/test/dummy/db/migrate/20160307182229_create_products.rb +2 -2
  60. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +2 -2
  61. data/test/dummy/db/migrate/20161105054746_create_carts.rb +3 -2
  62. data/test/dummy/db/schema.rb +89 -96
  63. data/test/fixtures/disco_app/shops.yml +6 -2
  64. data/test/fixtures/liquid/model.liquid +8 -8
  65. data/test/integration/synchronises_test.rb +15 -9
  66. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +16 -4
  67. data/test/test_helper.rb +13 -0
  68. data/test/vcr/webhook_failure.yml +640 -0
  69. metadata +81 -38
@@ -6,10 +6,12 @@ class DiscoAppGenerator < Rails::Generators::Base
6
6
  #
7
7
  # - .env and .env.local for settings environment variables in development with dotenv-rails;
8
8
  # - Slightly customised version of the default Rails .gitignore;
9
- # - Default simple Procfile for Heroku.
9
+ # - Default simple Procfile for Heroku;
10
+ # - .editorconfig to help enforce 2-space tabs, newlines and truncated whitespace for editors that support it.
11
+ # - README template
10
12
  #
11
13
  def copy_root_files
12
- %w(.env .env.local .gitignore .rubocop.yml .codeclimate.yml Procfile CHECKS).each do |file|
14
+ %w(.editorconfig .env .env.local .gitignore .rubocop.yml .codeclimate.yml Procfile CHECKS README.md).each do |file|
13
15
  copy_file "root/#{file}", file
14
16
  end
15
17
  end
@@ -27,28 +29,25 @@ class DiscoAppGenerator < Rails::Generators::Base
27
29
  gsub_file 'Gemfile', /^# Use sqlite3 as the database for Active Record\ngem 'sqlite3'/m, ''
28
30
 
29
31
  # Add gem requirements.
30
- gem 'shopify_app'
31
- gem 'pg'
32
- gem 'sidekiq'
33
- gem 'rollbar'
34
- gem 'newrelic_rpm'
35
- gem 'react-rails'
36
- gem 'classnames-rails'
37
- gem 'premailer-rails'
38
- gem 'rails-bigint-pk'
39
- gem 'acts_as_singleton'
40
32
  gem 'active_link_to'
33
+ gem 'acts_as_singleton'
34
+ gem 'classnames-rails'
35
+ gem 'newrelic_rpm'
41
36
  gem 'nokogiri'
42
37
  gem 'oj'
38
+ gem 'pg'
39
+ gem 'premailer-rails'
40
+ gem 'react-rails'
43
41
  gem 'render_anywhere'
44
-
45
- # Specify the threadsafe version of ActiveResource.
46
- gem 'activeresource', git: 'https://github.com/shopify/activeresource.git', tag: '4.2-threadsafe'
42
+ gem 'rollbar'
43
+ gem 'shopify_app'
44
+ gem 'sidekiq'
45
+ gem 'activeresource'
47
46
 
48
47
  # Indicate which gems should only be used in production.
49
48
  gem_group :production do
50
- gem 'rails_12factor'
51
49
  gem 'mailgun_rails'
50
+ gem 'rails_12factor'
52
51
  end
53
52
 
54
53
  # Indicate which gems should only be used in development and test.
@@ -56,6 +55,7 @@ class DiscoAppGenerator < Rails::Generators::Base
56
55
  gem 'dotenv-rails'
57
56
  gem 'minitest-reporters'
58
57
  gem 'webmock'
58
+ gem 'mechanize'
59
59
  end
60
60
  end
61
61
 
@@ -163,7 +163,6 @@ class DiscoAppGenerator < Rails::Generators::Base
163
163
  def run_generators
164
164
  generate 'shopify_app:install'
165
165
  generate 'shopify_app:home_controller'
166
- generate 'bigint_pk:install'
167
166
  generate 'react:install'
168
167
  end
169
168
 
@@ -221,7 +220,7 @@ class DiscoAppGenerator < Rails::Generators::Base
221
220
  # This should be the last operation, to allow all other operations to run in the initial Ruby version.
222
221
  def set_ruby_version
223
222
  copy_file 'root/.ruby-version', '.ruby-version'
224
- prepend_to_file 'Gemfile', "ruby '2.3.3'\n"
223
+ prepend_to_file 'Gemfile', "ruby '2.5.0'\n"
225
224
  end
226
225
 
227
226
  private
@@ -1,7 +1,8 @@
1
1
  if Rails.configuration.cache_classes
2
2
  ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
3
3
  else
4
- ActionDispatch::Reloader.to_prepare do
4
+ reloader = defined?(ActiveSupport::Reloader) ? ActiveSupport::Reloader : ActionDispatch::Reloader
5
+ reloader.to_prepare do
5
6
  ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
6
7
  end
7
8
  end
@@ -0,0 +1,26 @@
1
+ # App title
2
+ A short overview of what the application is designed to do goes here. Also include the current usage of the app (eg, which clients are using it, how many stores, etc).
3
+
4
+ ## Setup
5
+ See [section 3 and 4 of the Disco App README](https://github.com/discolabs/disco_app#3-setting-up-the-shopify-app) for standard steps on setting up a Disco Rails App.
6
+
7
+ ## Deployment
8
+ See [this Guru card](https://app.getguru.com/#/facts/879686cb-e74a-4814-b45f-06e568d89c10) for the standard steps on deploying an existing DiscoRails App.
9
+
10
+ ## Installation
11
+ A guide to installing the app onto a new store.
12
+
13
+ ## Functionality
14
+ A list of the features of the app, and what it achieves (ie, the requirements it meets).
15
+
16
+ ## External systems
17
+ A list of the external systems the application interacts with.
18
+
19
+ ## Data flow
20
+ A description of how data flows through the application, if applicable, or a description of the common processes/functions the app performs.
21
+
22
+ ## Notes
23
+ A section to note anything particularly noteworthy about this app.
24
+
25
+ ## Troubleshooting / FAQ
26
+ Potentially common problems and their solutions.
@@ -0,0 +1,26 @@
1
+ require 'yaml'
2
+
3
+ namespace :generate do
4
+ desc 'Generate new Shopify app from partner dashboard'
5
+ task partner_app: :environment do
6
+ begin
7
+ config_path = File.join(ENV['HOME'], '.disco_app.yml')
8
+ config = YAML.load_file(config_path)
9
+ rescue StandardError
10
+ abort("Could not load configuration file from #{config_path}, aborting.")
11
+ end
12
+
13
+ if config
14
+ params = {
15
+ email: config['params']['PARTNER_EMAIL'].to_s,
16
+ password: config['params']['PARTNER_PASSWORD'].to_s,
17
+ organization: config['params']['PARTNER_ORGANIZATION'].to_s,
18
+ app_name: ENV['SHOPIFY_APP_NAME'],
19
+ app_url: ENV['DEFAULT_HOST']
20
+ }
21
+
22
+ service = DiscoApp::PartnerAppService.new(params)
23
+ service.generate_partner_app
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require 'yaml'
2
+
3
+ namespace :generate do
4
+ desc "Create Rollbar project for current shopify app, and return the ROLLBAR API TOKEN"
5
+ task rollbar_project: :environment do
6
+ begin
7
+ config_path = File.join(ENV['HOME'], '.disco_app.yml')
8
+ config = YAML.load_file(config_path)
9
+ rescue StandardError
10
+ abort("Could not load configuration file from #{config_path}, aborting.")
11
+ end
12
+
13
+ params = {
14
+ write_account_access_token: config['params']['ROLLBAR_ACCOUNT_ACCESS_TOKEN_WRITE'].to_s,
15
+ read_account_access_token: config['params']['ROLLBAR_ACCOUNT_ACCESS_TOKEN_READ'].to_s
16
+ }
17
+
18
+ project_access_token = DiscoApp::RollbarClient.new(params).create_project(ENV['APP_NAME'].blank? ? ENV['SHOPIFY_APP_NAME'] : ENV['APP_NAME'])
19
+ puts '#' * 80
20
+ puts 'New Rollbar project successfully created!'
21
+ puts "ROLLBAR_ACCESS_TOKEN = #{project_access_token}"
22
+ puts '#' * 80
23
+ end
24
+ end
@@ -21,24 +21,24 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
21
21
 
22
22
  test 'non-logged in user is redirected to the login page' do
23
23
  log_out
24
- get(:new, subscription_id: @current_subscription)
24
+ get :new, params: { subscription_id: @current_subscription }
25
25
  assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path
26
26
  end
27
27
 
28
28
  test 'logged-in, never installed user is redirected to the install page' do
29
29
  @shop.never_installed!
30
- get(:new, subscription_id: @current_subscription)
30
+ get :new, params: { subscription_id: @current_subscription }
31
31
  assert_redirected_to DiscoApp::Engine.routes.url_helpers.install_path
32
32
  end
33
33
 
34
34
  test 'user with paid-for current subscription can not access page' do
35
- get(:new, subscription_id: @current_subscription)
35
+ get :new, params: { subscription_id: @current_subscription }
36
36
  assert_redirected_to Rails.application.routes.url_helpers.root_path
37
37
  end
38
38
 
39
39
  test 'user with unpaid current subscription can access page' do
40
40
  @current_subscription.active_charge.destroy
41
- get(:new, subscription_id: @current_subscription)
41
+ get :new, params: { subscription_id: @current_subscription }
42
42
  assert_response :ok
43
43
  end
44
44
 
@@ -47,26 +47,26 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
47
47
  "price": "9.99",
48
48
  "trial_days": 14,
49
49
  "return_url": /^https:\/\/test\.example\.com\/subscriptions\/304261385\/charges\/53297050(1|2)\/activate$/,
50
- "test": true
50
+ "test": true
51
51
  } }
52
52
  stub_request(:post, "#{@shop.admin_url}/recurring_application_charges.json")
53
53
  .with(body: res
54
54
  ).to_return(status: 201, body:api_fixture("widget_store/charges/create_second_recurring_application_charge_response").to_json)
55
55
 
56
56
  @current_subscription.active_charge.destroy
57
- post(:create, subscription_id: @current_subscription)
57
+ post :create, params: { subscription_id: @current_subscription }
58
58
  assert_redirected_to 'https://apple.myshopify.com/admin/charges/654381179/confirm_recurring_application_charge?signature=BAhpBHsQASc%3D--b2e90c6e4e94fbae15a464c566a31a1c23e6bffa'
59
59
  end
60
60
 
61
61
  test 'user trying to activate charge for invalid gets not found and hence 404' do
62
62
  assert_raises ActiveRecord::RecordNotFound do
63
- get(:activate, subscription_id: '123', id: '456', charge_id: '789')
63
+ get :activate, params: { subscription_id: '123', id: '456', charge_id: '789' }
64
64
  end
65
65
  end
66
66
 
67
67
  test 'user trying to activate invalid charge for valid subscription gets redirected to new charge page for that subscription' do
68
68
  @current_subscription.active_charge.destroy
69
- get(:activate, subscription_id: @current_subscription, id: '456', charge_id: '789')
69
+ get :activate, params: { subscription_id: @current_subscription, id: '456', charge_id: '789' }
70
70
  assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
71
71
  end
72
72
 
@@ -74,7 +74,7 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
74
74
  stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_pending_recurring_application_charge')
75
75
 
76
76
  @current_subscription.active_charge.destroy
77
- get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
77
+ get :activate, params: { subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id }
78
78
  assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
79
79
  end
80
80
 
@@ -82,7 +82,7 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
82
82
  stub_api_request(:get, "#{@shop.admin_url}/recurring_application_charges/654381179.json", 'widget_store/charges/get_declined_recurring_application_charge')
83
83
 
84
84
  @current_subscription.active_charge.destroy
85
- get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
85
+ get :activate, params: { subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id }
86
86
  assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_charge_path(@current_subscription)
87
87
  end
88
88
 
@@ -91,7 +91,7 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
91
91
  stub_api_request(:post, "#{@shop.admin_url}/recurring_application_charges/654381179/activate.json", 'widget_store/charges/activate_recurring_application_charge')
92
92
 
93
93
  @current_subscription.active_charge.destroy
94
- get(:activate, subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id)
94
+ get :activate, params: { subscription_id: @current_subscription, id: @new_charge.id, charge_id: @new_charge.shopify_id }
95
95
  assert_equal @new_charge, @current_subscription.active_charge
96
96
  assert_redirected_to Rails.application.routes.url_helpers.root_path
97
97
  end
@@ -39,27 +39,27 @@ class DiscoApp::SubscriptionsControllerTest < ActionController::TestCase
39
39
  end
40
40
 
41
41
  test 'logged-in, installed user with current subscription can create new subscription' do
42
- post(:create, subscription: { plan: disco_app_plans(:premium) })
42
+ post :create, params: { subscription: { plan: disco_app_plans(:premium) } }
43
43
  assert_redirected_to Rails.application.routes.url_helpers.root_path
44
44
  assert_equal disco_app_plans(:premium), @shop.current_plan
45
45
  end
46
46
 
47
47
  test 'logged-in, installed user with no subscription can create new subscription for available plan' do
48
48
  @current_subscription.destroy
49
- post(:create, subscription: { plan: disco_app_plans(:premium) })
49
+ post :create, params: { subscription: { plan: disco_app_plans(:premium) } }
50
50
  assert_redirected_to Rails.application.routes.url_helpers.root_path
51
51
  assert_equal disco_app_plans(:premium), @shop.current_plan
52
52
  end
53
53
 
54
54
  test 'logged-in, installed user with current subscription can not create new subscription for unavailable plan' do
55
- post(:create, subscription: { plan: disco_app_plans(:cheapo) })
55
+ post :create, params: { subscription: { plan: disco_app_plans(:cheapo) } }
56
56
  assert_redirected_to DiscoApp::Engine.routes.url_helpers.new_subscription_path
57
57
  assert_equal @current_subscription, @shop.current_subscription
58
58
  end
59
59
 
60
60
  test 'logged-in, installed user with current subscription can create new subscription with valid cookied plan code' do
61
61
  @request.cookies[DiscoApp::CODE_COOKIE_KEY] = 'PODCAST'
62
- post(:create, subscription: { plan: disco_app_plans(:premium) })
62
+ post :create, params: { subscription: { plan: disco_app_plans(:premium) } }
63
63
  assert_redirected_to Rails.application.routes.url_helpers.root_path
64
64
  assert_equal disco_app_plans(:premium), @shop.current_plan
65
65
  assert_equal 8999, @shop.current_subscription.amount
@@ -14,7 +14,7 @@ class DiscoApp::WebhooksControllerTest < ActionController::TestCase
14
14
 
15
15
  test 'webhook request without authentication information returns unauthorized' do
16
16
  body = webhook_fixture('app_uninstalled')
17
- post(:process_webhook, body)
17
+ post :process_webhook, body: body
18
18
  assert_response :unauthorized
19
19
  end
20
20
 
@@ -22,7 +22,7 @@ class DiscoApp::WebhooksControllerTest < ActionController::TestCase
22
22
  body = webhook_fixture('app_uninstalled')
23
23
  @request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
24
24
  @request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
25
- post(:process_webhook, body)
25
+ post :process_webhook, body: body
26
26
  assert_response :unauthorized
27
27
  end
28
28
 
@@ -31,7 +31,7 @@ class DiscoApp::WebhooksControllerTest < ActionController::TestCase
31
31
  @request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
32
32
  @request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
33
33
  @request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = '0000'
34
- post(:process_webhook, body)
34
+ post :process_webhook, body: body
35
35
  assert_response :unauthorized
36
36
  end
37
37
 
@@ -40,7 +40,7 @@ class DiscoApp::WebhooksControllerTest < ActionController::TestCase
40
40
  @request.headers['HTTP_X_SHOPIFY_TOPIC'] = :'app/uninstalled'
41
41
  @request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN'] = @shop.shopify_domain
42
42
  @request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
43
- post(:process_webhook, body)
43
+ post :process_webhook, body: body
44
44
  assert_response :ok
45
45
  end
46
46
 
@@ -51,7 +51,7 @@ class DiscoApp::WebhooksControllerTest < ActionController::TestCase
51
51
  @request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
52
52
 
53
53
  assert_enqueued_with(job: DiscoApp::AppUninstalledJob) do
54
- post(:process_webhook, body)
54
+ post :process_webhook, body: body
55
55
  end
56
56
  end
57
57
 
@@ -93,7 +93,7 @@ class HomeControllerTest < ActionController::TestCase
93
93
  log_out
94
94
  Timecop.freeze('2017-03-08 12:44:58 +1100') do
95
95
  hmac = 'eb49ba93a8daf8a11a04c66129faf98de1cd40f082b0ae78e79a2dfbbefb438d'
96
- get(:index, { hmac: hmac, shop: 'widgets-dev.myshopify.com', timestamp: Time.now.to_i })
96
+ get :index, params: { hmac: hmac, shop: 'widgets-dev.myshopify.com', timestamp: Time.now.to_i }
97
97
  assert_response :success
98
98
  end
99
99
  end
@@ -18,18 +18,18 @@ class ProxyControllerTest < ActionController::TestCase
18
18
  end
19
19
 
20
20
  test 'app proxy request with incorrect authentication information returns unauthorized' do
21
- get(:index, proxy_params(shop: @shop.shopify_domain).merge(signature: 'invalid_signature'))
21
+ get :index, params: proxy_params(shop: @shop.shopify_domain).merge(signature: 'invalid_signature')
22
22
  assert_response :unauthorized
23
23
  end
24
24
 
25
25
  test 'app proxy request with correct authentication information returns ok and has shop context' do
26
- get(:index, proxy_params(shop: @shop.shopify_domain))
26
+ get :index, params: proxy_params(shop: @shop.shopify_domain)
27
27
  assert_response :ok
28
28
  assert_equal @shop, assigns(:shop)
29
29
  end
30
30
 
31
31
  test 'app proxy request with correct authentication information but unknown shop returns 404' do
32
- get(:index, proxy_params(shop: 'unknown.myshopify.com'))
32
+ get :index, params: proxy_params(shop: 'unknown.myshopify.com')
33
33
  assert_response :not_found
34
34
  end
35
35
 
@@ -2,7 +2,7 @@ class DiscoApp::Admin::ShopsController < DiscoApp::Admin::ApplicationController
2
2
  include DiscoApp::Admin::Concerns::ShopsController
3
3
 
4
4
  def index
5
- render text: 'ok'
5
+ render plain: 'ok'
6
6
  end
7
7
 
8
8
  end
@@ -2,7 +2,7 @@ class ProxyController < ActionController::Base
2
2
  include DiscoApp::Concerns::AppProxyController
3
3
 
4
4
  def index
5
- render text: 'ok'
5
+ render plain: 'ok'
6
6
  end
7
7
 
8
8
  end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -1,4 +1,4 @@
1
- class Cart < ActiveRecord::Base
1
+ class Cart < ApplicationRecord
2
2
  include DiscoApp::Concerns::Synchronises
3
3
 
4
4
  belongs_to :shop, class_name: 'DiscoApp::Shop'
@@ -1,6 +1,6 @@
1
1
  require 'active_utils'
2
2
 
3
- class DiscoApp::Shop < ActiveRecord::Base
3
+ class DiscoApp::Shop < ApplicationRecord
4
4
  include DiscoApp::Concerns::Shop
5
5
 
6
6
  has_one :js_configuration
@@ -1,4 +1,4 @@
1
- class JsConfiguration < ActiveRecord::Base
1
+ class JsConfiguration < ApplicationRecord
2
2
  include DiscoApp::Concerns::RendersAssets
3
3
 
4
4
  belongs_to :shop, class_name: 'DiscoApp::Shop'
@@ -1,4 +1,4 @@
1
- class Product < ActiveRecord::Base
1
+ class Product < ApplicationRecord
2
2
  include DiscoApp::Concerns::Synchronises
3
3
  include DiscoApp::Concerns::HasMetafields
4
4
 
@@ -1,4 +1,4 @@
1
- class WidgetConfiguration < ActiveRecord::Base
1
+ class WidgetConfiguration < ApplicationRecord
2
2
  include DiscoApp::Concerns::RendersAssets
3
3
 
4
4
  belongs_to :shop, class_name: 'DiscoApp::Shop'
@@ -30,9 +30,6 @@ module Dummy
30
30
 
31
31
  # Explicitly prevent real charges being created by default
32
32
  config.x.shopify_charges_real = false
33
-
34
- # Do not swallow errors in after_commit/after_rollback callbacks.
35
- config.active_record.raise_in_transactional_callbacks = true
36
33
  end
37
34
  end
38
35
 
@@ -13,8 +13,8 @@ Rails.application.configure do
13
13
  config.eager_load = false
14
14
 
15
15
  # Configure static file server for tests with Cache-Control for performance.
16
- config.serve_static_files = true
17
- config.static_cache_control = 'public, max-age=3600'
16
+ config.public_file_server.enabled = true
17
+ config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
18
18
 
19
19
  # Show full error reports and disable caching.
20
20
  config.consider_all_requests_local = true
@@ -1,7 +1,7 @@
1
1
  if Rails.configuration.cache_classes
2
2
  ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
3
3
  else
4
- ActionDispatch::Reloader.to_prepare do
4
+ ActiveSupport::Reloader.to_prepare do
5
5
  ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
6
6
  end
7
7
  end
@@ -1,5 +1,5 @@
1
- class CreateProducts < ActiveRecord::Migration
2
- def change
1
+ class CreateProducts < ActiveRecord::Migration[4.2]
2
+ def change
3
3
  create_table :products do |t|
4
4
  t.integer :shop_id, limit: 8
5
5
  t.jsonb :data
@@ -1,5 +1,5 @@
1
- class CreateAssetModels < ActiveRecord::Migration
2
- def change
1
+ class CreateAssetModels < ActiveRecord::Migration[4.2]
2
+ def change
3
3
  create_table :js_configurations do |t|
4
4
  t.integer :shop_id, limit: 8
5
5
  t.string :label, default: 'Default'
@@ -1,5 +1,6 @@
1
- class CreateCarts < ActiveRecord::Migration
2
- def change
1
+ class CreateCarts < ActiveRecord::Migration[4.2]
2
+
3
+ def change
3
4
  create_table :carts do |t|
4
5
  t.integer :shop_id, limit: 8
5
6
  t.string :token