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.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -5
  3. data/app/clients/disco_app/api_client.rb +25 -19
  4. data/app/clients/disco_app/graphql_client.rb +85 -0
  5. data/app/controllers/disco_app/admin/app_settings_controller.rb +2 -0
  6. data/app/controllers/disco_app/admin/application_controller.rb +1 -0
  7. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +2 -1
  8. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +5 -3
  9. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +3 -2
  10. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +1 -0
  11. data/app/controllers/disco_app/admin/concerns/sources_controller.rb +2 -1
  12. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +3 -2
  13. data/app/controllers/disco_app/admin/plans_controller.rb +2 -0
  14. data/app/controllers/disco_app/admin/resources/shops_controller.rb +2 -0
  15. data/app/controllers/disco_app/admin/shops_controller.rb +2 -0
  16. data/app/controllers/disco_app/admin/sources_controller.rb +2 -0
  17. data/app/controllers/disco_app/admin/subscriptions_controller.rb +2 -0
  18. data/app/controllers/disco_app/charges_controller.rb +6 -7
  19. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +6 -6
  20. data/app/controllers/disco_app/concerns/authenticated_controller.rb +26 -27
  21. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +22 -11
  22. data/app/controllers/disco_app/concerns/user_authenticated_controller.rb +1 -0
  23. data/app/controllers/disco_app/concerns/webhooks_controller.rb +13 -12
  24. data/app/controllers/disco_app/flow/actions_controller.rb +9 -0
  25. data/app/controllers/disco_app/flow/concerns/actions_controller.rb +23 -0
  26. data/app/controllers/disco_app/flow/concerns/trigger_usage_controller.rb +29 -0
  27. data/app/controllers/disco_app/flow/concerns/verifies_flow_payload.rb +39 -0
  28. data/app/controllers/disco_app/flow/trigger_usage_controller.rb +9 -0
  29. data/app/controllers/disco_app/frame_controller.rb +0 -1
  30. data/app/controllers/disco_app/install_controller.rb +3 -6
  31. data/app/controllers/disco_app/subscriptions_controller.rb +12 -4
  32. data/app/controllers/disco_app/user_sessions_controller.rb +1 -0
  33. data/app/controllers/disco_app/webhooks_controller.rb +2 -0
  34. data/app/controllers/sessions_controller.rb +5 -6
  35. data/app/helpers/disco_app/application_helper.rb +7 -7
  36. data/app/jobs/disco_app/app_installed_job.rb +2 -0
  37. data/app/jobs/disco_app/app_uninstalled_job.rb +2 -0
  38. data/app/jobs/disco_app/concerns/app_installed_job.rb +2 -3
  39. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +2 -1
  40. data/app/jobs/disco_app/concerns/customers_data_request_job.rb +13 -0
  41. data/app/jobs/disco_app/concerns/customers_redact_job.rb +13 -0
  42. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +1 -0
  43. data/app/jobs/disco_app/concerns/shop_redact_job.rb +13 -0
  44. data/app/jobs/disco_app/concerns/shop_update_job.rb +9 -2
  45. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +2 -1
  46. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +8 -7
  47. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +1 -0
  48. data/app/jobs/disco_app/concerns/synchronise_users_job.rb +6 -3
  49. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +24 -11
  50. data/app/jobs/disco_app/customers_data_request_job.rb +5 -0
  51. data/app/jobs/disco_app/customers_redact_job.rb +5 -0
  52. data/app/jobs/disco_app/flow/process_action_job.rb +11 -0
  53. data/app/jobs/disco_app/flow/process_trigger_job.rb +11 -0
  54. data/app/jobs/disco_app/render_asset_group_job.rb +2 -0
  55. data/app/jobs/disco_app/shop_job.rb +10 -10
  56. data/app/jobs/disco_app/shop_redact_job.rb +5 -0
  57. data/app/jobs/disco_app/shop_update_job.rb +2 -0
  58. data/app/jobs/disco_app/subscription_changed_job.rb +2 -0
  59. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +2 -0
  60. data/app/jobs/disco_app/synchronise_resources_job.rb +2 -0
  61. data/app/jobs/disco_app/synchronise_users_job.rb +2 -0
  62. data/app/jobs/disco_app/synchronise_webhooks_job.rb +2 -0
  63. data/app/models/application_record.rb +2 -0
  64. data/app/models/disco_app/app_settings.rb +2 -0
  65. data/app/models/disco_app/application_charge.rb +1 -1
  66. data/app/models/disco_app/concerns/app_settings.rb +2 -0
  67. data/app/models/disco_app/concerns/can_be_liquified.rb +29 -14
  68. data/app/models/disco_app/concerns/has_metafields.rb +1 -2
  69. data/app/models/disco_app/concerns/plan.rb +3 -4
  70. data/app/models/disco_app/concerns/plan_code.rb +1 -2
  71. data/app/models/disco_app/concerns/renders_assets.rb +15 -21
  72. data/app/models/disco_app/concerns/shop.rb +20 -14
  73. data/app/models/disco_app/concerns/source.rb +2 -3
  74. data/app/models/disco_app/concerns/subscription.rb +3 -3
  75. data/app/models/disco_app/concerns/synchronises.rb +10 -15
  76. data/app/models/disco_app/concerns/taggable.rb +1 -0
  77. data/app/models/disco_app/concerns/user.rb +3 -2
  78. data/app/models/disco_app/flow/action.rb +9 -0
  79. data/app/models/disco_app/flow/concerns/action.rb +27 -0
  80. data/app/models/disco_app/flow/concerns/trigger.rb +28 -0
  81. data/app/models/disco_app/flow/concerns/trigger_usage.rb +17 -0
  82. data/app/models/disco_app/flow/trigger.rb +9 -0
  83. data/app/models/disco_app/flow/trigger_usage.rb +9 -0
  84. data/app/models/disco_app/plan.rb +2 -0
  85. data/app/models/disco_app/plan_code.rb +2 -0
  86. data/app/models/disco_app/session_storage.rb +5 -2
  87. data/app/models/disco_app/shop.rb +2 -0
  88. data/app/models/disco_app/source.rb +2 -0
  89. data/app/models/disco_app/subscription.rb +2 -0
  90. data/app/models/disco_app/user.rb +2 -0
  91. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +12 -15
  92. data/app/resources/disco_app/admin/resources/shop_resource.rb +1 -0
  93. data/app/services/disco_app/carrier_request_service.rb +3 -3
  94. data/app/services/disco_app/charges_service.rb +26 -34
  95. data/app/services/disco_app/flow/create_action.rb +35 -0
  96. data/app/services/disco_app/flow/create_trigger.rb +34 -0
  97. data/app/services/disco_app/flow/process_action.rb +50 -0
  98. data/app/services/disco_app/flow/process_trigger.rb +72 -0
  99. data/app/services/disco_app/flow/update_trigger_usage.rb +42 -0
  100. data/app/services/disco_app/partner_app_service.rb +1 -1
  101. data/app/services/disco_app/proxy_service.rb +2 -2
  102. data/app/services/disco_app/request_validation_service.rb +2 -2
  103. data/app/services/disco_app/subscription_service.rb +60 -32
  104. data/app/services/disco_app/webhook_service.rb +9 -11
  105. data/app/views/layouts/admin.html.erb +1 -2
  106. data/app/views/layouts/application.html.erb +1 -2
  107. data/app/views/layouts/embedded_app.html.erb +2 -4
  108. data/app/views/layouts/embedded_app_modal.html.erb +2 -3
  109. data/app/views/shopify_app/sessions/new.html.erb +2 -4
  110. data/config/routes.rb +11 -3
  111. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +80 -80
  112. data/db/migrate/20170315062548_create_disco_app_sources.rb +2 -0
  113. data/db/migrate/20170315062629_add_sources_to_shop_subscriptions.rb +3 -1
  114. data/db/migrate/20170327214540_create_disco_app_users.rb +2 -1
  115. data/db/migrate/20170606160751_fix_disco_app_users_index.rb +2 -0
  116. data/db/migrate/20181229100327_create_flow_actions_and_triggers.rb +32 -0
  117. data/db/migrate/20200405000000_create_flow_trigger_usages.rb +16 -0
  118. data/lib/disco_app/configuration.rb +12 -5
  119. data/lib/disco_app/constants.rb +4 -2
  120. data/lib/disco_app/engine.rb +1 -1
  121. data/lib/disco_app/session.rb +1 -0
  122. data/lib/disco_app/support/file_fixtures.rb +2 -1
  123. data/lib/disco_app/version.rb +3 -1
  124. data/lib/generators/disco_app/install/USAGE +5 -0
  125. data/lib/generators/disco_app/install/install_generator.rb +297 -0
  126. data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/application.js +0 -0
  127. data/lib/generators/disco_app/{templates → install/templates}/assets/javascripts/components.js +0 -0
  128. data/lib/generators/disco_app/{templates → install/templates}/assets/stylesheets/application.scss +0 -0
  129. data/lib/generators/disco_app/install/templates/config/appsignal.yml +12 -0
  130. data/lib/generators/disco_app/install/templates/config/cable.yml.tt +11 -0
  131. data/lib/generators/disco_app/{templates → install/templates}/config/database.yml.tt +6 -3
  132. data/lib/generators/disco_app/install/templates/config/environments/staging.rb +108 -0
  133. data/lib/generators/disco_app/{templates → install/templates}/config/puma.rb +0 -0
  134. data/lib/generators/disco_app/{templates → install/templates}/controllers/home_controller.rb +1 -0
  135. data/lib/generators/disco_app/{templates → install/templates}/initializers/disco_app.rb +5 -0
  136. data/lib/generators/disco_app/install/templates/initializers/session_store.rb +2 -0
  137. data/lib/generators/disco_app/install/templates/initializers/shopify_app.rb +11 -0
  138. data/lib/generators/disco_app/{templates → install/templates}/initializers/shopify_session_repository.rb +0 -0
  139. data/lib/generators/disco_app/install/templates/initializers/timber.rb +4 -0
  140. data/lib/generators/disco_app/{templates → install/templates}/root/.editorconfig +0 -0
  141. data/lib/generators/disco_app/{templates → install/templates}/root/.env +7 -0
  142. data/lib/generators/disco_app/{templates → install/templates}/root/.env.local +4 -0
  143. data/lib/generators/disco_app/{templates → install/templates}/root/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  144. data/lib/generators/disco_app/{templates → install/templates}/root/.gitignore +6 -0
  145. data/lib/generators/disco_app/install/templates/root/.rspec +1 -0
  146. data/lib/generators/disco_app/{templates → install/templates}/root/.rubocop.yml +315 -217
  147. data/lib/generators/disco_app/install/templates/root/.tool-versions +2 -0
  148. data/lib/generators/disco_app/{templates → install/templates}/root/CHECKS +0 -0
  149. data/lib/generators/disco_app/{templates → install/templates}/root/Procfile +0 -0
  150. data/lib/generators/disco_app/{templates → install/templates}/root/README.md +0 -0
  151. data/lib/generators/disco_app/install/templates/root/package.json.tt +17 -0
  152. data/lib/generators/disco_app/install/templates/spec/rails_helper.rb +40 -0
  153. data/lib/generators/disco_app/install/templates/spec/spec_helper.rb +24 -0
  154. data/lib/generators/disco_app/install/templates/spec/support/active_job.rb +13 -0
  155. data/lib/generators/disco_app/install/templates/spec/support/coveralls.rb +3 -0
  156. data/lib/generators/disco_app/install/templates/spec/support/database_cleaner.rb +17 -0
  157. data/lib/generators/disco_app/install/templates/spec/support/factory_bot.rb +3 -0
  158. data/lib/generators/disco_app/install/templates/spec/support/helpers/json_helper.rb +13 -0
  159. data/lib/generators/disco_app/install/templates/spec/support/shared_examples/a_synchronise_job.rb +12 -0
  160. data/lib/generators/disco_app/install/templates/spec/support/shoulda.rb +6 -0
  161. data/lib/generators/disco_app/install/templates/spec/support/vcr.rb +14 -0
  162. data/lib/generators/disco_app/install/templates/spec/support/webmock.rb +8 -0
  163. data/lib/generators/disco_app/{templates → install/templates}/views/home/index.html.erb +0 -0
  164. data/lib/generators/disco_app/react/USAGE +5 -0
  165. data/lib/generators/disco_app/react/react_generator.rb +108 -0
  166. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/base_controller.rb +18 -0
  167. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/home_controller.rb +10 -0
  168. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/shops_controller.rb +11 -0
  169. data/lib/generators/disco_app/react/templates/app/controllers/embedded/api/users_controller.rb +11 -0
  170. data/lib/generators/disco_app/react/templates/app/controllers/embedded/home_controller.rb +13 -0
  171. data/lib/generators/disco_app/react/templates/app/models/api_response.rb +107 -0
  172. data/lib/generators/disco_app/react/templates/app/serializers/disco_app/shop_serializer.rb +13 -0
  173. data/lib/generators/disco_app/react/templates/app/serializers/disco_app/user_serializer.rb +13 -0
  174. data/lib/generators/disco_app/react/templates/app/serializers/empty_serializer.rb +5 -0
  175. data/lib/generators/disco_app/react/templates/app/serializers/error_serializer.rb +76 -0
  176. data/lib/generators/disco_app/react/templates/app/views/embedded/home/index.html.erb +12 -0
  177. data/lib/generators/disco_app/react/templates/app/views/layouts/embedded.html.erb +10 -0
  178. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/App.jsx +77 -0
  179. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/HomePage.jsx +34 -0
  180. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/EmbeddedPage.jsx +70 -0
  181. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ErrorBanner.jsx +58 -0
  182. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/PaginationWrapper.jsx +10 -0
  183. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/Shared/ScrollToTop.jsx +23 -0
  184. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/components/withApi.jsx +125 -0
  185. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/index.jsx +39 -0
  186. data/lib/generators/disco_app/react/templates/app/webpack/javascripts/embedded/utils.js +19 -0
  187. data/lib/generators/disco_app/react/templates/app/webpack/packs/embedded.js +2 -0
  188. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/banners.scss +7 -0
  189. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/busy.scss +3 -0
  190. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/index.scss +3 -0
  191. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded/shared/pagination.scss +5 -0
  192. data/lib/generators/disco_app/react/templates/app/webpack/stylesheets/embedded.scss +2 -0
  193. data/lib/generators/disco_app/react/templates/config/initializers/mime_types.rb +13 -0
  194. data/lib/generators/disco_app/react/templates/config/initializers/omniauth.rb +27 -0
  195. data/lib/generators/disco_app/react/templates/config/initializers/version.rb.tt +7 -0
  196. data/lib/generators/disco_app/react/templates/config/webpack/staging.js +5 -0
  197. data/lib/generators/disco_app/react/templates/config/webpack/test.js +5 -0
  198. data/lib/generators/disco_app/react/templates/config/webpacker.yml +96 -0
  199. data/lib/generators/disco_app/react/templates/root/.eslintignore +5 -0
  200. data/lib/generators/disco_app/react/templates/root/.eslintrc +69 -0
  201. data/lib/generators/disco_app/react/templates/root/.prettierrc +3 -0
  202. data/lib/generators/disco_app/react/templates/root/VERSION +1 -0
  203. data/lib/generators/disco_app/react/templates/root/babel.config.js +72 -0
  204. data/lib/generators/disco_app/react/templates/root/package.json.tt +84 -0
  205. data/lib/generators/disco_app/react/templates/root/postcss.config.js +14 -0
  206. data/lib/tasks/api.rake +0 -2
  207. data/lib/tasks/carrier_service.rake +0 -2
  208. data/lib/tasks/database.rake +1 -1
  209. data/lib/tasks/sessions.rake +0 -2
  210. data/lib/tasks/shops.rake +0 -2
  211. data/lib/tasks/users.rake +0 -2
  212. data/lib/tasks/webhooks.rake +0 -2
  213. data/test/clients/disco_app/api_client_test.rb +3 -3
  214. data/test/controllers/disco_app/admin/shops_controller_test.rb +1 -0
  215. data/test/controllers/disco_app/charges_controller_test.rb +8 -9
  216. data/test/controllers/disco_app/flow/trigger_usage_controller_test.rb +41 -0
  217. data/test/controllers/disco_app/install_controller_test.rb +2 -1
  218. data/test/controllers/disco_app/subscriptions_controller_test.rb +2 -1
  219. data/test/controllers/disco_app/webhooks_controller_test.rb +1 -0
  220. data/test/controllers/home_controller_test.rb +1 -1
  221. data/test/disco_app_test.rb +3 -1
  222. data/test/dummy/Rakefile +1 -1
  223. data/test/dummy/app/assets/config/manifest.js +2 -0
  224. data/test/dummy/app/controllers/application_controller.rb +2 -0
  225. data/test/dummy/app/controllers/carrier_request_controller.rb +1 -0
  226. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +1 -0
  227. data/test/dummy/app/controllers/home_controller.rb +1 -0
  228. data/test/dummy/app/controllers/proxy_controller.rb +1 -0
  229. data/test/dummy/app/javascript/packs/application.js +18 -0
  230. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +2 -3
  231. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +1 -0
  232. data/test/dummy/app/models/application_record.rb +2 -0
  233. data/test/dummy/app/models/cart.rb +4 -3
  234. data/test/dummy/app/models/disco_app/shop.rb +4 -5
  235. data/test/dummy/app/models/js_configuration.rb +1 -0
  236. data/test/dummy/app/models/product.rb +3 -2
  237. data/test/dummy/app/models/widget_configuration.rb +1 -0
  238. data/test/dummy/babel.config.js +72 -0
  239. data/test/dummy/bin/bundle +1 -1
  240. data/test/dummy/bin/rails +1 -1
  241. data/test/dummy/bin/setup +8 -8
  242. data/test/dummy/bin/webpack +19 -0
  243. data/test/dummy/bin/webpack-dev-server +19 -0
  244. data/test/dummy/config/application.rb +4 -3
  245. data/test/dummy/config/boot.rb +2 -2
  246. data/test/dummy/config/database.yml +3 -0
  247. data/test/dummy/config/environment.rb +1 -1
  248. data/test/dummy/config/environments/staging.rb +85 -0
  249. data/test/dummy/config/initializers/disco_app.rb +8 -1
  250. data/test/dummy/config/initializers/omniauth.rb +3 -4
  251. data/test/dummy/config/initializers/session_store.rb +1 -1
  252. data/test/dummy/config/initializers/shopify_app.rb +1 -0
  253. data/test/dummy/config/routes.rb +0 -2
  254. data/test/dummy/config/secrets.yml +3 -0
  255. data/test/dummy/config/webpack/development.js +5 -0
  256. data/test/dummy/config/webpack/environment.js +3 -0
  257. data/test/dummy/config/webpack/production.js +5 -0
  258. data/test/dummy/config/webpack/test.js +5 -0
  259. data/test/dummy/config/webpacker.yml +95 -0
  260. data/test/dummy/db/migrate/20160307182229_create_products.rb +3 -1
  261. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +3 -1
  262. data/test/dummy/db/migrate/20161105054746_create_carts.rb +2 -1
  263. data/test/dummy/db/schema.rb +45 -6
  264. data/test/dummy/package.json +8 -0
  265. data/test/dummy/postcss.config.js +12 -0
  266. data/test/dummy/yarn.lock +7244 -0
  267. data/test/fixtures/api/subscriptions/valid_request.json +1 -1
  268. data/test/fixtures/api/widget_store/empty_webhooks.json +3 -0
  269. data/test/fixtures/api/widget_store/existing_webhooks.json +43 -0
  270. data/test/fixtures/disco_app/shops.yml +3 -0
  271. data/test/fixtures/webhooks/flow/trigger_usage.json +7 -0
  272. data/test/integration/synchronises_test.rb +2 -1
  273. data/test/jobs/disco_app/app_installed_job_test.rb +28 -9
  274. data/test/jobs/disco_app/app_uninstalled_job_test.rb +5 -2
  275. data/test/jobs/disco_app/send_subscription_job_test.rb +3 -2
  276. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +1 -0
  277. data/test/jobs/disco_app/synchronise_users_job_test.rb +1 -0
  278. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +70 -13
  279. data/test/models/disco_app/can_be_liquified_test.rb +3 -1
  280. data/test/models/disco_app/has_metafields_test.rb +37 -18
  281. data/test/models/disco_app/renders_assets_test.rb +2 -1
  282. data/test/models/disco_app/session_test.rb +2 -2
  283. data/test/models/disco_app/shop_test.rb +1 -1
  284. data/test/services/disco_app/charges_service_test.rb +7 -8
  285. data/test/services/disco_app/flow/create_action_test.rb +51 -0
  286. data/test/services/disco_app/flow/create_trigger_test.rb +56 -0
  287. data/test/services/disco_app/flow/process_action_test.rb +68 -0
  288. data/test/services/disco_app/flow/process_trigger_test.rb +94 -0
  289. data/test/services/disco_app/flow/update_trigger_usage_test.rb +87 -0
  290. data/test/services/disco_app/subscription_service_test.rb +3 -2
  291. data/test/support/test_file_fixtures.rb +2 -2
  292. data/test/support/test_shopify_api.rb +1 -1
  293. data/test/test_helper.rb +10 -7
  294. data/test/vcr/flow_trigger_invalid_title.yml +35 -0
  295. data/test/vcr/flow_trigger_valid.yml +38 -0
  296. data/test/vcr/webhook_failure.yml +13 -13
  297. metadata +282 -148
  298. data/app/clients/disco_app/disco_api_error.rb +0 -2
  299. data/app/clients/disco_app/rollbar_client.rb +0 -53
  300. data/app/clients/disco_app/rollbar_client_error.rb +0 -2
  301. data/lib/generators/disco_app/USAGE +0 -5
  302. data/lib/generators/disco_app/disco_app_generator.rb +0 -236
  303. data/lib/generators/disco_app/templates/config/newrelic.yml +0 -26
  304. data/lib/generators/disco_app/templates/initializers/rollbar.rb +0 -23
  305. data/lib/generators/disco_app/templates/initializers/session_store.rb +0 -2
  306. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +0 -6
  307. data/lib/generators/disco_app/templates/root/.codeclimate.yml +0 -7
  308. data/lib/generators/disco_app/templates/root/.ruby-version +0 -1
  309. data/lib/tasks/rollbar.rake +0 -24
  310. 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,3 @@
1
+ {
2
+ "singleQuote": true
3
+ }
@@ -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
+ }
@@ -0,0 +1,14 @@
1
+ module.exports = {
2
+ plugins: {
3
+ 'postcss-import': {},
4
+ 'postcss-flexbugs-fixes': {},
5
+ 'postcss-preset-env': [
6
+ {
7
+ autoprefixer: {
8
+ flexbox: 'no-2009'
9
+ },
10
+ stage: 3
11
+ }
12
+ ]
13
+ }
14
+ };
data/lib/tasks/api.rake CHANGED
@@ -1,10 +1,8 @@
1
1
  namespace :api do
2
-
3
2
  desc 'Send all subscription information to the Disco API'
4
3
  task send_subscriptions: :environment do
5
4
  DiscoApp::Shop.find_each do |shop|
6
5
  DiscoApp::SendSubscriptionJob.perform_later(shop)
7
6
  end
8
7
  end
9
-
10
8
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  namespace :database do
2
- desc "update postgres sequence numbers in case database has been migrated"
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)
@@ -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
@@ -1,10 +1,8 @@
1
1
  namespace :shops do
2
-
3
2
  desc 'Synchronise shop data 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::ShopUpdateJob.perform_later(shop)
7
6
  end
8
7
  end
9
-
10
8
  end
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
@@ -1,10 +1,8 @@
1
1
  namespace :webhooks do
2
-
3
2
  desc 'Synchronise webhooks 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::SynchroniseWebhooksJob.perform_later(shop)
7
6
  end
8
7
  end
9
-
10
8
  end
@@ -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, "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)
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::Admin::ShopsControllerTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -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": "Basic",
47
- "price": "9.99",
48
- "trial_days": 14,
49
- "return_url": /^https:\/\/test\.example\.com\/subscriptions\/304261385\/charges\/53297050(1|2)\/activate$/,
50
- "test": true
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 |action|
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
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoApp::WebhooksControllerTest < ActionController::TestCase
4
+
4
5
  include ActiveJob::TestHelper
5
6
 
6
7
  def setup
@@ -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 :success
97
+ assert_response :success
98
98
  end
99
99
  end
100
100
 
@@ -1,7 +1,9 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DiscoAppTest < ActiveSupport::TestCase
4
- test "truth" do
4
+
5
+ test 'truth' do
5
6
  assert_kind_of Module, DiscoApp
6
7
  end
8
+
7
9
  end
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('../config/application', __FILE__)
4
+ require File.expand_path('config/application', __dir__)
5
5
 
6
6
  Rails.application.load_tasks
@@ -0,0 +1,2 @@
1
+ //= link application.css
2
+ //= link application.js
@@ -1,6 +1,8 @@
1
1
  class ApplicationController < ActionController::Base
2
+
2
3
  include ShopifyApp::LoginProtection
3
4
  # Prevent CSRF attacks by raising an exception.
4
5
  # For APIs, you may want to use :null_session instead.
5
6
  protect_from_forgery with: :exception
7
+
6
8
  end
@@ -1,4 +1,5 @@
1
1
  class CarrierRequestController < ActionController::Base
2
+
2
3
  include DiscoApp::Concerns::CarrierRequestController
3
4
 
4
5
  def rates
@@ -1,4 +1,5 @@
1
1
  class DiscoApp::Admin::ShopsController < DiscoApp::Admin::ApplicationController
2
+
2
3
  include DiscoApp::Admin::Concerns::ShopsController
3
4
 
4
5
  def index
@@ -1,4 +1,5 @@
1
1
  class HomeController < ApplicationController
2
+
2
3
  include DiscoApp::Concerns::AuthenticatedController
3
4
 
4
5
  def index
@@ -1,4 +1,5 @@
1
1
  class ProxyController < ActionController::Base
2
+
2
3
  include DiscoApp::Concerns::AppProxyController
3
4
 
4
5
  def index
@@ -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,4 +1,5 @@
1
1
  class DiscoApp::AppUninstalledJob < DiscoApp::ShopJob
2
+
2
3
  include DiscoApp::Concerns::AppUninstalledJob
3
4
 
4
5
  # Extend the perform method to change the country name of the shop to
@@ -1,3 +1,5 @@
1
1
  class ApplicationRecord < ActiveRecord::Base
2
+
2
3
  self.abstract_class = true
4
+
3
5
  end
@@ -1,13 +1,14 @@
1
1
  class Cart < ApplicationRecord
2
- include DiscoApp::Concerns::Synchronises
3
2
 
4
- belongs_to :shop, class_name: 'DiscoApp::Shop'
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(shop, data)
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
- begin
14
- ActiveUtils::Country.find(data[:country_name])
15
- rescue ActiveUtils::InvalidCountryCodeError
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
@@ -1,4 +1,5 @@
1
1
  class JsConfiguration < ApplicationRecord
2
+
2
3
  include DiscoApp::Concerns::RendersAssets
3
4
 
4
5
  belongs_to :shop, class_name: 'DiscoApp::Shop'