disco_app 0.8.8

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 (254) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/images/disco_app/icon.svg +1 -0
  4. data/app/assets/javascripts/disco_app/components/filterable_shop_list.js.jsx +65 -0
  5. data/app/assets/javascripts/disco_app/components/shop_filter_tab.js.jsx +34 -0
  6. data/app/assets/javascripts/disco_app/components/shop_filter_tabs.js.jsx +21 -0
  7. data/app/assets/javascripts/disco_app/components/shop_list.js.jsx +140 -0
  8. data/app/assets/javascripts/disco_app/components/shop_row.js.jsx +27 -0
  9. data/app/assets/javascripts/disco_app/components/shopify_admin_link.js.jsx +29 -0
  10. data/app/assets/javascripts/disco_app/components.js +5 -0
  11. data/app/assets/javascripts/disco_app/disco_app.js +7 -0
  12. data/app/assets/javascripts/disco_app/frame.js +152 -0
  13. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  14. data/app/assets/stylesheets/disco_app/bootstrap/_custom.scss +54 -0
  15. data/app/assets/stylesheets/disco_app/bootstrap/_variables.scss +872 -0
  16. data/app/assets/stylesheets/disco_app/disco/_buttons.scss +31 -0
  17. data/app/assets/stylesheets/disco_app/disco/_cards.scss +51 -0
  18. data/app/assets/stylesheets/disco_app/disco/_forms.scss +23 -0
  19. data/app/assets/stylesheets/disco_app/disco/_grid.scss +58 -0
  20. data/app/assets/stylesheets/disco_app/disco/_sections.scss +61 -0
  21. data/app/assets/stylesheets/disco_app/disco/_tables.scss +57 -0
  22. data/app/assets/stylesheets/disco_app/disco/_tabs.scss +61 -0
  23. data/app/assets/stylesheets/disco_app/disco/_type.scss +39 -0
  24. data/app/assets/stylesheets/disco_app/disco/mixins/_flexbox.scss +394 -0
  25. data/app/assets/stylesheets/disco_app/disco_app.scss +16 -0
  26. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  27. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  28. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  29. data/app/assets/stylesheets/disco_app/frame/_type.scss +32 -0
  30. data/app/assets/stylesheets/disco_app/frame.scss +9 -0
  31. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  32. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  33. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  34. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  35. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +51 -0
  36. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  37. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  38. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  39. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  40. data/app/controllers/disco_app/charges_controller.rb +47 -0
  41. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  42. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  43. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +21 -0
  44. data/app/controllers/disco_app/frame_controller.rb +9 -0
  45. data/app/controllers/disco_app/install_controller.rb +27 -0
  46. data/app/controllers/disco_app/subscriptions_controller.rb +40 -0
  47. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  48. data/app/controllers/sessions_controller.rb +22 -0
  49. data/app/helpers/disco_app/application_helper.rb +28 -0
  50. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  51. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  52. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  53. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  54. data/app/jobs/disco_app/concerns/shop_update_job.rb +16 -0
  55. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  56. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +52 -0
  57. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +61 -0
  58. data/app/jobs/disco_app/shop_job.rb +27 -0
  59. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  60. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  61. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  62. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  63. data/app/models/disco_app/app_settings.rb +3 -0
  64. data/app/models/disco_app/application_charge.rb +18 -0
  65. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  66. data/app/models/disco_app/concerns/plan.rb +26 -0
  67. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  68. data/app/models/disco_app/concerns/shop.rb +76 -0
  69. data/app/models/disco_app/concerns/subscription.rb +48 -0
  70. data/app/models/disco_app/concerns/synchronises.rb +39 -0
  71. data/app/models/disco_app/plan.rb +3 -0
  72. data/app/models/disco_app/plan_code.rb +3 -0
  73. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  74. data/app/models/disco_app/session_storage.rb +18 -0
  75. data/app/models/disco_app/shop.rb +3 -0
  76. data/app/models/disco_app/subscription.rb +3 -0
  77. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +46 -0
  78. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  79. data/app/services/disco_app/carrier_request_service.rb +15 -0
  80. data/app/services/disco_app/charges_service.rb +81 -0
  81. data/app/services/disco_app/proxy_service.rb +17 -0
  82. data/app/services/disco_app/subscription_service.rb +37 -0
  83. data/app/services/disco_app/webhook_service.rb +30 -0
  84. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  85. data/app/views/disco_app/admin/plans/_form.html.erb +27 -0
  86. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  87. data/app/views/disco_app/admin/plans/index.html.erb +32 -0
  88. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  89. data/app/views/disco_app/admin/shops/index.html.erb +12 -0
  90. data/app/views/disco_app/charges/activate.html.erb +1 -0
  91. data/app/views/disco_app/charges/create.html.erb +1 -0
  92. data/app/views/disco_app/charges/new.html.erb +12 -0
  93. data/app/views/disco_app/frame/frame.html.erb +36 -0
  94. data/app/views/disco_app/install/installing.html.erb +7 -0
  95. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  96. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  97. data/app/views/disco_app/shared/_card.html.erb +14 -0
  98. data/app/views/disco_app/shared/_section.html.erb +17 -0
  99. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  100. data/app/views/layouts/admin/_navbar.html.erb +25 -0
  101. data/app/views/layouts/admin.html.erb +27 -0
  102. data/app/views/layouts/application.html.erb +18 -0
  103. data/app/views/layouts/embedded_app.html.erb +41 -0
  104. data/app/views/layouts/embedded_app_modal.html.erb +17 -0
  105. data/app/views/sessions/new.html.erb +26 -0
  106. data/config/routes.rb +44 -0
  107. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
  108. data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
  109. data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
  110. data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
  111. data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
  112. data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
  113. data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
  114. data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
  115. data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
  116. data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
  117. data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
  118. data/db/migrate/20160301223215_update_plans.rb +22 -0
  119. data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
  120. data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
  121. data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
  122. data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
  123. data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
  124. data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
  125. data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
  126. data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
  127. data/lib/disco_app/configuration.rb +39 -0
  128. data/lib/disco_app/engine.rb +26 -0
  129. data/lib/disco_app/session.rb +14 -0
  130. data/lib/disco_app/support/file_fixtures.rb +23 -0
  131. data/lib/disco_app/test_help.rb +11 -0
  132. data/lib/disco_app/version.rb +3 -0
  133. data/lib/disco_app.rb +6 -0
  134. data/lib/generators/disco_app/USAGE +5 -0
  135. data/lib/generators/disco_app/adminify/adminify_generator.rb +35 -0
  136. data/lib/generators/disco_app/disco_app_generator.rb +164 -0
  137. data/lib/generators/disco_app/mailify/mailify_generator.rb +54 -0
  138. data/lib/generators/disco_app/monitorify/monitorify_generator.rb +28 -0
  139. data/lib/generators/disco_app/monitorify/templates/config/newrelic.yml +26 -0
  140. data/lib/generators/disco_app/monitorify/templates/initializers/rollbar.rb +12 -0
  141. data/lib/generators/disco_app/reactify/reactify_generator.rb +45 -0
  142. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  143. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  144. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  145. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  146. data/lib/generators/disco_app/templates/initializers/disco_app.rb +19 -0
  147. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  148. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  149. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  150. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  151. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  152. data/lib/tasks/carrier_service.rake +10 -0
  153. data/lib/tasks/sessions.rake +9 -0
  154. data/lib/tasks/start.rake +3 -0
  155. data/lib/tasks/webhooks.rake +10 -0
  156. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  157. data/test/controllers/disco_app/charges_controller_test.rb +91 -0
  158. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  159. data/test/controllers/disco_app/subscriptions_controller_test.rb +73 -0
  160. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  161. data/test/controllers/home_controller_test.rb +92 -0
  162. data/test/controllers/proxy_controller_test.rb +42 -0
  163. data/test/disco_app_test.rb +7 -0
  164. data/test/dummy/Rakefile +6 -0
  165. data/test/dummy/app/assets/javascripts/application.js +17 -0
  166. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  167. data/test/dummy/app/controllers/application_controller.rb +6 -0
  168. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  169. data/test/dummy/app/controllers/home_controller.rb +7 -0
  170. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  171. data/test/dummy/app/helpers/application_helper.rb +2 -0
  172. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  173. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  174. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  175. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  176. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  177. data/test/dummy/app/models/disco_app/shop.rb +15 -0
  178. data/test/dummy/app/models/product.rb +6 -0
  179. data/test/dummy/app/views/home/index.html.erb +2 -0
  180. data/test/dummy/bin/bundle +3 -0
  181. data/test/dummy/bin/rails +4 -0
  182. data/test/dummy/bin/rake +4 -0
  183. data/test/dummy/bin/setup +29 -0
  184. data/test/dummy/config/application.rb +38 -0
  185. data/test/dummy/config/boot.rb +5 -0
  186. data/test/dummy/config/database.codeship.yml +23 -0
  187. data/test/dummy/config/database.yml +20 -0
  188. data/test/dummy/config/environment.rb +5 -0
  189. data/test/dummy/config/environments/development.rb +41 -0
  190. data/test/dummy/config/environments/production.rb +85 -0
  191. data/test/dummy/config/environments/test.rb +42 -0
  192. data/test/dummy/config/initializers/assets.rb +11 -0
  193. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  194. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  195. data/test/dummy/config/initializers/disco_app.rb +19 -0
  196. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  197. data/test/dummy/config/initializers/inflections.rb +16 -0
  198. data/test/dummy/config/initializers/mime_types.rb +4 -0
  199. data/test/dummy/config/initializers/omniauth.rb +9 -0
  200. data/test/dummy/config/initializers/session_store.rb +2 -0
  201. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  202. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  203. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  204. data/test/dummy/config/locales/en.yml +23 -0
  205. data/test/dummy/config/routes.rb +10 -0
  206. data/test/dummy/config/secrets.yml +22 -0
  207. data/test/dummy/config.ru +4 -0
  208. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  209. data/test/dummy/db/schema.rb +138 -0
  210. data/test/dummy/public/404.html +67 -0
  211. data/test/dummy/public/422.html +67 -0
  212. data/test/dummy/public/500.html +66 -0
  213. data/test/dummy/public/favicon.ico +0 -0
  214. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  215. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  216. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  217. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  218. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  219. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  220. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  221. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  222. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  223. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  224. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  225. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  226. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  227. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  228. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  229. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  230. data/test/fixtures/api/widget_store/shop.json +46 -0
  231. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  232. data/test/fixtures/disco_app/application_charges.yml +11 -0
  233. data/test/fixtures/disco_app/plan_codes.yml +6 -0
  234. data/test/fixtures/disco_app/plans.yml +37 -0
  235. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  236. data/test/fixtures/disco_app/shops.yml +10 -0
  237. data/test/fixtures/disco_app/subscriptions.yml +21 -0
  238. data/test/fixtures/products.yml +4 -0
  239. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  240. data/test/fixtures/webhooks/product_created.json +167 -0
  241. data/test/fixtures/webhooks/product_deleted.json +3 -0
  242. data/test/fixtures/webhooks/product_updated.json +167 -0
  243. data/test/integration/synchronises_test.rb +55 -0
  244. data/test/jobs/disco_app/app_installed_job_test.rb +42 -0
  245. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  246. data/test/models/disco_app/plan_test.rb +5 -0
  247. data/test/models/disco_app/session_test.rb +31 -0
  248. data/test/models/disco_app/shop_test.rb +27 -0
  249. data/test/services/disco_app/charges_service_test.rb +104 -0
  250. data/test/services/disco_app/subscription_service_test.rb +59 -0
  251. data/test/support/test_file_fixtures.rb +29 -0
  252. data/test/support/test_shopify_api.rb +16 -0
  253. data/test/test_helper.rb +52 -0
  254. metadata +660 -0
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dev Frame</title>
5
+ <%= stylesheet_link_tag 'disco_app/frame', media: 'all' %>
6
+ <%= javascript_include_tag 'disco_app/frame' %>
7
+ </head>
8
+ <body>
9
+ <!-- Left Sidebar -->
10
+ <aside id="sidebar"></aside>
11
+
12
+ <!-- Header Bar -->
13
+ <header id="header">
14
+ <h1 id="header-title">
15
+ <img id="header-title-icon" src="<%= image_path('disco_app/icon.svg') %>" width="20" height="20" />
16
+ Shopify Dev Frame
17
+ </h1>
18
+ <div id="header-actions">
19
+ <!-- No action. -->
20
+ </div>
21
+ </header>
22
+
23
+ <!-- Content iFrame -->
24
+ <section id="content-wrapper">
25
+ <iframe id="content" src="/"></iframe>
26
+ </section>
27
+
28
+ <!-- Setup FrameApp. -->
29
+ <script type="text/javascript">
30
+ FrameApp.init({
31
+ debug: true,
32
+ iframe: document.getElementById('content')
33
+ });
34
+ </script>
35
+ </body>
36
+ </html>
@@ -0,0 +1,7 @@
1
+ <% content_for :extra_head do %>
2
+ <meta http-equiv="refresh" content="5">
3
+ <% end %>
4
+
5
+ <p>
6
+ Installing, please wait...
7
+ </p>
@@ -0,0 +1 @@
1
+ uninstalling
@@ -0,0 +1 @@
1
+ 404 Not Found
@@ -0,0 +1,14 @@
1
+ <% disabled ||= false %>
2
+ <div class="next-card <% if disabled %>next-card--disabled<% end %>">
3
+ <% if content_for?(:card_header) %>
4
+ <header class="next-card__header">
5
+ <%= content_for :card_header %>
6
+ </header>
7
+ <% end %>
8
+ <%= content_for :card_content %>
9
+ <% if content_for?(:card_footer) %>
10
+ <footer class="next-card__footer">
11
+ <%= content_for :card_footer %>
12
+ </footer>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,17 @@
1
+ <section class="section">
2
+ <div class="layout-content">
3
+
4
+ <aside class="layout-content__sidebar layout-content__first">
5
+ <% if content_for?(:section_summary) %>
6
+ <div class="section-summary">
7
+ <%= content_for :section_summary %>
8
+ </div>
9
+ <% end %>
10
+ </aside>
11
+
12
+ <section class="layout-content__main">
13
+ <%= content_for :section_content %>
14
+ </section>
15
+
16
+ </div>
17
+ </section>
@@ -0,0 +1,25 @@
1
+ <% if @shop.current_subscription? %>
2
+ <p>
3
+ You are currently on the <%= @shop.current_subscription.plan.name %> plan.
4
+ </p>
5
+ <p>
6
+ Choose a new plan:
7
+ </p>
8
+ <% else %>
9
+ <p>
10
+ Welcome!
11
+ </p>
12
+ <p>
13
+ Choose a plan below to get started:
14
+ </p>
15
+ <% end %>
16
+
17
+ <% for plan in DiscoApp::Plan.available %>
18
+
19
+ <h2><%= plan.name %></h2>
20
+ <%= form_for(@subscription) do |f| %>
21
+ <%= f.hidden_field :plan, value: plan.id %>
22
+ <%= f.submit %>
23
+ <% end %>
24
+
25
+ <% end %>
@@ -0,0 +1,25 @@
1
+ <nav class="navbar navbar-default navbar-static-top">
2
+ <div class="container-fluid">
3
+
4
+ <!-- Brand & Toggle -->
5
+ <div class="navbar-header">
6
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
7
+ <span class="sr-only">Toggle navigation</span>
8
+ <span class="icon-bar"></span>
9
+ <span class="icon-bar"></span>
10
+ <span class="icon-bar"></span>
11
+ </button>
12
+ <a class="navbar-brand" href="<%= admin_shops_path %>">Credible</a>
13
+ </div>
14
+
15
+ <!-- Collapsing Navigation Links -->
16
+ <div class="collapse navbar-collapse">
17
+ <ul class="nav navbar-nav">
18
+ <%= active_link_to 'Shops', admin_shops_path, wrap_tag: :li %>
19
+ <%= active_link_to 'Plans', admin_plans_path, wrap_tag: :li %>
20
+ <%= active_link_to 'Settings', edit_admin_app_settings_path, wrap_tag: :li %>
21
+ </ul>
22
+ </div>
23
+
24
+ </div>
25
+ </nav>
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= yield(:title) %></title>
5
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
+
8
+ <%= csrf_meta_tags %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= render 'layouts/admin/navbar' %>
13
+
14
+ <div class="container-fluid">
15
+ <div class="page-header">
16
+ <h1><%= yield(:title) %></h1>
17
+ </div>
18
+
19
+ <% flash.each do |message_type, message| %>
20
+ <div class="alert alert-<%= message_type %>"><%= message %></div>
21
+ <% end %>
22
+
23
+ <%= yield %>
24
+ </div>
25
+
26
+ </body>
27
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= yield(:title) %></title>
5
+
6
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
7
+
8
+ <%= csrf_meta_tags %>
9
+
10
+ <%= yield :extra_head %>
11
+ </head>
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
17
+ </body>
18
+ </html>
@@ -0,0 +1,41 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= yield(:title) %></title>
5
+
6
+ <script src="//cdn.shopify.com/s/assets/external/app.js?<%= Time.now.strftime('%Y%m%d%H') %>"></script>
7
+ <script type="text/javascript">
8
+ // Initialise the Shopify App.
9
+ ShopifyApp.init({
10
+ "apiKey": "<%= ShopifyApp.configuration.api_key %>",
11
+ "shopOrigin": "<%= "https://#{ @shop_session.url }" if @shop_session %>",
12
+ "debug": <%= Rails.env.development? ? 'true' : 'false' %>
13
+ });
14
+ </script>
15
+
16
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
17
+
18
+ <%= csrf_meta_tags %>
19
+
20
+ <%= yield :extra_head %>
21
+ </head>
22
+ <body>
23
+ <script type="text/javascript">
24
+ ShopifyApp.Bar.initialize({
25
+ title: "<%= yield(:title) %>",
26
+ icon: "<%= image_url("disco_app/icon.svg") %>",
27
+ buttons: <%= content_for?(:buttons) ? content_for(:buttons) : '{}' %>
28
+ });
29
+ </script>
30
+
31
+ <%= yield %>
32
+
33
+ <% flash.each do |key, message| %>
34
+ <script type="text/javascript">
35
+ ShopifyApp.flash<%= (key == 'error') ? 'Error' : 'Notice' %>('<%= message %>');
36
+ </script>
37
+ <% end %>
38
+
39
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true, 'data-turbolinks-eval' => false %>
40
+ </body>
41
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= yield(:title) %></title>
5
+
6
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
7
+
8
+ <%= csrf_meta_tags %>
9
+
10
+ <%= yield :extra_head %>
11
+ </head>
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,26 @@
1
+ <% provide(:title, 'Install') %>
2
+
3
+ <%= form_tag shopify_app.login_path do %>
4
+ <div class="modal-dialog">
5
+ <div class="modal-content">
6
+ <div class="modal-body">
7
+
8
+ <% flash.each do |message_type, message| %>
9
+ <div class="alert alert-<%= message_type %>"><%= message %></div>
10
+ <% end %>
11
+
12
+ <div class="form-group">
13
+ <div class="input-group">
14
+ <div class="input-group-addon">http://</div>
15
+ <input type="text" class="form-control" id="shop" name="shop" placeholder="your-store" autocomplete="off" autofocus="on" />
16
+ <div class="input-group-addon">.myshopify.com</div>
17
+ </div>
18
+ </div>
19
+
20
+ </div>
21
+ <div class="modal-footer">
22
+ <button type="submit" class="btn btn-primary">Install</button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <% end %>
data/config/routes.rb ADDED
@@ -0,0 +1,44 @@
1
+ DiscoApp::Engine.routes.draw do
2
+
3
+ controller :webhooks do
4
+ post 'webhooks' => :process_webhook, as: :webhooks
5
+ end
6
+
7
+ resources :subscriptions, only: [:new, :create] do
8
+ resources :charges, only: [:new, :create] do
9
+ member do
10
+ get 'activate'
11
+ end
12
+ end
13
+ end
14
+
15
+ controller :install do
16
+ get 'install' => :install, as: :install
17
+ get 'installing' => :installing, as: :installing
18
+ get 'uninstalling' => :uninstalling, as: :uninstalling
19
+ end
20
+
21
+ controller 'admin' do
22
+ get 'admin', to: redirect('/admin/shops')
23
+ get 'admin/shops' => 'admin/shops#index'
24
+ end
25
+
26
+ namespace :admin do
27
+ resources :shops, only: [:index, :edit, :update]
28
+ resources :plans
29
+ resource :app_settings, only: [:edit, :update]
30
+
31
+ # JSON-API resources for admins."
32
+ namespace :resources do
33
+ jsonapi_resources :shops
34
+ end
35
+ end
36
+
37
+ # Make the embedded app frame emulator available in development.
38
+ if Rails.env.development?
39
+ controller :frame do
40
+ get 'frame' => :frame, as: :frame
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,15 @@
1
+ class CreateShopsIfNotExistent < ActiveRecord::Migration
2
+
3
+ def change
4
+ unless table_exists? :shops or table_exists? :disco_app_shops
5
+ create_table :shops do |t|
6
+ t.string :shopify_domain, null: false
7
+ t.string :shopify_token, null: false
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_index :shops, :shopify_domain, unique: true
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,5 @@
1
+ class AddStatusToShops < ActiveRecord::Migration
2
+ def change
3
+ add_column :shops, :status, :integer, default: 0
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class AddMetaToShops < ActiveRecord::Migration
2
+ def change
3
+ add_column :shops, :email, :string
4
+ add_column :shops, :country_name, :string
5
+ add_column :shops, :currency, :string
6
+ add_column :shops, :money_format, :string
7
+ add_column :shops, :money_with_currency_format, :string
8
+ add_column :shops, :domain, :string
9
+ add_column :shops, :plan_name, :string
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddChargeStatusToShop < ActiveRecord::Migration
2
+ def change
3
+ add_column :shops, :charge_status, :integer, default: 6
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ class AddMoreMetaToShops < ActiveRecord::Migration
2
+ def change
3
+ add_column :shops, :plan_display_name, :string
4
+ add_column :shops, :latitude, :decimal
5
+ add_column :shops, :longitude, :decimal
6
+ add_column :shops, :customer_email, :string
7
+ add_column :shops, :password_enabled, :boolean
8
+ add_column :shops, :phone, :string
9
+ add_column :shops, :primary_locale, :string
10
+ add_column :shops, :ships_to_countries, :string
11
+ add_column :shops, :timezone, :string
12
+ add_column :shops, :iana_timezone, :string
13
+ add_column :shops, :has_storefront, :boolean
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ class CreateDiscoAppPlans < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_plans do |t|
4
+ t.integer :status
5
+ t.string :name
6
+ t.integer :charge_type
7
+ t.decimal :default_price
8
+ t.integer :default_trial_days
9
+
10
+ t.timestamps null: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class CreateDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_subscriptions do |t|
4
+ t.belongs_to :shop, index: true
5
+ t.belongs_to :plan, index: true
6
+ t.integer :status
7
+ t.string :name
8
+ t.integer :charge_type
9
+ t.decimal :price
10
+ t.integer :trial_days
11
+
12
+ t.timestamps null: false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class MoveShopToDiscoAppEngine < ActiveRecord::Migration
2
+ def change
3
+ rename_table :shops, :disco_app_shops
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDiscoAppSessions < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_sessions do |t|
4
+ t.string :session_id, null: false
5
+ t.text :data
6
+ t.timestamps null: false
7
+ end
8
+
9
+ add_index :disco_app_sessions, :session_id, :unique => true
10
+ add_index :disco_app_sessions, :updated_at
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class AddShopIdToDiscoAppSessions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_sessions, :shop_id, :integer, null: true
4
+ add_foreign_key :disco_app_sessions, :disco_app_shops, column: :shop_id, on_delete: :cascade
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ class CreateDiscoAppSettings < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_app_settings do |t|
4
+
5
+ t.timestamps null: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ class UpdatePlans < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_plans, :default_price, :decimal
4
+ rename_column :disco_app_plans, :default_trial_days, :trial_period_days
5
+ rename_column :disco_app_plans, :charge_type, :plan_type
6
+ add_column :disco_app_plans, :amount, :integer, default: 0
7
+ add_column :disco_app_plans, :currency, :string, default: 'USD'
8
+ add_column :disco_app_plans, :interval, :integer, default: 0
9
+ add_column :disco_app_plans, :interval_count, :integer, default: 1
10
+
11
+ reversible do |direction|
12
+ direction.up do
13
+ change_column :disco_app_plans, :plan_type, :integer, default: 0
14
+ change_column :disco_app_plans, :status, :integer, default: 0
15
+ end
16
+ direction.down do
17
+ change_column :disco_app_plans, :plan_type, :integer
18
+ change_column :disco_app_plans, :status, :integer
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ class UpdateSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_subscriptions, :name, :string
4
+ remove_column :disco_app_subscriptions, :price, :decimal
5
+ remove_column :disco_app_subscriptions, :trial_days, :integer
6
+
7
+ rename_column :disco_app_subscriptions, :charge_type, :subscription_type
8
+
9
+ add_column :disco_app_subscriptions, :trial_start_at, :datetime, null: true
10
+ add_column :disco_app_subscriptions, :trial_end_at, :datetime, null: true
11
+ add_column :disco_app_subscriptions, :cancelled_at, :datetime, null: true
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppRecurringApplicationCharges < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_recurring_application_charges do |t|
4
+ t.integer :shop_id, limit: 8
5
+ t.integer :subscription_id, limit: 8
6
+ t.integer :status, default: 0
7
+
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_foreign_key :disco_app_recurring_application_charges, :disco_app_shops, column: :shop_id
12
+ add_foreign_key :disco_app_recurring_application_charges, :disco_app_subscriptions, column: :subscription_id
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppApplicationCharges < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_application_charges do |t|
4
+ t.integer :shop_id, limit: 8
5
+ t.integer :subscription_id, limit: 8
6
+ t.integer :status, default: 0
7
+
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_foreign_key :disco_app_application_charges, :disco_app_shops, column: :shop_id
12
+ add_foreign_key :disco_app_application_charges, :disco_app_subscriptions, column: :subscription_id
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class DropChargeStatusFromShops < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_shops, :charge_status, :integer, default: 0
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class AddShopifyAttributesToCharges < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_application_charges, :shopify_id, :integer, limit: 8, null: true
4
+ add_column :disco_app_recurring_application_charges, :shopify_id, :integer, limit: 8, null: true
5
+ add_column :disco_app_application_charges, :confirmation_url, :string, null: true
6
+ add_column :disco_app_recurring_application_charges, :confirmation_url, :string, null: true
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppPlanCodes < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_plan_codes do |t|
4
+ t.integer :plan_id, limit: 8
5
+ t.string :code
6
+ t.integer :trial_period_days
7
+ t.integer :amount
8
+
9
+ t.timestamps null: false
10
+ end
11
+
12
+ add_foreign_key :disco_app_plan_codes, :disco_app_plans, column: :plan_id
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class AddStatusToPlanCodes < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_plan_codes, :status, :integer, default: 0
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddAmountAndPlanCodeToDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_subscriptions, :amount, :integer, default: 0
4
+ add_column :disco_app_subscriptions, :plan_code_id, :integer, limit: 8
5
+ add_foreign_key :disco_app_subscriptions, :disco_app_plan_codes, column: :plan_code_id
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ module DiscoApp
2
+
3
+ class Configuration
4
+
5
+ # Required configuration.
6
+ attr_accessor :app_name
7
+
8
+ # Set the below if using an application proxy.
9
+ attr_accessor :app_proxy_prefix
10
+
11
+ # Set the below to create real Shopify charges.
12
+ attr_accessor :real_charges
13
+ alias_method :real_charges?, :real_charges
14
+
15
+ # Optional configuration, usually useful for development environments.
16
+ attr_accessor :skip_proxy_verification
17
+ alias_method :skip_proxy_verification?, :skip_proxy_verification
18
+ attr_accessor :skip_webhook_verification
19
+ alias_method :skip_webhook_verification?, :skip_webhook_verification
20
+ attr_accessor :skip_carrier_request_verification
21
+ alias_method :skip_carrier_request_verification?, :skip_carrier_request_verification
22
+ attr_accessor :skip_oauth
23
+ alias_method :skip_oauth?, :skip_oauth
24
+
25
+ end
26
+
27
+ def self.configuration
28
+ @configuration ||= Configuration.new
29
+ end
30
+
31
+ def self.configuration=(config)
32
+ @configuration = config
33
+ end
34
+
35
+ def self.configure
36
+ yield configuration
37
+ end
38
+
39
+ end
@@ -0,0 +1,26 @@
1
+ require 'shopify_app'
2
+ require 'bootstrap-sass'
3
+ require 'jquery-rails'
4
+ require 'turbolinks'
5
+ require 'activerecord/session_store'
6
+ require 'disco_app/session'
7
+ require 'jsonapi-resources'
8
+
9
+ module DiscoApp
10
+ class Engine < ::Rails::Engine
11
+
12
+ isolate_namespace DiscoApp
13
+ engine_name 'disco_app'
14
+
15
+ # Ensure DiscoApp helpers are available throughout application.
16
+ config.to_prepare do
17
+ ApplicationController.helper(DiscoApp::ApplicationHelper)
18
+ end
19
+
20
+ # Ensure our frame assets are included for precompilation.
21
+ initializer 'disco_app.assets.precompile' do |app|
22
+ app.config.assets.precompile += %w(disco_app/icon.svg disco_app/frame.css disco_app/frame.js)
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ module DiscoApp
2
+ class Session < ActiveRecord::SessionStore::Session
3
+
4
+ before_save :set_shop_id!
5
+
6
+ private
7
+
8
+ def set_shop_id!
9
+ return false unless loaded?
10
+ write_attribute(:shop_id, data[:shopify] || data['shopify'])
11
+ end
12
+
13
+ end
14
+ end