disco_app 0.15.2 → 0.18.1
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.
- checksums.yaml +4 -4
- data/Rakefile +1 -5
- data/app/clients/disco_app/api_client.rb +25 -19
- data/app/clients/disco_app/graphql_client.rb +85 -0
- data/app/controllers/disco_app/admin/app_settings_controller.rb +2 -0
- data/app/controllers/disco_app/admin/application_controller.rb +1 -0
- data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +2 -1
- data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +5 -3
- data/app/controllers/disco_app/admin/concerns/plans_controller.rb +3 -2
- data/app/controllers/disco_app/admin/concerns/shops_controller.rb +1 -0
- data/app/controllers/disco_app/admin/concerns/sources_controller.rb +2 -1
- data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +3 -2
- data/app/controllers/disco_app/admin/plans_controller.rb +2 -0
- data/app/controllers/disco_app/admin/resources/shops_controller.rb +2 -0
- data/app/controllers/disco_app/admin/shops_controller.rb +2 -0
- data/app/controllers/disco_app/admin/sources_controller.rb +2 -0
- data/app/controllers/disco_app/admin/subscriptions_controller.rb +2 -0
- data/app/controllers/disco_app/charges_controller.rb +6 -7
- data/app/controllers/disco_app/concerns/app_proxy_controller.rb +6 -6
- data/app/controllers/disco_app/concerns/authenticated_controller.rb +26 -27
- data/app/controllers/disco_app/concerns/carrier_request_controller.rb +22 -11
- data/app/controllers/disco_app/concerns/user_authenticated_controller.rb +1 -0
- data/app/controllers/disco_app/concerns/webhooks_controller.rb +13 -12
- data/app/controllers/disco_app/flow/actions_controller.rb +9 -0
- data/app/controllers/disco_app/flow/concerns/actions_controller.rb +23 -0
- data/app/controllers/disco_app/flow/concerns/trigger_usage_controller.rb +29 -0
- data/app/controllers/disco_app/flow/concerns/verifies_flow_payload.rb +39 -0
- data/app/controllers/disco_app/flow/trigger_usage_controller.rb +9 -0
- data/app/controllers/disco_app/frame_controller.rb +0 -1
- data/app/controllers/disco_app/install_controller.rb +3 -6
- data/app/controllers/disco_app/subscriptions_controller.rb +12 -4
- data/app/controllers/disco_app/user_sessions_controller.rb +1 -0
- data/app/controllers/disco_app/webhooks_controller.rb +2 -0
- data/app/controllers/sessions_controller.rb +5 -6
- data/app/helpers/disco_app/application_helper.rb +7 -7
- data/app/jobs/disco_app/app_installed_job.rb +2 -0
- data/app/jobs/disco_app/app_uninstalled_job.rb +2 -0
- data/app/jobs/disco_app/concerns/app_installed_job.rb +2 -3
- data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +2 -1
- data/app/jobs/disco_app/concerns/customers_data_request_job.rb +13 -0
- data/app/jobs/disco_app/concerns/customers_redact_job.rb +13 -0
- data/app/jobs/disco_app/concerns/render_asset_group_job.rb +1 -0
- data/app/jobs/disco_app/concerns/shop_redact_job.rb +13 -0
- data/app/jobs/disco_app/concerns/shop_update_job.rb +9 -2
- data/app/jobs/disco_app/concerns/subscription_changed_job.rb +2 -1
- data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +8 -7
- data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +1 -0
- data/app/jobs/disco_app/concerns/synchronise_users_job.rb +6 -3
- data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +24 -11
- data/app/jobs/disco_app/customers_data_request_job.rb +5 -0
- data/app/jobs/disco_app/customers_redact_job.rb +5 -0
- data/app/jobs/disco_app/flow/process_action_job.rb +11 -0
- data/app/jobs/disco_app/flow/process_trigger_job.rb +11 -0
- data/app/jobs/disco_app/render_asset_group_job.rb +2 -0
- data/app/jobs/disco_app/shop_job.rb +10 -10
- data/app/jobs/disco_app/shop_redact_job.rb +5 -0
- data/app/jobs/disco_app/shop_update_job.rb +2 -0
- data/app/jobs/disco_app/subscription_changed_job.rb +2 -0
- data/app/jobs/disco_app/synchronise_carrier_service_job.rb +2 -0
- data/app/jobs/disco_app/synchronise_resources_job.rb +2 -0
- data/app/jobs/disco_app/synchronise_users_job.rb +2 -0
- data/app/jobs/disco_app/synchronise_webhooks_job.rb +2 -0
- data/app/models/application_record.rb +2 -0
- data/app/models/disco_app/app_settings.rb +2 -0
- data/app/models/disco_app/application_charge.rb +1 -1
- data/app/models/disco_app/concerns/app_settings.rb +2 -0
- data/app/models/disco_app/concerns/can_be_liquified.rb +29 -14
- data/app/models/disco_app/concerns/has_metafields.rb +1 -2
- data/app/models/disco_app/concerns/plan.rb +3 -4
- data/app/models/disco_app/concerns/plan_code.rb +1 -2
- data/app/models/disco_app/concerns/renders_assets.rb +15 -21
- data/app/models/disco_app/concerns/shop.rb +20 -14
- data/app/models/disco_app/concerns/source.rb +2 -3
- data/app/models/disco_app/concerns/subscription.rb +3 -3
- data/app/models/disco_app/concerns/synchronises.rb +10 -15
- data/app/models/disco_app/concerns/taggable.rb +1 -0
- data/app/models/disco_app/concerns/user.rb +3 -2
- data/app/models/disco_app/flow/action.rb +9 -0
- data/app/models/disco_app/flow/concerns/action.rb +27 -0
- data/app/models/disco_app/flow/concerns/trigger.rb +28 -0
- data/app/models/disco_app/flow/concerns/trigger_usage.rb +17 -0
- data/app/models/disco_app/flow/trigger.rb +9 -0
- data/app/models/disco_app/flow/trigger_usage.rb +9 -0
- data/app/models/disco_app/plan.rb +2 -0
- data/app/models/disco_app/plan_code.rb +2 -0
- data/app/models/disco_app/session_storage.rb +5 -2
- data/app/models/disco_app/shop.rb +2 -0
- data/app/models/disco_app/source.rb +2 -0
- data/app/models/disco_app/subscription.rb +2 -0
- data/app/models/disco_app/user.rb +2 -0
- data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +12 -15
- data/app/resources/disco_app/admin/resources/shop_resource.rb +1 -0
- data/app/services/disco_app/carrier_request_service.rb +3 -3
- data/app/services/disco_app/charges_service.rb +26 -34
- data/app/services/disco_app/flow/create_action.rb +35 -0
- data/app/services/disco_app/flow/create_trigger.rb +34 -0
- data/app/services/disco_app/flow/process_action.rb +50 -0
- data/app/services/disco_app/flow/process_trigger.rb +72 -0
- data/app/services/disco_app/flow/update_trigger_usage.rb +42 -0
- data/app/services/disco_app/partner_app_service.rb +1 -1
- data/app/services/disco_app/proxy_service.rb +2 -2
- data/app/services/disco_app/request_validation_service.rb +2 -2
- data/app/services/disco_app/subscription_service.rb +60 -32
- data/app/services/disco_app/webhook_service.rb +9 -11
- data/app/views/layouts/admin.html.erb +1 -2
- data/app/views/layouts/application.html.erb +1 -2
- data/app/views/layouts/embedded_app.html.erb +2 -4
- data/app/views/layouts/embedded_app_modal.html.erb +2 -3
- data/app/views/shopify_app/sessions/new.html.erb +2 -4
- data/config/routes.rb +11 -3
- data/db/migrate/20150525000000_create_shops_if_not_existent.rb +80 -80
- data/db/migrate/20170315062548_create_disco_app_sources.rb +2 -0
- data/db/migrate/20170315062629_add_sources_to_shop_subscriptions.rb +3 -1
- data/db/migrate/20170327214540_create_disco_app_users.rb +2 -1
- data/db/migrate/20170606160751_fix_disco_app_users_index.rb +2 -0
- data/db/migrate/20181229100327_create_flow_actions_and_triggers.rb +32 -0
- data/db/migrate/20200405000000_create_flow_trigger_usages.rb +16 -0
- data/lib/disco_app/configuration.rb +12 -5
- data/lib/disco_app/constants.rb +4 -2
- data/lib/disco_app/engine.rb +1 -1
- data/lib/disco_app/session.rb +1 -0
- data/lib/disco_app/support/file_fixtures.rb +2 -1
- data/lib/disco_app/version.rb +3 -1
- data/lib/generators/disco_app/install/USAGE +5 -0
- data/lib/generators/disco_app/install/install_generator.rb +297 -0
- data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/application.js +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/components.js +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/assets/stylesheets/application.scss +0 -0
- data/lib/generators/disco_app/install/templates/config/appsignal.yml +12 -0
- data/lib/generators/disco_app/install/templates/config/cable.yml.tt +11 -0
- data/lib/generators/disco_app/{templates → install/templates}/config/database.yml.tt +6 -3
- data/lib/generators/disco_app/install/templates/config/environments/staging.rb +108 -0
- data/lib/generators/disco_app/{templates → install/templates}/config/puma.rb +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/controllers/home_controller.rb +1 -0
- data/lib/generators/disco_app/{templates → install/templates}/initializers/disco_app.rb +5 -0
- data/lib/generators/disco_app/install/templates/initializers/session_store.rb +2 -0
- data/lib/generators/disco_app/install/templates/initializers/shopify_app.rb +11 -0
- data/lib/generators/disco_app/{templates → install/templates}/initializers/shopify_session_repository.rb +0 -0
- data/lib/generators/disco_app/install/templates/initializers/timber.rb +4 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.editorconfig +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.env +7 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.env.local +4 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.gitignore +6 -0
- data/lib/generators/disco_app/install/templates/root/.rspec +1 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/.rubocop.yml +315 -217
- data/lib/generators/disco_app/install/templates/root/.tool-versions +2 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/CHECKS +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/Procfile +0 -0
- data/lib/generators/disco_app/{templates → install/templates}/root/README.md +0 -0
- data/lib/generators/disco_app/install/templates/root/package.json.tt +17 -0
- data/lib/generators/disco_app/install/templates/spec/rails_helper.rb +40 -0
- data/lib/generators/disco_app/install/templates/spec/spec_helper.rb +24 -0
- data/lib/generators/disco_app/install/templates/spec/support/active_job.rb +13 -0
- data/lib/generators/disco_app/install/templates/spec/support/coveralls.rb +3 -0
- data/lib/generators/disco_app/install/templates/spec/support/database_cleaner.rb +17 -0
- data/lib/generators/disco_app/install/templates/spec/support/factory_bot.rb +3 -0
- data/lib/generators/disco_app/install/templates/spec/support/helpers/json_helper.rb +13 -0
- data/lib/generators/disco_app/install/templates/spec/support/shared_examples/a_synchronise_job.rb +12 -0
- data/lib/generators/disco_app/install/templates/spec/support/shoulda.rb +6 -0
- data/lib/generators/disco_app/install/templates/spec/support/vcr.rb +14 -0
- data/lib/generators/disco_app/install/templates/spec/support/webmock.rb +8 -0
- data/lib/generators/disco_app/{templates → install/templates}/views/home/index.html.erb +0 -0
- data/lib/generators/disco_app/react/USAGE +5 -0
- data/lib/generators/disco_app/react/react_generator.rb +108 -0
- data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/base_controller.rb +18 -0
- data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/home_controller.rb +10 -0
- data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/shops_controller.rb +11 -0
- data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/users_controller.rb +11 -0
- data/lib/generators/disco_app/react/templates/app/controllers/embedded/home_controller.rb +13 -0
- data/lib/generators/disco_app/react/templates/app/models/api_response.rb +107 -0
- data/lib/generators/disco_app/react/templates/app/serializers/disco_app/shop_serializer.rb +13 -0
- data/lib/generators/disco_app/react/templates/app/serializers/disco_app/user_serializer.rb +13 -0
- data/lib/generators/disco_app/react/templates/app/serializers/empty_serializer.rb +5 -0
- data/lib/generators/disco_app/react/templates/app/serializers/error_serializer.rb +76 -0
- data/lib/generators/disco_app/react/templates/app/views/embedded/home/index.html.erb +12 -0
- data/lib/generators/disco_app/react/templates/app/views/layouts/embedded.html.erb +10 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/App.jsx +77 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/HomePage.jsx +34 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/EmbeddedPage.jsx +70 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ErrorBanner.jsx +58 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/PaginationWrapper.jsx +10 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ScrollToTop.jsx +23 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/withApi.jsx +125 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/index.jsx +39 -0
- data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/utils.js +19 -0
- data/lib/generators/disco_app/react/templates/app/webpack/packs/embedded.js +2 -0
- data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/banners.scss +7 -0
- data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/busy.scss +3 -0
- data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/index.scss +3 -0
- data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/pagination.scss +5 -0
- data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded.scss +2 -0
- data/lib/generators/disco_app/react/templates/config/initializers/mime_types.rb +13 -0
- data/lib/generators/disco_app/react/templates/config/initializers/omniauth.rb +27 -0
- data/lib/generators/disco_app/react/templates/config/initializers/version.rb.tt +7 -0
- data/lib/generators/disco_app/react/templates/config/webpack/staging.js +5 -0
- data/lib/generators/disco_app/react/templates/config/webpack/test.js +5 -0
- data/lib/generators/disco_app/react/templates/config/webpacker.yml +96 -0
- data/lib/generators/disco_app/react/templates/root/.eslintignore +5 -0
- data/lib/generators/disco_app/react/templates/root/.eslintrc +69 -0
- data/lib/generators/disco_app/react/templates/root/.prettierrc +3 -0
- data/lib/generators/disco_app/react/templates/root/VERSION +1 -0
- data/lib/generators/disco_app/react/templates/root/babel.config.js +72 -0
- data/lib/generators/disco_app/react/templates/root/package.json.tt +84 -0
- data/lib/generators/disco_app/react/templates/root/postcss.config.js +14 -0
- data/lib/tasks/api.rake +0 -2
- data/lib/tasks/carrier_service.rake +0 -2
- data/lib/tasks/database.rake +1 -1
- data/lib/tasks/sessions.rake +0 -2
- data/lib/tasks/shops.rake +0 -2
- data/lib/tasks/users.rake +0 -2
- data/lib/tasks/webhooks.rake +0 -2
- data/test/clients/disco_app/api_client_test.rb +3 -3
- data/test/controllers/disco_app/admin/shops_controller_test.rb +1 -0
- data/test/controllers/disco_app/charges_controller_test.rb +8 -9
- data/test/controllers/disco_app/flow/trigger_usage_controller_test.rb +41 -0
- data/test/controllers/disco_app/install_controller_test.rb +2 -1
- data/test/controllers/disco_app/subscriptions_controller_test.rb +2 -1
- data/test/controllers/disco_app/webhooks_controller_test.rb +1 -0
- data/test/controllers/home_controller_test.rb +1 -1
- data/test/disco_app_test.rb +3 -1
- data/test/dummy/Rakefile +1 -1
- data/test/dummy/app/assets/config/manifest.js +2 -0
- data/test/dummy/app/controllers/application_controller.rb +2 -0
- data/test/dummy/app/controllers/carrier_request_controller.rb +1 -0
- data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +1 -0
- data/test/dummy/app/controllers/home_controller.rb +1 -0
- data/test/dummy/app/controllers/proxy_controller.rb +1 -0
- data/test/dummy/app/javascript/packs/application.js +18 -0
- data/test/dummy/app/jobs/disco_app/app_installed_job.rb +2 -3
- data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +1 -0
- data/test/dummy/app/models/application_record.rb +2 -0
- data/test/dummy/app/models/cart.rb +4 -3
- data/test/dummy/app/models/disco_app/shop.rb +4 -5
- data/test/dummy/app/models/js_configuration.rb +1 -0
- data/test/dummy/app/models/product.rb +3 -2
- data/test/dummy/app/models/widget_configuration.rb +1 -0
- data/test/dummy/babel.config.js +72 -0
- data/test/dummy/bin/bundle +1 -1
- data/test/dummy/bin/rails +1 -1
- data/test/dummy/bin/setup +8 -8
- data/test/dummy/bin/webpack +19 -0
- data/test/dummy/bin/webpack-dev-server +19 -0
- data/test/dummy/config/application.rb +4 -3
- data/test/dummy/config/boot.rb +2 -2
- data/test/dummy/config/database.yml +3 -0
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/staging.rb +85 -0
- data/test/dummy/config/initializers/disco_app.rb +8 -1
- data/test/dummy/config/initializers/omniauth.rb +3 -4
- data/test/dummy/config/initializers/session_store.rb +1 -1
- data/test/dummy/config/initializers/shopify_app.rb +1 -0
- data/test/dummy/config/routes.rb +0 -2
- data/test/dummy/config/secrets.yml +3 -0
- data/test/dummy/config/webpack/development.js +5 -0
- data/test/dummy/config/webpack/environment.js +3 -0
- data/test/dummy/config/webpack/production.js +5 -0
- data/test/dummy/config/webpack/test.js +5 -0
- data/test/dummy/config/webpacker.yml +95 -0
- data/test/dummy/db/migrate/20160307182229_create_products.rb +3 -1
- data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +3 -1
- data/test/dummy/db/migrate/20161105054746_create_carts.rb +2 -1
- data/test/dummy/db/schema.rb +45 -6
- data/test/dummy/package.json +8 -0
- data/test/dummy/postcss.config.js +12 -0
- data/test/dummy/yarn.lock +7244 -0
- data/test/fixtures/api/subscriptions/valid_request.json +1 -1
- data/test/fixtures/api/widget_store/empty_webhooks.json +3 -0
- data/test/fixtures/api/widget_store/existing_webhooks.json +43 -0
- data/test/fixtures/disco_app/shops.yml +3 -0
- data/test/fixtures/webhooks/flow/trigger_usage.json +7 -0
- data/test/integration/synchronises_test.rb +2 -1
- data/test/jobs/disco_app/app_installed_job_test.rb +28 -9
- data/test/jobs/disco_app/app_uninstalled_job_test.rb +5 -2
- data/test/jobs/disco_app/send_subscription_job_test.rb +3 -2
- data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +1 -0
- data/test/jobs/disco_app/synchronise_users_job_test.rb +1 -0
- data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +70 -13
- data/test/models/disco_app/can_be_liquified_test.rb +3 -1
- data/test/models/disco_app/has_metafields_test.rb +37 -18
- data/test/models/disco_app/renders_assets_test.rb +2 -1
- data/test/models/disco_app/session_test.rb +2 -2
- data/test/models/disco_app/shop_test.rb +1 -1
- data/test/services/disco_app/charges_service_test.rb +7 -8
- data/test/services/disco_app/flow/create_action_test.rb +51 -0
- data/test/services/disco_app/flow/create_trigger_test.rb +56 -0
- data/test/services/disco_app/flow/process_action_test.rb +68 -0
- data/test/services/disco_app/flow/process_trigger_test.rb +94 -0
- data/test/services/disco_app/flow/update_trigger_usage_test.rb +87 -0
- data/test/services/disco_app/subscription_service_test.rb +3 -2
- data/test/support/test_file_fixtures.rb +2 -2
- data/test/support/test_shopify_api.rb +1 -1
- data/test/test_helper.rb +10 -7
- data/test/vcr/flow_trigger_invalid_title.yml +35 -0
- data/test/vcr/flow_trigger_valid.yml +38 -0
- data/test/vcr/webhook_failure.yml +13 -13
- metadata +282 -148
- data/app/clients/disco_app/disco_api_error.rb +0 -2
- data/app/clients/disco_app/rollbar_client.rb +0 -53
- data/app/clients/disco_app/rollbar_client_error.rb +0 -2
- data/lib/generators/disco_app/USAGE +0 -5
- data/lib/generators/disco_app/disco_app_generator.rb +0 -236
- data/lib/generators/disco_app/templates/config/newrelic.yml +0 -26
- data/lib/generators/disco_app/templates/initializers/rollbar.rb +0 -23
- data/lib/generators/disco_app/templates/initializers/session_store.rb +0 -2
- data/lib/generators/disco_app/templates/initializers/shopify_app.rb +0 -6
- data/lib/generators/disco_app/templates/root/.codeclimate.yml +0 -7
- data/lib/generators/disco_app/templates/root/.ruby-version +0 -1
- data/lib/tasks/rollbar.rake +0 -24
- data/test/fixtures/api/widget_store/webhooks.json +0 -1
@@ -0,0 +1,69 @@
|
|
1
|
+
{
|
2
|
+
"env": {
|
3
|
+
"browser": true,
|
4
|
+
"es6": true,
|
5
|
+
"jest": true
|
6
|
+
},
|
7
|
+
"extends": [
|
8
|
+
"airbnb",
|
9
|
+
"plugin:prettier/recommended",
|
10
|
+
"plugin:import/errors",
|
11
|
+
"plugin:import/warnings",
|
12
|
+
"plugin:jest/recommended"
|
13
|
+
],
|
14
|
+
"parser": "babel-eslint",
|
15
|
+
"parserOptions": {
|
16
|
+
"ecmaFeatures": {
|
17
|
+
"jsx": true,
|
18
|
+
"modules": true
|
19
|
+
},
|
20
|
+
"ecmaVersion": 8,
|
21
|
+
"sourceType": "module"
|
22
|
+
},
|
23
|
+
"plugins": [
|
24
|
+
"jest"
|
25
|
+
],
|
26
|
+
"root": true,
|
27
|
+
"rules": {
|
28
|
+
"import/first": "off",
|
29
|
+
"import/no-extraneous-dependencies": [
|
30
|
+
"error",
|
31
|
+
{
|
32
|
+
"devDependencies": [
|
33
|
+
"app/webpack/**/*.spec.*",
|
34
|
+
"spec/javascripts/setupTests.js"
|
35
|
+
]
|
36
|
+
}
|
37
|
+
],
|
38
|
+
"import/order": [
|
39
|
+
"error",
|
40
|
+
{
|
41
|
+
"groups": [
|
42
|
+
"builtin",
|
43
|
+
"external",
|
44
|
+
"parent",
|
45
|
+
"sibling",
|
46
|
+
"index"
|
47
|
+
]
|
48
|
+
}
|
49
|
+
],
|
50
|
+
"jsx-a11y/anchor-is-valid": "off",
|
51
|
+
"no-console": [
|
52
|
+
"error",
|
53
|
+
{
|
54
|
+
"allow": [
|
55
|
+
"error"
|
56
|
+
]
|
57
|
+
}
|
58
|
+
],
|
59
|
+
"no-return-assign": [
|
60
|
+
"error",
|
61
|
+
"except-parens"
|
62
|
+
],
|
63
|
+
"react/destructuring-assignment": "off",
|
64
|
+
"react/forbid-prop-types": "off",
|
65
|
+
"react/jsx-one-expression-per-line": "off",
|
66
|
+
"react/no-access-state-in-setstate": "off",
|
67
|
+
"react/no-danger": "off"
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module.exports = api => {
|
2
|
+
const validEnv = ['development', 'test', 'production'];
|
3
|
+
const currentEnv = api.env();
|
4
|
+
const isDevelopmentEnv = api.env('development');
|
5
|
+
const isProductionEnv = api.env('production');
|
6
|
+
const isTestEnv = api.env('test');
|
7
|
+
|
8
|
+
if (!validEnv.includes(currentEnv)) {
|
9
|
+
throw new Error(
|
10
|
+
`${'Please specify a valid `NODE_ENV` or ' +
|
11
|
+
'`BABEL_ENV` environment variables. Valid values are "development", ' +
|
12
|
+
'"test", and "production". Instead, received: '}${JSON.stringify(
|
13
|
+
currentEnv
|
14
|
+
)}.`
|
15
|
+
);
|
16
|
+
}
|
17
|
+
|
18
|
+
return {
|
19
|
+
presets: [
|
20
|
+
isTestEnv && [
|
21
|
+
'@babel/preset-env',
|
22
|
+
{
|
23
|
+
modules: 'commonjs',
|
24
|
+
targets: {
|
25
|
+
node: 'current'
|
26
|
+
}
|
27
|
+
}
|
28
|
+
],
|
29
|
+
(isProductionEnv || isDevelopmentEnv) && [
|
30
|
+
'@babel/preset-env',
|
31
|
+
{
|
32
|
+
forceAllTransforms: true,
|
33
|
+
useBuiltIns: 'entry',
|
34
|
+
modules: false,
|
35
|
+
exclude: ['transform-typeof-symbol']
|
36
|
+
}
|
37
|
+
],
|
38
|
+
'@babel/preset-react'
|
39
|
+
].filter(Boolean),
|
40
|
+
plugins: [
|
41
|
+
'babel-plugin-macros',
|
42
|
+
'@babel/plugin-syntax-dynamic-import',
|
43
|
+
isTestEnv && 'babel-plugin-dynamic-import-node',
|
44
|
+
'@babel/plugin-transform-destructuring',
|
45
|
+
[
|
46
|
+
'@babel/plugin-proposal-class-properties',
|
47
|
+
{
|
48
|
+
loose: true
|
49
|
+
}
|
50
|
+
],
|
51
|
+
[
|
52
|
+
'@babel/plugin-proposal-object-rest-spread',
|
53
|
+
{
|
54
|
+
useBuiltIns: true
|
55
|
+
}
|
56
|
+
],
|
57
|
+
[
|
58
|
+
'@babel/plugin-transform-runtime',
|
59
|
+
{
|
60
|
+
helpers: false,
|
61
|
+
regenerator: true
|
62
|
+
}
|
63
|
+
],
|
64
|
+
[
|
65
|
+
'@babel/plugin-transform-regenerator',
|
66
|
+
{
|
67
|
+
async: false
|
68
|
+
}
|
69
|
+
]
|
70
|
+
].filter(Boolean)
|
71
|
+
};
|
72
|
+
};
|
@@ -0,0 +1,84 @@
|
|
1
|
+
{
|
2
|
+
"name": "<%= Rails.application.class.parent_name.underscore.dasherize %>",
|
3
|
+
"private": true,
|
4
|
+
"scripts": {
|
5
|
+
"lint": "eslint app/webpack -c .eslintrc --ext js,jsx",
|
6
|
+
"test": "jest",
|
7
|
+
"test-watch": "jest --watch"
|
8
|
+
},
|
9
|
+
"jest": {
|
10
|
+
"moduleDirectories": [
|
11
|
+
"app/webpack/javascripts",
|
12
|
+
"node_modules"
|
13
|
+
],
|
14
|
+
"roots": [
|
15
|
+
"app/webpack/javascripts"
|
16
|
+
],
|
17
|
+
"setupFilesAfterEnv": [
|
18
|
+
"<rootDir>spec/javascripts/setupTests.js"
|
19
|
+
],
|
20
|
+
"testPathIgnorePatterns": [
|
21
|
+
"/config/",
|
22
|
+
"/node_modules/",
|
23
|
+
"/vendor/"
|
24
|
+
],
|
25
|
+
"transform": {
|
26
|
+
"^.+\\.jsx?$": "babel-jest"
|
27
|
+
}
|
28
|
+
},
|
29
|
+
"dependencies": {
|
30
|
+
"@babel/core": "^7.3.4",
|
31
|
+
"@babel/plugin-proposal-class-properties": "^7.3.4",
|
32
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.3.4",
|
33
|
+
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
34
|
+
"@babel/plugin-transform-destructuring": "^7.3.2",
|
35
|
+
"@babel/plugin-transform-regenerator": "^7.3.4",
|
36
|
+
"@babel/plugin-transform-runtime": "^7.3.4",
|
37
|
+
"@babel/preset-env": "^7.3.4",
|
38
|
+
"@babel/preset-react": "^7.0.0",
|
39
|
+
"@rails/webpacker": "^4.0.2",
|
40
|
+
"@shopify/app-bridge": "^1.2.0-0",
|
41
|
+
"@shopify/polaris": "^3.10.0",
|
42
|
+
"axios": "^0.18.0",
|
43
|
+
"babel-plugin-dynamic-import-node": "^2.2.0",
|
44
|
+
"babel-plugin-macros": "^2.5.0",
|
45
|
+
"bugsnag-js": "^4.7.3",
|
46
|
+
"bugsnag-react": "^1.1.1",
|
47
|
+
"kitsu-core": "^7.0.0",
|
48
|
+
"lodash": "^4.17.11",
|
49
|
+
"luxon": "^1.11.4",
|
50
|
+
"numeral": "^2.0.6",
|
51
|
+
"pluralize": "^7.0.0",
|
52
|
+
"postcss-flexbugs-fixes": "^4.1.0",
|
53
|
+
"postcss-import": "^12.0.1",
|
54
|
+
"postcss-preset-env": "^6.6.0",
|
55
|
+
"prop-types": "^15.7.2",
|
56
|
+
"qs": "^6.6.0",
|
57
|
+
"query-string": "^6.4.0",
|
58
|
+
"react": "^16.8.4",
|
59
|
+
"react-dom": "^16.6.3",
|
60
|
+
"react-router-dom": "^4.3.1",
|
61
|
+
"react-router-prop-types": "^1.0.4",
|
62
|
+
"regenerator": "^0.13.3",
|
63
|
+
"url-parse": "^1.4.4"
|
64
|
+
},
|
65
|
+
"devDependencies": {
|
66
|
+
"babel-eslint": "^10.0.1",
|
67
|
+
"babel-jest": "^24.8.0",
|
68
|
+
"enzyme": "^3.10.0",
|
69
|
+
"enzyme-adapter-react-16": "^1.14.0",
|
70
|
+
"eslint": "^5.15.3",
|
71
|
+
"eslint-config-airbnb": "^17.1.0",
|
72
|
+
"eslint-config-prettier": "^4.1.0",
|
73
|
+
"eslint-plugin-import": "^2.16.0",
|
74
|
+
"eslint-plugin-jest": "^22.6.4",
|
75
|
+
"eslint-plugin-jsx-a11y": "^6.2.1",
|
76
|
+
"eslint-plugin-prettier": "^3.0.1",
|
77
|
+
"eslint-plugin-react": "^7.12.4",
|
78
|
+
"jest": "^24.8.0",
|
79
|
+
"jest-enzyme": "^7.0.2",
|
80
|
+
"prettier": "^1.16.4",
|
81
|
+
"react-test-renderer": "^16.8.6",
|
82
|
+
"webpack-dev-server": "^3.2.1"
|
83
|
+
}
|
84
|
+
}
|
data/lib/tasks/api.rake
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
namespace :carrier_service do
|
2
|
-
|
3
2
|
desc 'Synchronise carrier service across all installed shops.'
|
4
3
|
task sync: :environment do
|
5
4
|
DiscoApp::Shop.installed.has_active_shopify_plan.each do |shop|
|
6
5
|
DiscoApp::SynchroniseCarrierServiceJob.perform_later(shop)
|
7
6
|
end
|
8
7
|
end
|
9
|
-
|
10
8
|
end
|
data/lib/tasks/database.rake
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
namespace :database do
|
2
|
-
desc
|
2
|
+
desc 'update postgres sequence numbers in case database has been migrated'
|
3
3
|
task update_sequences: :environment do
|
4
4
|
ActiveRecord::Base.connection.tables.each do |t|
|
5
5
|
ActiveRecord::Base.connection.reset_pk_sequence!(t)
|
data/lib/tasks/sessions.rake
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
namespace :sessions do
|
2
|
-
|
3
2
|
desc 'Clean out any stale sessions.'
|
4
3
|
task clean: [:environment, 'db:load_config'] do
|
5
4
|
threshold = (ENV['SESSIONS_CLEAN_THRESHOLD_DAYS'] || 30).to_i.days.ago
|
6
5
|
ActiveRecord::Base.connection.execute("DELETE FROM #{ActiveRecord::SessionStore::Session.table_name} WHERE updated_at < '#{threshold}'")
|
7
6
|
end
|
8
|
-
|
9
7
|
end
|
data/lib/tasks/shops.rake
CHANGED
data/lib/tasks/users.rake
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
namespace :users do
|
2
|
-
|
3
2
|
desc 'Synchronise user data accross all installed shops'
|
4
3
|
task sync: :environment do
|
5
4
|
DiscoApp::Shop.installed.has_active_shopify_plan.shopify_plus.each do |shop|
|
6
5
|
DiscoApp::SynchroniseUsersJob.perform_later(shop)
|
7
6
|
end
|
8
7
|
end
|
9
|
-
|
10
8
|
end
|
data/lib/tasks/webhooks.rake
CHANGED
@@ -4,9 +4,9 @@ class ApiClientTest < ActiveSupport::TestCase
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
@shop = disco_app_shops(:widget_store)
|
7
|
-
stub_request(:post,
|
8
|
-
|
9
|
-
|
7
|
+
stub_request(:post, 'https://api.discolabs.com/v1/app_subscriptions.json')
|
8
|
+
.with(body: api_fixture('subscriptions/valid_request').to_json)
|
9
|
+
.to_return(status: 200, body: api_fixture('subscriptions/valid_request').to_json)
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DiscoApp::ChargesControllerTest < ActionController::TestCase
|
4
|
+
|
4
5
|
include ActiveJob::TestHelper
|
5
6
|
include DiscoApp::Test::ShopifyAPI
|
6
7
|
|
@@ -22,7 +23,7 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
|
|
22
23
|
test 'non-logged in user is redirected to the login page' do
|
23
24
|
log_out
|
24
25
|
get :new, params: { subscription_id: @current_subscription }
|
25
|
-
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path
|
26
|
+
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path + "?" + { return_to: session[:return_to] }.to_query
|
26
27
|
end
|
27
28
|
|
28
29
|
test 'logged-in, never installed user is redirected to the install page' do
|
@@ -43,15 +44,13 @@ class DiscoApp::ChargesControllerTest < ActionController::TestCase
|
|
43
44
|
end
|
44
45
|
|
45
46
|
test 'user with unpaid current subscription can create new charge and is redirected to confirmation url' do
|
46
|
-
res = { "recurring_application_charge": { "name":
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
} }
|
47
|
+
res = { "recurring_application_charge": { "name": 'Basic',
|
48
|
+
"price": '9.99',
|
49
|
+
"trial_days": 14,
|
50
|
+
"return_url": %r{^https://test\.example\.com/subscriptions/304261385/charges/53297050(1|2)/activate$},
|
51
|
+
"test": true } }
|
52
52
|
stub_request(:post, "#{@shop.admin_url}/recurring_application_charges.json")
|
53
|
-
.with(body: res
|
54
|
-
).to_return(status: 201, body:api_fixture("widget_store/charges/create_second_recurring_application_charge_response").to_json)
|
53
|
+
.with(body: res).to_return(status: 201, body: api_fixture('widget_store/charges/create_second_recurring_application_charge_response').to_json)
|
55
54
|
|
56
55
|
@current_subscription.active_charge.destroy
|
57
56
|
post :create, params: { subscription_id: @current_subscription }
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module DiscoApp
|
4
|
+
module Flow
|
5
|
+
class TriggerUsageControllerTest < ActionController::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@shop = disco_app_shops(:widget_store)
|
9
|
+
@routes = DiscoApp::Engine.routes
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
@shop = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'trigger usage request with no hmac returns unauthorized and does not process' do
|
17
|
+
body = webhook_fixture('flow/trigger_usage')
|
18
|
+
post :update_trigger_usage, body: body, as: :json
|
19
|
+
assert_response :unauthorized
|
20
|
+
assert_equal 0, @shop.flow_trigger_usages.count
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'trigger usage request with invalid hmac returns unauthorized and does not process' do
|
24
|
+
body = webhook_fixture('flow/trigger_usage')
|
25
|
+
@request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = '4b5a5762352c9e9a8f4307f0e0ce6919370f1602bdedb331db3b7203de5ade6f'
|
26
|
+
post :update_trigger_usage, body: body, as: :json
|
27
|
+
assert_response :unauthorized
|
28
|
+
assert_equal 0, @shop.flow_trigger_usages.count
|
29
|
+
end
|
30
|
+
|
31
|
+
test 'trigger usage request with valid hmac returns ok and does process' do
|
32
|
+
body = webhook_fixture('flow/trigger_usage')
|
33
|
+
@request.headers['HTTP_X_SHOPIFY_HMAC_SHA256'] = DiscoApp::WebhookService.calculated_hmac(body, ShopifyApp.configuration.secret)
|
34
|
+
post :update_trigger_usage, body: body, as: :json
|
35
|
+
assert_response :ok
|
36
|
+
assert_equal 1, @shop.flow_trigger_usages.count
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DiscoApp::InstallControllerTest < ActionController::TestCase
|
4
|
+
|
4
5
|
include ActiveJob::TestHelper
|
5
6
|
|
6
7
|
def setup
|
@@ -23,7 +24,7 @@ class DiscoApp::InstallControllerTest < ActionController::TestCase
|
|
23
24
|
|
24
25
|
test 'logged-in and installed user is redirected to installing url for install/uninstalling actions' do
|
25
26
|
@shop.installed!
|
26
|
-
[:install, :uninstalling].each do |
|
27
|
+
[:install, :uninstalling].each do |_action|
|
27
28
|
get(:install)
|
28
29
|
assert_redirected_to :installing
|
29
30
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DiscoApp::SubscriptionsControllerTest < ActionController::TestCase
|
4
|
+
|
4
5
|
include ActiveJob::TestHelper
|
5
6
|
|
6
7
|
def setup
|
@@ -18,7 +19,7 @@ class DiscoApp::SubscriptionsControllerTest < ActionController::TestCase
|
|
18
19
|
test 'non-logged in user is redirected to the login page' do
|
19
20
|
log_out
|
20
21
|
get(:new)
|
21
|
-
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path
|
22
|
+
assert_redirected_to ShopifyApp::Engine.routes.url_helpers.login_path + "?" + { return_to: session[:return_to] }.to_query
|
22
23
|
end
|
23
24
|
|
24
25
|
test 'logged-in, never installed user is redirected to the install page' do
|
@@ -94,7 +94,7 @@ class HomeControllerTest < ActionController::TestCase
|
|
94
94
|
Timecop.freeze('2017-03-08 12:44:58 +1100') do
|
95
95
|
hmac = 'eb49ba93a8daf8a11a04c66129faf98de1cd40f082b0ae78e79a2dfbbefb438d'
|
96
96
|
get :index, params: { hmac: hmac, shop: 'widgets-dev.myshopify.com', timestamp: Time.now.to_i }
|
97
|
-
assert_response
|
97
|
+
assert_response :success
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
data/test/disco_app_test.rb
CHANGED
data/test/dummy/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
2
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
3
|
|
4
|
-
require File.expand_path('
|
4
|
+
require File.expand_path('config/application', __dir__)
|
5
5
|
|
6
6
|
Rails.application.load_tasks
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/* eslint no-console:0 */
|
2
|
+
// This file is automatically compiled by Webpack, along with any other files
|
3
|
+
// present in this directory. You're encouraged to place your actual application logic in
|
4
|
+
// a relevant structure within app/javascript and only use these pack files to reference
|
5
|
+
// that code so it'll be compiled.
|
6
|
+
//
|
7
|
+
// To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
|
8
|
+
// layout file, like app/views/layouts/application.html.erb
|
9
|
+
|
10
|
+
|
11
|
+
// Uncomment to copy all static images under ../images to the output folder and reference
|
12
|
+
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
|
13
|
+
// or the `imagePath` JavaScript helper below.
|
14
|
+
//
|
15
|
+
// const images = require.context('../images', true)
|
16
|
+
// const imagePath = (name) => images(name, true)
|
17
|
+
|
18
|
+
console.log('Hello World from Webpacker')
|
@@ -1,4 +1,5 @@
|
|
1
1
|
class DiscoApp::AppInstalledJob < DiscoApp::ShopJob
|
2
|
+
|
2
3
|
include DiscoApp::Concerns::AppInstalledJob
|
3
4
|
|
4
5
|
DEVELOPMENT_PLAN_ID = 1
|
@@ -7,9 +8,7 @@ class DiscoApp::AppInstalledJob < DiscoApp::ShopJob
|
|
7
8
|
# on their status.
|
8
9
|
def default_plan
|
9
10
|
@default_plan ||= begin
|
10
|
-
if @shop.plan_name === 'affiliate'
|
11
|
-
DiscoApp::Plan.find(DEVELOPMENT_PLAN_ID)
|
12
|
-
end
|
11
|
+
DiscoApp::Plan.find(DEVELOPMENT_PLAN_ID) if @shop.plan_name === 'affiliate'
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
@@ -1,13 +1,14 @@
|
|
1
1
|
class Cart < ApplicationRecord
|
2
|
-
include DiscoApp::Concerns::Synchronises
|
3
2
|
|
4
|
-
|
3
|
+
include DiscoApp::Concerns::Synchronises
|
5
4
|
|
6
5
|
SHOPIFY_API_CLASS = ShopifyAPI::Cart
|
7
6
|
|
7
|
+
belongs_to :shop, class_name: 'DiscoApp::Shop'
|
8
|
+
|
8
9
|
before_save :set_token
|
9
10
|
|
10
|
-
def self.synchronise_by(
|
11
|
+
def self.synchronise_by(_shop, data)
|
11
12
|
{ token: data[:token] }
|
12
13
|
end
|
13
14
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'active_utils'
|
2
2
|
|
3
3
|
class DiscoApp::Shop < ApplicationRecord
|
4
|
+
|
4
5
|
include DiscoApp::Concerns::Shop
|
5
6
|
|
6
7
|
has_one :js_configuration
|
@@ -10,11 +11,9 @@ class DiscoApp::Shop < ApplicationRecord
|
|
10
11
|
|
11
12
|
# Extend the Shop model to return the Shop's country as an ActiveUtils country.
|
12
13
|
def country
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
nil
|
17
|
-
end
|
14
|
+
ActiveUtils::Country.find(data[:country_name])
|
15
|
+
rescue ActiveUtils::InvalidCountryCodeError
|
16
|
+
nil
|
18
17
|
end
|
19
18
|
|
20
19
|
end
|