shopify_app 7.4.0 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +15 -15
- data/app/controllers/shopify_app/authenticated_controller.rb +2 -4
- data/app/controllers/shopify_app/sessions_controller.rb +96 -2
- data/app/controllers/shopify_app/webhooks_controller.rb +1 -1
- data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +1 -0
- data/lib/generators/shopify_app/home_controller/templates/index.html.erb +14 -0
- data/lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb +1 -5
- data/lib/generators/shopify_app/install/install_generator.rb +0 -11
- data/lib/generators/shopify_app/install/templates/shopify_app.rb +1 -0
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb +3 -3
- data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +3 -3
- data/lib/generators/shopify_app/shop_model/templates/shop.rb +0 -1
- data/lib/shopify_app.rb +20 -17
- data/lib/shopify_app/configuration.rb +21 -8
- data/lib/shopify_app/{app_proxy_verification.rb → controller_concerns/app_proxy_verification.rb} +0 -0
- data/lib/shopify_app/controller_concerns/embedded_app.rb +19 -0
- data/lib/shopify_app/{localization.rb → controller_concerns/localization.rb} +6 -0
- data/lib/shopify_app/{login_protection.rb → controller_concerns/login_protection.rb} +11 -7
- data/lib/shopify_app/{webhook_verification.rb → controller_concerns/webhook_verification.rb} +0 -0
- data/lib/shopify_app/{scripttags_manager_job.rb → jobs/scripttags_manager_job.rb} +0 -0
- data/lib/shopify_app/{webhooks_manager_job.rb → jobs/webhooks_manager_job.rb} +0 -0
- data/lib/shopify_app/{scripttags_manager.rb → managers/scripttags_manager.rb} +0 -0
- data/lib/shopify_app/{webhooks_manager.rb → managers/webhooks_manager.rb} +0 -0
- data/lib/shopify_app/session/in_memory_session_store.rb +27 -0
- data/lib/shopify_app/{shopify_session_repository.rb → session/session_repository.rb} +0 -0
- data/lib/shopify_app/{session_storage.rb → session/session_storage.rb} +9 -0
- data/lib/shopify_app/version.rb +1 -1
- metadata +14 -17
- data/lib/generators/shopify_app/install/templates/shopify_session_repository.rb +0 -23
- data/lib/generators/shopify_app/shop_model/templates/shopify_session_repository.rb +0 -9
- data/lib/shopify_app/in_memory_session_store.rb +0 -25
- data/lib/shopify_app/sessions_concern.rb +0 -103
- data/lib/shopify_app/shop.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c17b0036bfc249437b86de35f0ad6a42bae8a74
|
4
|
+
data.tar.gz: 4c1840a61918df21033a9492662a5b48810aa4fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9e9c0e4930528ab48b9ea7dfbb3d4722a650dbd97bc97c4e254115398026c462ca25a660aa91a85654a37bde1ecf1195744cb31c8da7facc748f9985bb46b34
|
7
|
+
data.tar.gz: bb0726fb075b047ceb02b8a7b10cd04e3b2c925ea7e5efcf14df1465d347b6edc164599ceb894af52aae50cf6ff0cb7448fac7e175e1b8332ffcb22706f4e03e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
8.0.0
|
2
|
+
-----
|
3
|
+
* Removed the `shopify_session_repository` initializer. The SessionRepository is now configured through the main ShopifyApp configuration object and the generated initializer
|
4
|
+
* Moved InMemorySessionStore into the ShopifyApp namespace
|
5
|
+
* Remove ShopifySession concern. This module made the code internal to this engine harder to follow and we want do discourage over-writing the auth code now that we have generic hooks for all extra tasks during install.
|
6
|
+
* Changed engine controllers to subclass ActionController::Base to avoid any possible conflict with the parent application
|
7
|
+
* Removed the `ShopifyApp::Shop` concern and added its methods to `ShopifyApp::SessionStorage`. To update for this change just remove this concern anywhere it is being used in your application.
|
8
|
+
* Add `ShopifyApp::EmbeddedApp` controller concern which handles setting the required headers for the ESDK. Previously this was done by injecting configuration into applicaton.rb which affects the entire app.
|
9
|
+
* Add webhooks to generated home controller. This should help new users debug issues.
|
10
|
+
|
1
11
|
7.4.0
|
2
12
|
-----
|
3
13
|
* Add an after_authenticate job which will be run once the shop is authenticated. [[#431]](https://github.com/Shopify/shopify_app/pull/432)
|
data/README.md
CHANGED
@@ -142,7 +142,7 @@ After running the `install` generator, you can start your app with `bundle exec
|
|
142
142
|
$ rails generate shopify_app:shop_model
|
143
143
|
```
|
144
144
|
|
145
|
-
The install generator doesn't create any database models for you
|
145
|
+
The install generator doesn't create any database tables or models for you. If you are starting a new app its quite likely that you will want a shops table and model to store the tokens when your app is installed (most of our internally developed apps do!). This generator creates a shop model and a migration. This model includes the `ShopifyApp::Shop` concern which adds two methods to make it compatible as a `SessionRepository`. After running this generator you'll notice the `session_repository` in your `config/initializers/shopify_app.rb` will be set to the `Shop` model. This means that internally ShopifyApp will try and load tokens from this model.
|
146
146
|
|
147
147
|
*Note that you will need to run rake db:migrate after this generator*
|
148
148
|
|
@@ -172,7 +172,7 @@ The last group of generators are for your convenience if you want to start overr
|
|
172
172
|
Mounting the Engine
|
173
173
|
-------------------
|
174
174
|
|
175
|
-
Mounting the Engine will provide the basic routes to authenticating a shop with your
|
175
|
+
Mounting the Engine will provide the basic routes to authenticating a shop with your application. By default it will provide:
|
176
176
|
|
177
177
|
| Verb | Route | Action |
|
178
178
|
|--------|-------------------------------|------------------------------|
|
@@ -183,28 +183,28 @@ Mounting the Engine will provide the basic routes to authenticating a shop with
|
|
183
183
|
|POST |'/webhooks/:type' |Webhook Callback |
|
184
184
|
|
185
185
|
|
186
|
-
|
186
|
+
If required the engine can be mounted at a nested route, eg:
|
187
187
|
|
188
188
|
```ruby
|
189
189
|
mount ShopifyApp::Engine, at: '/nested'
|
190
190
|
```
|
191
191
|
|
192
|
-
This will create the Shopify engine routes under the specified subpath
|
192
|
+
This will create the Shopify engine routes under the specified subpath. You'll also need to make some updates to your `shopify_app.rb` and `omniauth.rb` initializers. First update the shopify_app initializer to include a custom `root_url` e.g:
|
193
193
|
|
194
194
|
```ruby
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
scope: ShopifyApp.configuration.scope,
|
199
|
-
callback_path: '/nested/auth/shopify/callback'
|
195
|
+
ShopifyApp.configure do |config|
|
196
|
+
config.root_url = '/nested'
|
197
|
+
end
|
200
198
|
```
|
201
199
|
|
202
|
-
|
200
|
+
then update the omniauth initializer to include a custom `callback_path` e.g:
|
203
201
|
|
204
202
|
```ruby
|
205
|
-
|
206
|
-
|
207
|
-
|
203
|
+
provider :shopify,
|
204
|
+
ShopifyApp.configuration.api_key,
|
205
|
+
ShopifyApp.configuration.secret,
|
206
|
+
scope: ShopifyApp.configuration.scope,
|
207
|
+
callback_path: '/nested/auth/shopify/callback'
|
208
208
|
```
|
209
209
|
|
210
210
|
Managing Api Keys
|
@@ -327,9 +327,9 @@ bin/rails g shopify_app:add_after_authenticate_job
|
|
327
327
|
ShopifyApp::SessionRepository
|
328
328
|
-----------------------------
|
329
329
|
|
330
|
-
`ShopifyApp::SessionRepository` allows you as a developer to define how your sessions are retrieved and stored for a shop. The `SessionRepository` is configured
|
330
|
+
`ShopifyApp::SessionRepository` allows you as a developer to define how your sessions are retrieved and stored for a shop. The `SessionRepository` is configured in the `config/initializers/shopify_app.rb` file and can be set to any object that implements `self.store(shopify_session)` which stores the session and returns a unique identifier and `self.retrieve(id)` which returns a `ShopifyAPI::Session` for the passed id. See either the `ShopifyApp::InMemorySessionStore` class or the `ShopifyApp::Shop` concern for examples.
|
331
331
|
|
332
|
-
If you only run the install generator then by default you will have an in memory store but it **won't work** on multi-server environments including Heroku. If you ran all the generators including the shop_model generator then the Shop model itself will be the `SessionRepository`. If you look at the implementation of the generated shop model you'll see that this gem provides
|
332
|
+
If you only run the install generator then by default you will have an in memory store but it **won't work** on multi-server environments including Heroku. If you ran all the generators including the shop_model generator then the `Shop` model itself will be the `SessionRepository`. If you look at the implementation of the generated shop model you'll see that this gem provides a concern for the `SessionRepository`. You can use this concern on any model that responds to `shopify_domain` and `shopify_token`.
|
333
333
|
|
334
334
|
AuthenticatedController
|
335
335
|
-----------------------
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module ShopifyApp
|
2
|
-
class AuthenticatedController <
|
2
|
+
class AuthenticatedController < ActionController::Base
|
3
3
|
include ShopifyApp::Localization
|
4
4
|
include ShopifyApp::LoginProtection
|
5
|
+
include ShopifyApp::EmbeddedApp
|
5
6
|
|
6
|
-
before_action :set_locale
|
7
7
|
before_action :login_again_if_different_shop
|
8
8
|
around_action :shopify_session
|
9
|
-
|
10
|
-
layout ShopifyApp.configuration.embedded_app? ? 'embedded_app' : 'application'
|
11
9
|
end
|
12
10
|
end
|
@@ -1,5 +1,99 @@
|
|
1
1
|
module ShopifyApp
|
2
|
-
class SessionsController <
|
3
|
-
include ShopifyApp::
|
2
|
+
class SessionsController < ActionController::Base
|
3
|
+
include ShopifyApp::LoginProtection
|
4
|
+
layout false, only: :new
|
5
|
+
|
6
|
+
def new
|
7
|
+
authenticate if sanitized_shop_name.present?
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
authenticate
|
12
|
+
end
|
13
|
+
|
14
|
+
def callback
|
15
|
+
if auth_hash
|
16
|
+
login_shop
|
17
|
+
install_webhooks
|
18
|
+
install_scripttags
|
19
|
+
perform_after_authenticate_job
|
20
|
+
|
21
|
+
redirect_to return_address
|
22
|
+
else
|
23
|
+
flash[:error] = I18n.t('could_not_log_in')
|
24
|
+
redirect_to login_url
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def destroy
|
29
|
+
session[:shopify] = nil
|
30
|
+
session[:shopify_domain] = nil
|
31
|
+
flash[:notice] = I18n.t('.logged_out')
|
32
|
+
redirect_to login_url
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def authenticate
|
38
|
+
if sanitized_shop_name.present?
|
39
|
+
fullpage_redirect_to "#{main_app.root_path}auth/shopify?shop=#{sanitized_shop_name}"
|
40
|
+
else
|
41
|
+
redirect_to return_address
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def login_shop
|
46
|
+
sess = ShopifyAPI::Session.new(shop_name, token)
|
47
|
+
session[:shopify] = ShopifyApp::SessionRepository.store(sess)
|
48
|
+
session[:shopify_domain] = shop_name
|
49
|
+
end
|
50
|
+
|
51
|
+
def auth_hash
|
52
|
+
request.env['omniauth.auth']
|
53
|
+
end
|
54
|
+
|
55
|
+
def shop_name
|
56
|
+
auth_hash.uid
|
57
|
+
end
|
58
|
+
|
59
|
+
def token
|
60
|
+
auth_hash['credentials']['token']
|
61
|
+
end
|
62
|
+
|
63
|
+
def install_webhooks
|
64
|
+
return unless ShopifyApp.configuration.has_webhooks?
|
65
|
+
|
66
|
+
WebhooksManager.queue(
|
67
|
+
shop_name,
|
68
|
+
token,
|
69
|
+
ShopifyApp.configuration.webhooks
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
def install_scripttags
|
74
|
+
return unless ShopifyApp.configuration.has_scripttags?
|
75
|
+
|
76
|
+
ScripttagsManager.queue(
|
77
|
+
shop_name,
|
78
|
+
token,
|
79
|
+
ShopifyApp.configuration.scripttags
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
def perform_after_authenticate_job
|
84
|
+
config = ShopifyApp.configuration.after_authenticate_job
|
85
|
+
|
86
|
+
return unless config && config[:job].present?
|
87
|
+
|
88
|
+
if config[:inline] == true
|
89
|
+
config[:job].perform_now(shop_domain: session[:shopify_domain])
|
90
|
+
else
|
91
|
+
config[:job].perform_later(shop_domain: session[:shopify_domain])
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def return_address
|
96
|
+
session.delete(:return_to) || ShopifyApp::configuration.root_url
|
97
|
+
end
|
4
98
|
end
|
5
99
|
end
|
@@ -5,3 +5,17 @@
|
|
5
5
|
<li><%= link_to product.title, "https://#{@shop_session.url}/admin/products/#{product.id}", target: "_top" %></li>
|
6
6
|
<% end %>
|
7
7
|
</ul>
|
8
|
+
|
9
|
+
<hr>
|
10
|
+
|
11
|
+
<h2>Webhooks</h2>
|
12
|
+
|
13
|
+
<% if @webhooks.present? %>
|
14
|
+
<ul>
|
15
|
+
<% @webhooks.each do |webhook| %>
|
16
|
+
<li><%= webhook.topic %> : <%= webhook.address %></li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
19
|
+
<% else %>
|
20
|
+
<p>This app has not created any webhooks for this Shop. Add webhooks to your ShopifyApp initializer if you need webhooks</p>
|
21
|
+
<% end %>
|
@@ -1,11 +1,7 @@
|
|
1
1
|
<% content_for :javascript do %>
|
2
2
|
<script type="text/javascript">
|
3
3
|
ShopifyApp.ready(function(){
|
4
|
-
ShopifyApp.Bar.initialize({
|
5
|
-
title: "Home",
|
6
|
-
icon: "<%= asset_path('favicon.ico') %>"
|
7
|
-
});
|
4
|
+
ShopifyApp.Bar.initialize({ title: "Home" });
|
8
5
|
});
|
9
6
|
</script>
|
10
7
|
<% end %>
|
11
|
-
|
@@ -34,17 +34,6 @@ module ShopifyApp
|
|
34
34
|
)
|
35
35
|
end
|
36
36
|
|
37
|
-
def create_shopify_session_repository_initializer
|
38
|
-
copy_file 'shopify_session_repository.rb', 'config/initializers/shopify_session_repository.rb'
|
39
|
-
end
|
40
|
-
|
41
|
-
def inject_embedded_app_options_to_application
|
42
|
-
if embedded_app?
|
43
|
-
application "config.action_dispatch.default_headers.delete('X-Frame-Options')"
|
44
|
-
application "config.action_dispatch.default_headers['P3P'] = 'CP=\"Not used\"'"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
37
|
def create_embedded_app_layout
|
49
38
|
if embedded_app?
|
50
39
|
copy_file 'embedded_app.html.erb', 'app/views/layouts/embedded_app.html.erb'
|
@@ -1,4 +1,4 @@
|
|
1
1
|
provider :shopify,
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
ShopifyApp.configuration.api_key,
|
3
|
+
ShopifyApp.configuration.secret,
|
4
|
+
scope: ShopifyApp.configuration.scope
|
@@ -12,11 +12,11 @@ module ShopifyApp
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def create_shop_migration
|
15
|
-
migration_template
|
15
|
+
migration_template 'db/migrate/create_shops.erb', 'db/migrate/create_shops.rb'
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
18
|
+
def update_shopify_app_initializer
|
19
|
+
gsub_file 'config/initializers/shopify_app.rb', 'ShopifyApp::InMemorySessionStore', 'Shop'
|
20
20
|
end
|
21
21
|
|
22
22
|
def create_shop_fixtures
|
data/lib/shopify_app.rb
CHANGED
@@ -10,22 +10,25 @@ require 'shopify_app/configuration'
|
|
10
10
|
# engine
|
11
11
|
require 'shopify_app/engine'
|
12
12
|
|
13
|
-
#
|
14
|
-
require 'shopify_app/webhooks_manager_job'
|
15
|
-
require 'shopify_app/scripttags_manager_job'
|
16
|
-
|
17
|
-
# helpers and concerns
|
18
|
-
require 'shopify_app/shop'
|
19
|
-
require 'shopify_app/session_storage'
|
20
|
-
require 'shopify_app/sessions_concern'
|
21
|
-
require 'shopify_app/localization'
|
22
|
-
require 'shopify_app/login_protection'
|
23
|
-
require 'shopify_app/webhooks_manager'
|
24
|
-
require 'shopify_app/scripttags_manager'
|
25
|
-
require 'shopify_app/webhook_verification'
|
26
|
-
require 'shopify_app/app_proxy_verification'
|
13
|
+
# utils
|
27
14
|
require 'shopify_app/utils'
|
28
15
|
|
29
|
-
#
|
30
|
-
require 'shopify_app/
|
31
|
-
require 'shopify_app/
|
16
|
+
# controller concerns
|
17
|
+
require 'shopify_app/controller_concerns/localization'
|
18
|
+
require 'shopify_app/controller_concerns/login_protection'
|
19
|
+
require 'shopify_app/controller_concerns/embedded_app'
|
20
|
+
require 'shopify_app/controller_concerns/webhook_verification'
|
21
|
+
require 'shopify_app/controller_concerns/app_proxy_verification'
|
22
|
+
|
23
|
+
# jobs
|
24
|
+
require 'shopify_app/jobs/webhooks_manager_job'
|
25
|
+
require 'shopify_app/jobs/scripttags_manager_job'
|
26
|
+
|
27
|
+
# managers
|
28
|
+
require 'shopify_app/managers/webhooks_manager'
|
29
|
+
require 'shopify_app/managers/scripttags_manager'
|
30
|
+
|
31
|
+
# session
|
32
|
+
require 'shopify_app/session/session_storage'
|
33
|
+
require 'shopify_app/session/session_repository'
|
34
|
+
require 'shopify_app/session/in_memory_session_store'
|
@@ -13,6 +13,10 @@ module ShopifyApp
|
|
13
13
|
attr_accessor :webhooks
|
14
14
|
attr_accessor :scripttags
|
15
15
|
attr_accessor :after_authenticate_job
|
16
|
+
attr_accessor :session_repository
|
17
|
+
|
18
|
+
# customise urls
|
19
|
+
attr_accessor :root_url
|
16
20
|
|
17
21
|
# customise ActiveJob queue names
|
18
22
|
attr_accessor :scripttags_manager_queue_name
|
@@ -22,23 +26,32 @@ module ShopifyApp
|
|
22
26
|
attr_accessor :myshopify_domain
|
23
27
|
|
24
28
|
def initialize
|
29
|
+
@root_url = '/'
|
25
30
|
@myshopify_domain = 'myshopify.com'
|
31
|
+
@scripttags_manager_queue_name = Rails.application.config.active_job.queue_name
|
32
|
+
@webhooks_manager_queue_name = Rails.application.config.active_job.queue_name
|
26
33
|
end
|
27
34
|
|
28
|
-
def
|
29
|
-
|
35
|
+
def login_url
|
36
|
+
File.join(@root_url, 'login')
|
30
37
|
end
|
31
38
|
|
32
|
-
def
|
33
|
-
|
39
|
+
def session_repository=(klass)
|
40
|
+
if Rails.configuration.cache_classes
|
41
|
+
ShopifyApp::SessionRepository.storage = klass
|
42
|
+
else
|
43
|
+
ActiveSupport::Reloader.to_prepare do
|
44
|
+
ShopifyApp::SessionRepository.storage = klass
|
45
|
+
end
|
46
|
+
end
|
34
47
|
end
|
35
48
|
|
36
|
-
def
|
37
|
-
|
49
|
+
def has_webhooks?
|
50
|
+
webhooks.present?
|
38
51
|
end
|
39
52
|
|
40
|
-
def
|
41
|
-
|
53
|
+
def has_scripttags?
|
54
|
+
scripttags.present?
|
42
55
|
end
|
43
56
|
end
|
44
57
|
|
data/lib/shopify_app/{app_proxy_verification.rb → controller_concerns/app_proxy_verification.rb}
RENAMED
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ShopifyApp
|
2
|
+
module EmbeddedApp
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if ShopifyApp.configuration.embedded_app?
|
7
|
+
after_action :set_esdk_headers
|
8
|
+
layout 'embedded_app'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def set_esdk_headers
|
15
|
+
response.set_header('P3P', 'CP="Not used"')
|
16
|
+
response.default_headers.delete('X-Frame-Options')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -41,20 +41,25 @@ module ShopifyApp
|
|
41
41
|
head :unauthorized
|
42
42
|
else
|
43
43
|
session[:return_to] = request.fullpath if request.get?
|
44
|
-
redirect_to
|
44
|
+
redirect_to login_url
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
def close_session
|
49
49
|
session[:shopify] = nil
|
50
50
|
session[:shopify_domain] = nil
|
51
|
-
redirect_to
|
51
|
+
redirect_to login_url
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
def login_url
|
55
|
+
url = ShopifyApp.configuration.login_url
|
56
|
+
|
57
|
+
if params[:shop].present?
|
58
|
+
query = { shop: params[:shop] }.to_query
|
59
|
+
url = "#{url}?#{query}"
|
60
|
+
end
|
61
|
+
|
62
|
+
url
|
58
63
|
end
|
59
64
|
|
60
65
|
def fullpage_redirect_to(url)
|
@@ -114,6 +119,5 @@ module ShopifyApp
|
|
114
119
|
return unless params[:shop].present?
|
115
120
|
ShopifyApp::Utils.sanitize_shop_domain(params[:shop])
|
116
121
|
end
|
117
|
-
|
118
122
|
end
|
119
123
|
end
|
data/lib/shopify_app/{webhook_verification.rb → controller_concerns/webhook_verification.rb}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ShopifyApp
|
2
|
+
class InMemorySessionStore
|
3
|
+
class EnvironmentError < StandardError; end
|
4
|
+
|
5
|
+
def self.retrieve(id)
|
6
|
+
repo[id]
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.store(session)
|
10
|
+
id = SecureRandom.uuid
|
11
|
+
repo[id] = session
|
12
|
+
id
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.clear
|
16
|
+
@@repo = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.repo
|
20
|
+
if Rails.env.production?
|
21
|
+
raise EnvironmentError.new("Cannot use InMemorySessionStore in a Production environment. \
|
22
|
+
Please initialize ShopifyApp with a model that can store and retrieve sessions")
|
23
|
+
end
|
24
|
+
@@repo ||= {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
File without changes
|
@@ -2,6 +2,15 @@ module ShopifyApp
|
|
2
2
|
module SessionStorage
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
+
included do
|
6
|
+
validates :shopify_domain, presence: true, uniqueness: true
|
7
|
+
validates :shopify_token, presence: true
|
8
|
+
end
|
9
|
+
|
10
|
+
def with_shopify_session(&block)
|
11
|
+
ShopifyAPI::Session.temp(shopify_domain, shopify_token, &block)
|
12
|
+
end
|
13
|
+
|
5
14
|
class_methods do
|
6
15
|
def store(session)
|
7
16
|
shop = self.find_or_initialize_by(shopify_domain: session.url)
|
data/lib/shopify_app/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify_app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 8.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -169,34 +169,31 @@ files:
|
|
169
169
|
- lib/generators/shopify_app/install/templates/omniauth.rb
|
170
170
|
- lib/generators/shopify_app/install/templates/shopify_app.rb
|
171
171
|
- lib/generators/shopify_app/install/templates/shopify_provider.rb
|
172
|
-
- lib/generators/shopify_app/install/templates/shopify_session_repository.rb
|
173
172
|
- lib/generators/shopify_app/routes/routes_generator.rb
|
174
173
|
- lib/generators/shopify_app/routes/templates/routes.rb
|
175
174
|
- lib/generators/shopify_app/shop_model/shop_model_generator.rb
|
176
175
|
- lib/generators/shopify_app/shop_model/templates/db/migrate/create_shops.erb
|
177
176
|
- lib/generators/shopify_app/shop_model/templates/shop.rb
|
178
|
-
- lib/generators/shopify_app/shop_model/templates/shopify_session_repository.rb
|
179
177
|
- lib/generators/shopify_app/shop_model/templates/shops.yml
|
180
178
|
- lib/generators/shopify_app/shopify_app_generator.rb
|
181
179
|
- lib/generators/shopify_app/views/views_generator.rb
|
182
180
|
- lib/shopify_app.rb
|
183
|
-
- lib/shopify_app/app_proxy_verification.rb
|
184
181
|
- lib/shopify_app/configuration.rb
|
182
|
+
- lib/shopify_app/controller_concerns/app_proxy_verification.rb
|
183
|
+
- lib/shopify_app/controller_concerns/embedded_app.rb
|
184
|
+
- lib/shopify_app/controller_concerns/localization.rb
|
185
|
+
- lib/shopify_app/controller_concerns/login_protection.rb
|
186
|
+
- lib/shopify_app/controller_concerns/webhook_verification.rb
|
185
187
|
- lib/shopify_app/engine.rb
|
186
|
-
- lib/shopify_app/
|
187
|
-
- lib/shopify_app/
|
188
|
-
- lib/shopify_app/
|
189
|
-
- lib/shopify_app/
|
190
|
-
- lib/shopify_app/
|
191
|
-
- lib/shopify_app/
|
192
|
-
- lib/shopify_app/
|
193
|
-
- lib/shopify_app/shop.rb
|
194
|
-
- lib/shopify_app/shopify_session_repository.rb
|
188
|
+
- lib/shopify_app/jobs/scripttags_manager_job.rb
|
189
|
+
- lib/shopify_app/jobs/webhooks_manager_job.rb
|
190
|
+
- lib/shopify_app/managers/scripttags_manager.rb
|
191
|
+
- lib/shopify_app/managers/webhooks_manager.rb
|
192
|
+
- lib/shopify_app/session/in_memory_session_store.rb
|
193
|
+
- lib/shopify_app/session/session_repository.rb
|
194
|
+
- lib/shopify_app/session/session_storage.rb
|
195
195
|
- lib/shopify_app/utils.rb
|
196
196
|
- lib/shopify_app/version.rb
|
197
|
-
- lib/shopify_app/webhook_verification.rb
|
198
|
-
- lib/shopify_app/webhooks_manager.rb
|
199
|
-
- lib/shopify_app/webhooks_manager_job.rb
|
200
197
|
- shipit.rubygems.yml
|
201
198
|
- shopify_app.gemspec
|
202
199
|
homepage:
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# You should replace InMemorySessionStore with what you will be using
|
2
|
-
# in Production. For example a model called "Shop":
|
3
|
-
#
|
4
|
-
# ShopifySessionRepository.storage = 'Shop'
|
5
|
-
#
|
6
|
-
# Interface to implement are self.retrieve(id) and self.store(ShopifyAPI::Session)
|
7
|
-
# Here is how you would add these functions to an ActiveRecord:
|
8
|
-
#
|
9
|
-
# class Shop < ActiveRecord::Base
|
10
|
-
# def self.store(session)
|
11
|
-
# shop = self.new(domain: session.url, token: session.token)
|
12
|
-
# shop.save!
|
13
|
-
# shop.id
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# def self.retrieve(id)
|
17
|
-
# if shop = self.where(id: id).first
|
18
|
-
# ShopifyAPI::Session.new(shop.domain, shop.token)
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
|
23
|
-
ShopifyApp::SessionRepository.storage = InMemorySessionStore
|
@@ -1,9 +0,0 @@
|
|
1
|
-
if Rails.configuration.cache_classes
|
2
|
-
ShopifyApp::SessionRepository.storage = Shop
|
3
|
-
else
|
4
|
-
reloader = defined?(ActiveSupport::Reloader) ? ActiveSupport::Reloader : ActionDispatch::Reloader
|
5
|
-
|
6
|
-
reloader.to_prepare do
|
7
|
-
ShopifyApp::SessionRepository.storage = Shop
|
8
|
-
end
|
9
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# WARNING - This really only works for development, see README for more details
|
2
|
-
class InMemorySessionStore
|
3
|
-
class EnvironmentError < StandardError; end
|
4
|
-
|
5
|
-
def self.retrieve(id)
|
6
|
-
repo[id]
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.store(session)
|
10
|
-
id = SecureRandom.uuid
|
11
|
-
repo[id] = session
|
12
|
-
id
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.clear
|
16
|
-
@@repo = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.repo
|
20
|
-
if Rails.env.production?
|
21
|
-
raise EnvironmentError.new("Cannot use InMemorySessionStore in a Production environment")
|
22
|
-
end
|
23
|
-
@@repo ||= {}
|
24
|
-
end
|
25
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
module ShopifyApp
|
2
|
-
module SessionsConcern
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
include ShopifyApp::LoginProtection
|
7
|
-
layout false, only: :new
|
8
|
-
end
|
9
|
-
|
10
|
-
def new
|
11
|
-
authenticate if sanitized_shop_name.present?
|
12
|
-
end
|
13
|
-
|
14
|
-
def create
|
15
|
-
authenticate
|
16
|
-
end
|
17
|
-
|
18
|
-
def callback
|
19
|
-
if auth_hash
|
20
|
-
login_shop
|
21
|
-
install_webhooks
|
22
|
-
install_scripttags
|
23
|
-
perform_after_authenticate_job
|
24
|
-
|
25
|
-
redirect_to return_address
|
26
|
-
else
|
27
|
-
flash[:error] = I18n.t('could_not_log_in')
|
28
|
-
redirect_to login_url
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def destroy
|
33
|
-
session[:shopify] = nil
|
34
|
-
session[:shopify_domain] = nil
|
35
|
-
flash[:notice] = I18n.t('.logged_out')
|
36
|
-
redirect_to login_url
|
37
|
-
end
|
38
|
-
|
39
|
-
protected
|
40
|
-
|
41
|
-
def authenticate
|
42
|
-
if sanitized_shop_name.present?
|
43
|
-
fullpage_redirect_to "#{main_app.root_path}auth/shopify?shop=#{sanitized_shop_name}"
|
44
|
-
else
|
45
|
-
redirect_to return_address
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def login_shop
|
50
|
-
sess = ShopifyAPI::Session.new(shop_name, token)
|
51
|
-
session[:shopify] = ShopifyApp::SessionRepository.store(sess)
|
52
|
-
session[:shopify_domain] = shop_name
|
53
|
-
end
|
54
|
-
|
55
|
-
def auth_hash
|
56
|
-
request.env['omniauth.auth']
|
57
|
-
end
|
58
|
-
|
59
|
-
def shop_name
|
60
|
-
auth_hash.uid
|
61
|
-
end
|
62
|
-
|
63
|
-
def token
|
64
|
-
auth_hash['credentials']['token']
|
65
|
-
end
|
66
|
-
|
67
|
-
def install_webhooks
|
68
|
-
return unless ShopifyApp.configuration.has_webhooks?
|
69
|
-
|
70
|
-
WebhooksManager.queue(
|
71
|
-
shop_name,
|
72
|
-
token,
|
73
|
-
ShopifyApp.configuration.webhooks
|
74
|
-
)
|
75
|
-
end
|
76
|
-
|
77
|
-
def install_scripttags
|
78
|
-
return unless ShopifyApp.configuration.has_scripttags?
|
79
|
-
|
80
|
-
ScripttagsManager.queue(
|
81
|
-
shop_name,
|
82
|
-
token,
|
83
|
-
ShopifyApp.configuration.scripttags
|
84
|
-
)
|
85
|
-
end
|
86
|
-
|
87
|
-
def return_address
|
88
|
-
session.delete(:return_to) || main_app.root_url
|
89
|
-
end
|
90
|
-
|
91
|
-
def perform_after_authenticate_job
|
92
|
-
config = ShopifyApp.configuration.after_authenticate_job
|
93
|
-
|
94
|
-
return unless config && config[:job].present?
|
95
|
-
|
96
|
-
if config[:inline] == true
|
97
|
-
config[:job].perform_now(shop_domain: session[:shopify_domain])
|
98
|
-
else
|
99
|
-
config[:job].perform_later(shop_domain: session[:shopify_domain])
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
data/lib/shopify_app/shop.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module ShopifyApp
|
2
|
-
module Shop
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
validates :shopify_domain, presence: true, uniqueness: true
|
7
|
-
validates :shopify_token, presence: true
|
8
|
-
end
|
9
|
-
|
10
|
-
def with_shopify_session(&block)
|
11
|
-
ShopifyAPI::Session.temp(shopify_domain, shopify_token, &block)
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|