shopify_app 21.10.0 → 22.00.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug-report.md +23 -18
- data/.github/workflows/build.yml +1 -1
- data/.github/workflows/rubocop.yml +2 -2
- data/CHANGELOG.md +14 -0
- data/CODE_OF_CONDUCT.md +46 -0
- data/Gemfile.lock +7 -9
- data/README.md +0 -1
- data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +5 -1
- data/app/controllers/concerns/shopify_app/ensure_installed.rb +2 -2
- data/app/controllers/shopify_app/callback_controller.rb +15 -14
- data/config/routes.rb +1 -1
- data/docs/Upgrading.md +25 -1
- data/docs/shopify_app/controller-concerns.md +21 -0
- data/docs/shopify_app/generators.md +2 -2
- data/lib/shopify_app/controller_concerns/embedded_app.rb +12 -4
- data/lib/shopify_app/controller_concerns/login_protection.rb +9 -11
- data/lib/shopify_app/engine.rb +1 -2
- data/lib/shopify_app/version.rb +1 -1
- data/lib/shopify_app.rb +0 -3
- data/package.json +1 -1
- data/shopify_app.gemspec +2 -3
- metadata +7 -28
- data/app/controllers/concerns/shopify_app/authenticated.rb +0 -17
- data/app/controllers/concerns/shopify_app/require_known_shop.rb +0 -16
- data/docs/shopify_app/script-tags.md +0 -28
- data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +0 -42
- data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +0 -63
- data/lib/shopify_app/controller_concerns/itp.rb +0 -50
- data/lib/shopify_app/jobs/scripttags_manager_job.rb +0 -16
- data/lib/shopify_app/managers/scripttags_manager.rb +0 -85
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3d5156af0790e87945886e2c5edd99822d04fb05b88ad318558ab7a71aec764e
|
|
4
|
+
data.tar.gz: e192e1581b1f9f183e3f10a9a8c4c8cb337202ea1bcf1325cc1c4ea5ba06a1f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 951051cf5170c58847b8f2fde2e779916f66afa8fba6ea3be75d9aaee605f747b334fb28022d5149909cdb96b10741fa8be8f69ab98df631fe07d3d19c24484d
|
|
7
|
+
data.tar.gz: 45bff8811720fd20cf7141441cc8ee70b0b7ca046962670b4bbf4d91e480be08220f744185e98a8e8d71ff64532f698b513a8ab534e7fc0b30126cdebee93748
|
|
@@ -6,36 +6,41 @@ labels: "Type: Bug 🐛"
|
|
|
6
6
|
|
|
7
7
|
# Issue summary
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
Before opening this issue, I have:
|
|
10
|
+
|
|
11
|
+
- [ ] Upgraded to the latest version of the package
|
|
12
|
+
- `shopify_app` version:
|
|
13
|
+
- Ruby version:
|
|
14
|
+
- Operating system:
|
|
15
|
+
- [ ] Set `log_level: :debug` [in my configuration](https://github.com/Shopify/shopify-api-ruby#setup-shopify-context), if applicable
|
|
16
|
+
- [ ] Found a reliable way to reproduce the problem that indicates it's a problem with the package
|
|
17
|
+
- [ ] Looked for similar issues in this repository
|
|
18
|
+
- [ ] Checked that this isn't an issue with a Shopify API
|
|
19
|
+
- If it is, please create a post in the [Shopify community forums](https://community.shopify.com/c/partners-and-developers/ct-p/appdev) or report it to [Shopify Partner Support](https://help.shopify.com/en/support/partners/org-select)
|
|
13
20
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Learn more: https://github.com/Shopify/shopify-api-ruby#setup-shopify-context
|
|
21
|
+
<!--
|
|
22
|
+
Write a short description of the issue here.
|
|
17
23
|
|
|
24
|
+
We can only fix issues for which there is a clear reproduction scenario.
|
|
25
|
+
The more context you can provide, the easier it becomes for us to investigate and fix the issue.
|
|
18
26
|
-->
|
|
19
27
|
|
|
20
|
-
- `shopify_api` version:
|
|
21
|
-
- `shopify_app` version:
|
|
22
|
-
- Ruby version:
|
|
23
|
-
- Operating system:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
// Paste any relevant logs here
|
|
27
|
-
```
|
|
28
|
-
|
|
29
28
|
## Expected behavior
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
What do you think should happen?
|
|
32
31
|
|
|
33
32
|
## Actual behavior
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
What actually happens?
|
|
36
35
|
|
|
37
36
|
## Steps to reproduce the problem
|
|
38
37
|
|
|
39
38
|
1.
|
|
40
39
|
1.
|
|
41
40
|
1.
|
|
41
|
+
|
|
42
|
+
## Debug logs
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
// Paste any relevant logs here
|
|
46
|
+
```
|
data/.github/workflows/build.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
Unreleased
|
|
2
2
|
----------
|
|
3
3
|
|
|
4
|
+
22.00.0 (March 5, 2024)
|
|
5
|
+
----------
|
|
6
|
+
* ⚠️ [Breaking] Bumps minimum supported Ruby version to 3.0. Bumps `shopify_api` to 14.0 [1801](https://github.com/Shopify/shopify_app/pull/1801)
|
|
7
|
+
* ⚠️ [Breaking] Removes deprecated controller concerns that were renamed in `v21.10.0`. [1805](https://github.com/Shopify/shopify_app/pull/1805)
|
|
8
|
+
* ⚠️ [Breaking] Removes deprecated `ScripttagManager`. We realize there was communication error in our logging where we logged future deprecation instead of our inteded removal. Since we have been logging that for 2 years we felt we'd move forward with the removal instead pushing this off until the next major release. [1806](https://github.com/Shopify/shopify_app/pull/1806)
|
|
9
|
+
* ⚠️ [Breaking] Removes ITP controller concern and `browser_sniffer` dependency.[1810](https://github.com/Shopify/shopify_app/pull/1810)
|
|
10
|
+
* ⚠️ [Breaking] Removes Marketing Extensions generator [1810](https://github.com/Shopify/shopify_app/pull/1810)
|
|
11
|
+
* ⚠️ [Breaking] Thows an error if a controller includes incompatible concerns (LoginProtection/EnsureInstalled) [1809](https://github.com/Shopify/shopify_app/pull/1809)
|
|
12
|
+
* ⚠️ [Breaking] No longer rescues non-shopify API errors during OAuth
|
|
13
|
+
callback [1807](https://github.com/Shopify/shopify_app/pull/1807)
|
|
14
|
+
* Make type param for webhooks route optional. This will fix a bug with CLI initiated webhooks.[1786](https://github.com/Shopify/shopify_app/pull/1786)
|
|
15
|
+
* Fix redirecting to login when we catch a 401 response from Shopify, so that it can also handle cases where the app is already embedded when that happens.[1787](https://github.com/Shopify/shopify_app/pull/1787)
|
|
16
|
+
* Always register webhooks with offline sessions.[1788](https://github.com/Shopify/shopify_app/pull/1788)
|
|
17
|
+
|
|
4
18
|
21.10.0 (January 24, 2024)
|
|
5
19
|
----------
|
|
6
20
|
* Fix session deletion for users with customized session storage[#1773](https://github.com/Shopify/shopify_app/pull/1773)
|
data/CODE_OF_CONDUCT.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Contributor Code of Conduct
|
|
2
|
+
|
|
3
|
+
As contributors and maintainers of this project, and in the interest of
|
|
4
|
+
fostering an open and welcoming community, we pledge to respect all
|
|
5
|
+
people who contribute through reporting issues, posting feature
|
|
6
|
+
requests, updating documentation, submitting pull requests or patches,
|
|
7
|
+
and other activities.
|
|
8
|
+
|
|
9
|
+
We are committed to making participation in this project a
|
|
10
|
+
harassment-free experience for everyone, regardless of level of
|
|
11
|
+
experience, gender, gender identity and expression, sexual orientation,
|
|
12
|
+
disability, personal appearance, body size, race, ethnicity, age,
|
|
13
|
+
religion, or nationality.
|
|
14
|
+
|
|
15
|
+
Examples of unacceptable behavior by participants include:
|
|
16
|
+
|
|
17
|
+
- The use of sexualized language or imagery
|
|
18
|
+
- Personal attacks
|
|
19
|
+
- Trolling or insulting/derogatory comments
|
|
20
|
+
- Public or private harassment
|
|
21
|
+
- Publishing other's private information, such as physical or electronic
|
|
22
|
+
addresses, without explicit permission
|
|
23
|
+
- Other unethical or unprofessional conduct
|
|
24
|
+
|
|
25
|
+
Project maintainers have the right and responsibility to remove, edit,
|
|
26
|
+
or reject comments, commits, code, wiki edits, issues, and other
|
|
27
|
+
contributions that are not aligned to this Code of Conduct, or to ban
|
|
28
|
+
temporarily or permanently any contributor for other behaviors that they
|
|
29
|
+
deem inappropriate, threatening, offensive, or harmful.
|
|
30
|
+
|
|
31
|
+
By adopting this Code of Conduct, project maintainers commit themselves
|
|
32
|
+
to fairly and consistently applying these principles to every aspect of
|
|
33
|
+
managing this project. Project maintainers who do not follow or enforce
|
|
34
|
+
the Code of Conduct may be permanently removed from the project team.
|
|
35
|
+
|
|
36
|
+
This Code of Conduct applies both within project spaces and in public
|
|
37
|
+
spaces when an individual is representing the project or its community.
|
|
38
|
+
|
|
39
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may
|
|
40
|
+
be reported by contacting a project maintainer at <opensource@shopify.com>.
|
|
41
|
+
All complaints will be reviewed and investigated and will result in a response
|
|
42
|
+
that is deemed necessary and appropriate to the circumstances. Maintainers are
|
|
43
|
+
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
44
|
+
|
|
45
|
+
This Code of Conduct is adapted from the Contributor Covenant, version
|
|
46
|
+
1.3.0, available from http://contributor-covenant.org/version/1/3/0/
|
data/Gemfile.lock
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
shopify_app (
|
|
4
|
+
shopify_app (22.00.0)
|
|
5
5
|
activeresource
|
|
6
6
|
addressable (~> 2.7)
|
|
7
|
-
browser_sniffer (~> 2.0)
|
|
8
7
|
jwt (>= 2.2.3)
|
|
9
8
|
rails (> 5.2.1)
|
|
10
9
|
redirect_safely (~> 1.0)
|
|
11
|
-
shopify_api (~>
|
|
10
|
+
shopify_api (~> 14)
|
|
12
11
|
sprockets-rails (>= 2.0.0)
|
|
13
12
|
|
|
14
13
|
GEM
|
|
@@ -86,7 +85,6 @@ GEM
|
|
|
86
85
|
ast (2.4.2)
|
|
87
86
|
binding_of_caller (1.0.0)
|
|
88
87
|
debug_inspector (>= 0.0.1)
|
|
89
|
-
browser_sniffer (2.2.0)
|
|
90
88
|
builder (3.2.4)
|
|
91
89
|
byebug (11.1.3)
|
|
92
90
|
coderay (1.1.3)
|
|
@@ -134,11 +132,11 @@ GEM
|
|
|
134
132
|
net-smtp (0.3.3)
|
|
135
133
|
net-protocol
|
|
136
134
|
nio4r (2.5.9)
|
|
137
|
-
nokogiri (1.
|
|
135
|
+
nokogiri (1.16.2-arm64-darwin)
|
|
138
136
|
racc (~> 1.4)
|
|
139
|
-
nokogiri (1.
|
|
137
|
+
nokogiri (1.16.2-x86_64-darwin)
|
|
140
138
|
racc (~> 1.4)
|
|
141
|
-
nokogiri (1.
|
|
139
|
+
nokogiri (1.16.2-x86_64-linux)
|
|
142
140
|
racc (~> 1.4)
|
|
143
141
|
oj (3.14.3)
|
|
144
142
|
openssl (3.1.0)
|
|
@@ -155,7 +153,7 @@ GEM
|
|
|
155
153
|
binding_of_caller (~> 1.0)
|
|
156
154
|
pry (~> 0.13)
|
|
157
155
|
public_suffix (5.0.1)
|
|
158
|
-
racc (1.
|
|
156
|
+
racc (1.7.3)
|
|
159
157
|
rack (2.2.7)
|
|
160
158
|
rack-test (2.1.0)
|
|
161
159
|
rack (>= 1.3)
|
|
@@ -217,7 +215,7 @@ GEM
|
|
|
217
215
|
ruby-progressbar (1.13.0)
|
|
218
216
|
ruby2_keywords (0.0.5)
|
|
219
217
|
securerandom (0.2.2)
|
|
220
|
-
shopify_api (
|
|
218
|
+
shopify_api (14.0.0)
|
|
221
219
|
activesupport
|
|
222
220
|
concurrent-ruby
|
|
223
221
|
hash_diff
|
data/README.md
CHANGED
|
@@ -106,7 +106,6 @@ You can find documentation on gem usage, concepts, mixins, installation, and mor
|
|
|
106
106
|
* [Engine](/docs/shopify_app/engine.md)
|
|
107
107
|
* [Controller Concerns](/docs/shopify_app/controller-concerns.md)
|
|
108
108
|
* [Generators](/docs/shopify_app/generators.md)
|
|
109
|
-
* [ScriptTags](/docs/shopify_app/script-tags.md)
|
|
110
109
|
* [Sessions](/docs/shopify_app/sessions.md)
|
|
111
110
|
* [Handling changes in access scopes](/docs/shopify_app/handling-access-scopes-changes.md)
|
|
112
111
|
* [Testing](/docs/shopify_app/testing.md)
|
|
@@ -20,11 +20,15 @@ module ShopifyApp
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def splash_page_with_params(params)
|
|
23
|
-
uri = URI(
|
|
23
|
+
uri = URI(base_url)
|
|
24
24
|
uri.query = params.compact.to_query
|
|
25
25
|
uri.to_s
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def base_url
|
|
29
|
+
ShopifyApp.configuration.root_url.presence || root_path
|
|
30
|
+
end
|
|
31
|
+
|
|
28
32
|
def redirect_to_splash_page
|
|
29
33
|
redirect_to(splash_page)
|
|
30
34
|
rescue ::ShopifyApp::ShopifyDomainNotFound => error
|
|
@@ -9,10 +9,10 @@ module ShopifyApp
|
|
|
9
9
|
if defined?(ShopifyApp::LoginProtection) && ancestors.include?(ShopifyApp::LoginProtection)
|
|
10
10
|
message = <<~EOS
|
|
11
11
|
We detected the use of incompatible concerns (EnsureInstalled and LoginProtection) in #{name},
|
|
12
|
-
which
|
|
12
|
+
which leads to unpredictable behavior. You cannot include both concerns in the same controller.
|
|
13
13
|
EOS
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
raise message
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
before_action :check_shop_domain
|
|
@@ -10,8 +10,12 @@ module ShopifyApp
|
|
|
10
10
|
begin
|
|
11
11
|
api_session, cookie = validated_auth_objects
|
|
12
12
|
rescue => error
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
if error.class.module_parent == ShopifyAPI::Errors
|
|
14
|
+
callback_rescue(error)
|
|
15
|
+
return respond_with_error
|
|
16
|
+
else
|
|
17
|
+
raise error
|
|
18
|
+
end
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
save_session(api_session) if api_session
|
|
@@ -25,6 +29,10 @@ module ShopifyApp
|
|
|
25
29
|
|
|
26
30
|
private
|
|
27
31
|
|
|
32
|
+
def callback_rescue(error)
|
|
33
|
+
ShopifyApp::Logger.debug("#{error.class} was rescued and redirected to login_url_with_optional_shop")
|
|
34
|
+
end
|
|
35
|
+
|
|
28
36
|
def deprecate_callback_rescue(error)
|
|
29
37
|
message = <<~EOS
|
|
30
38
|
An error of type #{error.class} was rescued. This is not part of `ShopifyAPI::Errors`, which could indicate a
|
|
@@ -130,8 +138,11 @@ module ShopifyApp
|
|
|
130
138
|
end
|
|
131
139
|
|
|
132
140
|
def perform_post_authenticate_jobs(session)
|
|
133
|
-
|
|
134
|
-
|
|
141
|
+
# Ensure we use the shop session to install webhooks
|
|
142
|
+
session_for_shop = session.online? ? shop_session : session
|
|
143
|
+
|
|
144
|
+
install_webhooks(session_for_shop)
|
|
145
|
+
|
|
135
146
|
perform_after_authenticate_job(session)
|
|
136
147
|
end
|
|
137
148
|
|
|
@@ -141,16 +152,6 @@ module ShopifyApp
|
|
|
141
152
|
WebhooksManager.queue(session.shop, session.access_token)
|
|
142
153
|
end
|
|
143
154
|
|
|
144
|
-
def install_scripttags(session)
|
|
145
|
-
return unless ShopifyApp.configuration.has_scripttags?
|
|
146
|
-
|
|
147
|
-
ScripttagsManager.queue(
|
|
148
|
-
session.shop,
|
|
149
|
-
session.access_token,
|
|
150
|
-
ShopifyApp.configuration.scripttags,
|
|
151
|
-
)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
155
|
def perform_after_authenticate_job(session)
|
|
155
156
|
config = ShopifyApp.configuration.after_authenticate_job
|
|
156
157
|
|
data/config/routes.rb
CHANGED
data/docs/Upgrading.md
CHANGED
|
@@ -8,6 +8,8 @@ This file documents important changes needed to upgrade your app's Shopify App v
|
|
|
8
8
|
|
|
9
9
|
[Unreleased](#unreleased)
|
|
10
10
|
|
|
11
|
+
[Upgrading to `v22.0.0`](#upgrading-to-v2200)
|
|
12
|
+
|
|
11
13
|
[Upgrading to `v20.3.0`](#upgrading-to-v2030)
|
|
12
14
|
|
|
13
15
|
[Upgrading to `v20.2.0`](#upgrading-to-v2020)
|
|
@@ -38,8 +40,30 @@ We also recommend the use of a staging site which matches your production enviro
|
|
|
38
40
|
|
|
39
41
|
If you do run into issues, we recommend looking at our [debugging tips.](https://github.com/Shopify/shopify_app/blob/main/docs/Troubleshooting.md#debugging-tips)
|
|
40
42
|
|
|
43
|
+
## Upgrading to `v22.0.0`
|
|
44
|
+
#### Dropped support for Ruby 2.x
|
|
45
|
+
Support for Ruby 2.x has been dropped as it is no longer supported. You'll need to upgrade to 3.x.x
|
|
46
|
+
|
|
47
|
+
#### Renamed Controller Concerns
|
|
48
|
+
The following controller concerns have been renamed/replaced in `v21.10.0` and have now been removed. To upgrade, please rename any usage in your apps's controllers that include them to the following:
|
|
49
|
+
|
|
50
|
+
|Old Deprecated Controller Concern |Replaced By New Controller Concern|
|
|
51
|
+
|---|---|
|
|
52
|
+
|`Authenticated`|`EnsureHasSession`|
|
|
53
|
+
|`RequireKnownShop`|`EnsureInstalled`|
|
|
54
|
+
|
|
55
|
+
The new names better reflect what assurances the including the controller concern provide. The new concern provide similar if not identical functionality as the concerns they replaced.
|
|
56
|
+
|
|
57
|
+
#### Remove ScripttagManager
|
|
58
|
+
Script tag usage has largely been replaced with the adoption of [theme app extensions](https://shopify.dev/docs/apps/online-store/theme-app-extensions) and [thank you order status customization](https://shopify.dev/docs/apps/checkout/thank-you-order-status). The manager has been removed with this major release due to effective replacement and a goal to have parity in supported functionality across language stacks.
|
|
59
|
+
|
|
60
|
+
If you find yourself still using Scipt Tags and want to continue the pattern of declarative management of script tags this gem used to use, we recommend porting the logic [the manager used in prior versions](https://github.com/Shopify/shopify_app/blob/2336fabc6d0b45a4dee3f336455dace4d2d88bc4/lib/shopify_app/managers/scripttags_manager.rb#L4) and implementing it in a [post authentication job](https://github.com/Shopify/shopify_app/blob/main/docs/shopify_app/authentication.md#run-jobs-after-the-oauth-flow). This is the recommended flow to create script tags (or any other logic) for stores that install your app.
|
|
61
|
+
|
|
62
|
+
#### No longer rescue non-shopify API errors during customized OAuth flow
|
|
63
|
+
If you have customized authentication logic and are counting on the `CallbackController` to catch your error and redirect to login, you'll need to catch that error and redirect to `login_url_with_optional_shop`.
|
|
64
|
+
|
|
41
65
|
## Upgrading to 21.3.0
|
|
42
|
-
The `Itp` controller concern has been removed from `LoginProtection` which is included by the `Authenticated` controller concern.
|
|
66
|
+
The `Itp` controller concern has been removed from `LoginProtection` which is included by the `Authenticated`/`EnsureHasSession` controller concern.
|
|
43
67
|
If any of your controllers are dependant on methods from `Itp` then you can include `ShopifyApp::Itp` directly.
|
|
44
68
|
You may notice a deprecation notice saying, `Itp will be removed in an upcoming version`.
|
|
45
69
|
This is because we intend on removing `Itp` completely in `v22.0.0`, but this will work in the meantime.
|
|
@@ -64,5 +64,26 @@ Implements Rails' [protect_from_forgery](https://api.rubyonrails.org/classes/Act
|
|
|
64
64
|
#### EmbeddedApp
|
|
65
65
|
If your ShopifyApp configuration has the `embedded_app` config set to true, [P3P header](https://www.w3.org/P3P/) and [content security policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) are handled for you.
|
|
66
66
|
|
|
67
|
+
By default, the `EmbeddedApp` concern also sets the layout file to be `app/views/layouts/embedded_app.html.erb`.
|
|
68
|
+
|
|
69
|
+
Sometimes one wants to run an embedded app in non-embedded mode. For example:
|
|
70
|
+
|
|
71
|
+
- When the remote environment is a CI;
|
|
72
|
+
- When the remote environment is a preview/PR app;
|
|
73
|
+
- When the developer wants to run the app in a non-embedded mode for testing.
|
|
74
|
+
|
|
75
|
+
To use the same application layout for every application controller, a developer can now overwrite the `#use_embedded_app_layout?` method.
|
|
76
|
+
|
|
77
|
+
```ruby
|
|
78
|
+
class ApplicationController
|
|
79
|
+
# Ensures every controller is using the standard app/views/layouts/application.html.erb layout.
|
|
80
|
+
#
|
|
81
|
+
# @return [true, false]
|
|
82
|
+
def use_embedded_app_layout?
|
|
83
|
+
false
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
```
|
|
87
|
+
|
|
67
88
|
#### EnsureBilling
|
|
68
89
|
If billing is enabled for the app, the active payment for the session is queried and enforced if needed. If billing is required the user will be redirected to a page requesting payment.
|
|
@@ -68,13 +68,13 @@ Specify whether the app is an embedded app. Apps are embedded by default.
|
|
|
68
68
|
|
|
69
69
|
#### `$ rails generate shopify_app:shop_model`
|
|
70
70
|
|
|
71
|
-
This generator creates a `Shop` model and a migration to store shop installation records. See [*Shop-based token strategy*](/docs/shopify_app/
|
|
71
|
+
This generator creates a `Shop` model and a migration to store shop installation records. See [*Shop-based token strategy*](/docs/shopify_app/sessions.md#shop-offline-token-storage) to learn more.
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
75
|
#### `$ rails generate shopify_app:user_model`
|
|
76
76
|
|
|
77
|
-
This generator creates a `User` model and a migration to store user records. See [*User-based token strategy*](/docs/shopify_app/
|
|
77
|
+
This generator creates a `User` model and a migration to store user records. See [*User-based token strategy*](/docs/shopify_app/sessions.md#user-online-token-storage) to learn more.
|
|
78
78
|
|
|
79
79
|
---
|
|
80
80
|
|
|
@@ -7,14 +7,22 @@ module ShopifyApp
|
|
|
7
7
|
include ShopifyApp::FrameAncestors
|
|
8
8
|
|
|
9
9
|
included do
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
layout :embedded_app_layout
|
|
11
|
+
after_action :set_esdk_headers, if: -> { ShopifyApp.configuration.embedded_app? }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
def use_embedded_app_layout?
|
|
17
|
+
ShopifyApp.configuration.embedded_app?
|
|
14
18
|
end
|
|
15
19
|
|
|
16
20
|
private
|
|
17
21
|
|
|
22
|
+
def embedded_app_layout
|
|
23
|
+
"embedded_app" if use_embedded_app_layout?
|
|
24
|
+
end
|
|
25
|
+
|
|
18
26
|
def set_esdk_headers
|
|
19
27
|
response.set_header("P3P", 'CP="Not used"')
|
|
20
28
|
response.headers.except!("X-Frame-Options")
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "browser_sniffer"
|
|
4
|
-
|
|
5
3
|
module ShopifyApp
|
|
6
4
|
module LoginProtection
|
|
7
5
|
extend ActiveSupport::Concern
|
|
8
6
|
include ShopifyApp::SanitizedParams
|
|
9
7
|
|
|
10
8
|
included do
|
|
11
|
-
if defined?(ShopifyApp::
|
|
12
|
-
|
|
13
|
-
ancestors.include?(ShopifyApp::RequireKnownShop || ShopifyApp::EnsureInstalled)
|
|
9
|
+
if defined?(ShopifyApp::EnsureInstalled) &&
|
|
10
|
+
ancestors.include?(ShopifyApp::EnsureInstalled)
|
|
14
11
|
message = <<~EOS
|
|
15
|
-
We detected the use of incompatible concerns (
|
|
16
|
-
which
|
|
12
|
+
We detected the use of incompatible concerns (EnsureInstalled and LoginProtection) in #{name},
|
|
13
|
+
which leads to unpredictable behavior. You cannot include both concerns in the same controller.
|
|
17
14
|
EOS
|
|
18
|
-
|
|
15
|
+
raise message
|
|
19
16
|
end
|
|
20
17
|
|
|
21
18
|
rescue_from ShopifyAPI::Errors::HttpResponseError, with: :handle_http_error
|
|
@@ -147,10 +144,11 @@ module ShopifyApp
|
|
|
147
144
|
end
|
|
148
145
|
|
|
149
146
|
def close_session
|
|
150
|
-
clear_shopify_session
|
|
151
147
|
ShopifyApp::Logger.debug("Closing session")
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
clear_shopify_session
|
|
149
|
+
|
|
150
|
+
ShopifyApp::Logger.debug("Redirecting to login")
|
|
151
|
+
redirect_to_login
|
|
154
152
|
end
|
|
155
153
|
|
|
156
154
|
def handle_http_error(error)
|
data/lib/shopify_app/engine.rb
CHANGED
|
@@ -5,7 +5,7 @@ module ShopifyApp
|
|
|
5
5
|
private
|
|
6
6
|
|
|
7
7
|
def args_info(job)
|
|
8
|
-
log_disabled_classes = ["ShopifyApp::
|
|
8
|
+
log_disabled_classes = ["ShopifyApp::WebhooksManagerJob"]
|
|
9
9
|
return "" if log_disabled_classes.include?(job.class.name)
|
|
10
10
|
|
|
11
11
|
super
|
|
@@ -35,7 +35,6 @@ module ShopifyApp
|
|
|
35
35
|
ActiveSupport.on_load(:active_job) do
|
|
36
36
|
if ActiveJob::Base.respond_to?(:log_arguments?)
|
|
37
37
|
WebhooksManagerJob.log_arguments = false
|
|
38
|
-
ScripttagsManagerJob.log_arguments = false
|
|
39
38
|
elsif ActiveJob::Logging::LogSubscriber.private_method_defined?(:args_info)
|
|
40
39
|
ActiveJob::Logging::LogSubscriber.prepend(RedactJobParams)
|
|
41
40
|
end
|
data/lib/shopify_app/version.rb
CHANGED
data/lib/shopify_app.rb
CHANGED
|
@@ -44,7 +44,6 @@ module ShopifyApp
|
|
|
44
44
|
require "shopify_app/controller_concerns/csrf_protection"
|
|
45
45
|
require "shopify_app/controller_concerns/localization"
|
|
46
46
|
require "shopify_app/controller_concerns/frame_ancestors"
|
|
47
|
-
require "shopify_app/controller_concerns/itp"
|
|
48
47
|
require "shopify_app/controller_concerns/sanitized_params"
|
|
49
48
|
require "shopify_app/controller_concerns/redirect_for_embedded"
|
|
50
49
|
require "shopify_app/controller_concerns/login_protection"
|
|
@@ -56,11 +55,9 @@ module ShopifyApp
|
|
|
56
55
|
|
|
57
56
|
# jobs
|
|
58
57
|
require "shopify_app/jobs/webhooks_manager_job"
|
|
59
|
-
require "shopify_app/jobs/scripttags_manager_job"
|
|
60
58
|
|
|
61
59
|
# managers
|
|
62
60
|
require "shopify_app/managers/webhooks_manager"
|
|
63
|
-
require "shopify_app/managers/scripttags_manager"
|
|
64
61
|
|
|
65
62
|
# middleware
|
|
66
63
|
require "shopify_app/middleware/jwt_middleware"
|
data/package.json
CHANGED
data/shopify_app.gemspec
CHANGED
|
@@ -10,17 +10,16 @@ Gem::Specification.new do |s|
|
|
|
10
10
|
s.author = "Shopify"
|
|
11
11
|
s.summary = "This gem is used to get quickly started with the Shopify API"
|
|
12
12
|
|
|
13
|
-
s.required_ruby_version = ">=
|
|
13
|
+
s.required_ruby_version = ">= 3.0"
|
|
14
14
|
|
|
15
15
|
s.metadata["allowed_push_host"] = "https://rubygems.org"
|
|
16
16
|
|
|
17
17
|
s.add_runtime_dependency("activeresource") # TODO: Remove this once all active resource dependencies are removed
|
|
18
18
|
s.add_runtime_dependency("addressable", "~> 2.7")
|
|
19
|
-
s.add_runtime_dependency("browser_sniffer", "~> 2.0")
|
|
20
19
|
s.add_runtime_dependency("jwt", ">= 2.2.3")
|
|
21
20
|
s.add_runtime_dependency("rails", "> 5.2.1")
|
|
22
21
|
s.add_runtime_dependency("redirect_safely", "~> 1.0")
|
|
23
|
-
s.add_runtime_dependency("shopify_api", "~>
|
|
22
|
+
s.add_runtime_dependency("shopify_api", "~> 14")
|
|
24
23
|
s.add_runtime_dependency("sprockets-rails", ">= 2.0.0")
|
|
25
24
|
|
|
26
25
|
s.add_development_dependency("byebug")
|
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: 22.00.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shopify
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-03-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activeresource
|
|
@@ -38,20 +38,6 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '2.7'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: browser_sniffer
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '2.0'
|
|
48
|
-
type: :runtime
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '2.0'
|
|
55
41
|
- !ruby/object:Gem::Dependency
|
|
56
42
|
name: jwt
|
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -100,14 +86,14 @@ dependencies:
|
|
|
100
86
|
requirements:
|
|
101
87
|
- - "~>"
|
|
102
88
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '
|
|
89
|
+
version: '14'
|
|
104
90
|
type: :runtime
|
|
105
91
|
prerelease: false
|
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
93
|
requirements:
|
|
108
94
|
- - "~>"
|
|
109
95
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '
|
|
96
|
+
version: '14'
|
|
111
97
|
- !ruby/object:Gem::Dependency
|
|
112
98
|
name: sprockets-rails
|
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -301,6 +287,7 @@ files:
|
|
|
301
287
|
- ".ruby-version"
|
|
302
288
|
- ".spin/rails/prepare-application"
|
|
303
289
|
- CHANGELOG.md
|
|
290
|
+
- CODE_OF_CONDUCT.md
|
|
304
291
|
- CONTRIBUTING.md
|
|
305
292
|
- Gemfile
|
|
306
293
|
- Gemfile.lock
|
|
@@ -312,11 +299,9 @@ files:
|
|
|
312
299
|
- app/assets/javascripts/shopify_app/app_bridge_3.7.8.js
|
|
313
300
|
- app/assets/javascripts/shopify_app/app_bridge_redirect.js
|
|
314
301
|
- app/assets/javascripts/shopify_app/redirect.js
|
|
315
|
-
- app/controllers/concerns/shopify_app/authenticated.rb
|
|
316
302
|
- app/controllers/concerns/shopify_app/ensure_authenticated_links.rb
|
|
317
303
|
- app/controllers/concerns/shopify_app/ensure_has_session.rb
|
|
318
304
|
- app/controllers/concerns/shopify_app/ensure_installed.rb
|
|
319
|
-
- app/controllers/concerns/shopify_app/require_known_shop.rb
|
|
320
305
|
- app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb
|
|
321
306
|
- app/controllers/shopify_app/authenticated_controller.rb
|
|
322
307
|
- app/controllers/shopify_app/callback_controller.rb
|
|
@@ -364,7 +349,6 @@ files:
|
|
|
364
349
|
- docs/shopify_app/generators.md
|
|
365
350
|
- docs/shopify_app/handling-access-scopes-changes.md
|
|
366
351
|
- docs/shopify_app/logging.md
|
|
367
|
-
- docs/shopify_app/script-tags.md
|
|
368
352
|
- docs/shopify_app/sessions.md
|
|
369
353
|
- docs/shopify_app/testing.md
|
|
370
354
|
- docs/shopify_app/webhooks.md
|
|
@@ -374,8 +358,6 @@ files:
|
|
|
374
358
|
- lib/generators/shopify_app/add_after_authenticate_job/templates/after_authenticate_job.rb
|
|
375
359
|
- lib/generators/shopify_app/add_app_uninstalled_job/add_app_uninstalled_job_generator.rb
|
|
376
360
|
- lib/generators/shopify_app/add_app_uninstalled_job/templates/app_uninstalled_job.rb.tt
|
|
377
|
-
- lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb
|
|
378
|
-
- lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb
|
|
379
361
|
- lib/generators/shopify_app/add_privacy_jobs/add_privacy_jobs_generator.rb
|
|
380
362
|
- lib/generators/shopify_app/add_privacy_jobs/templates/customers_data_request_job.rb.tt
|
|
381
363
|
- lib/generators/shopify_app/add_privacy_jobs/templates/customers_redact_job.rb.tt
|
|
@@ -432,7 +414,6 @@ files:
|
|
|
432
414
|
- lib/shopify_app/controller_concerns/embedded_app.rb
|
|
433
415
|
- lib/shopify_app/controller_concerns/ensure_billing.rb
|
|
434
416
|
- lib/shopify_app/controller_concerns/frame_ancestors.rb
|
|
435
|
-
- lib/shopify_app/controller_concerns/itp.rb
|
|
436
417
|
- lib/shopify_app/controller_concerns/localization.rb
|
|
437
418
|
- lib/shopify_app/controller_concerns/login_protection.rb
|
|
438
419
|
- lib/shopify_app/controller_concerns/payload_verification.rb
|
|
@@ -441,10 +422,8 @@ files:
|
|
|
441
422
|
- lib/shopify_app/controller_concerns/webhook_verification.rb
|
|
442
423
|
- lib/shopify_app/engine.rb
|
|
443
424
|
- lib/shopify_app/errors.rb
|
|
444
|
-
- lib/shopify_app/jobs/scripttags_manager_job.rb
|
|
445
425
|
- lib/shopify_app/jobs/webhooks_manager_job.rb
|
|
446
426
|
- lib/shopify_app/logger.rb
|
|
447
|
-
- lib/shopify_app/managers/scripttags_manager.rb
|
|
448
427
|
- lib/shopify_app/managers/webhooks_manager.rb
|
|
449
428
|
- lib/shopify_app/middleware/jwt_middleware.rb
|
|
450
429
|
- lib/shopify_app/session/in_memory_session_store.rb
|
|
@@ -482,14 +461,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
482
461
|
requirements:
|
|
483
462
|
- - ">="
|
|
484
463
|
- !ruby/object:Gem::Version
|
|
485
|
-
version: '
|
|
464
|
+
version: '3.0'
|
|
486
465
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
487
466
|
requirements:
|
|
488
467
|
- - ">="
|
|
489
468
|
- !ruby/object:Gem::Version
|
|
490
469
|
version: '0'
|
|
491
470
|
requirements: []
|
|
492
|
-
rubygems_version: 3.5.
|
|
471
|
+
rubygems_version: 3.5.6
|
|
493
472
|
signing_key:
|
|
494
473
|
specification_version: 4
|
|
495
474
|
summary: This gem is used to get quickly started with the Shopify API
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module ShopifyApp
|
|
4
|
-
module Authenticated
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
|
|
7
|
-
included do
|
|
8
|
-
ShopifyApp::Logger.deprecated(
|
|
9
|
-
"Authenticated has been replaced by EnsureHasSession."\
|
|
10
|
-
" Please use the EnsureHasSession controller concern for the same behavior",
|
|
11
|
-
"22.0.0",
|
|
12
|
-
)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
include ShopifyApp::EnsureHasSession
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module ShopifyApp
|
|
4
|
-
module RequireKnownShop
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
include ShopifyApp::EnsureInstalled
|
|
7
|
-
|
|
8
|
-
included do
|
|
9
|
-
ShopifyApp::Logger.deprecated(
|
|
10
|
-
"RequireKnownShop has been replaced by EnsureInstalled."\
|
|
11
|
-
" Please use the EnsureInstalled controller concern for the same behavior",
|
|
12
|
-
"22.0.0",
|
|
13
|
-
)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# ScriptTags
|
|
2
|
-
|
|
3
|
-
#### Table of contents
|
|
4
|
-
|
|
5
|
-
[Manage ScriptTags using the Shopify App initializer](#manage-scripttags-using-the-shopify-app-initializer)
|
|
6
|
-
|
|
7
|
-
## Manage ScriptTags using the Shopify App initializer
|
|
8
|
-
|
|
9
|
-
As with webhooks, ShopifyApp can manage your app's [ScriptTags](https://shopify-dev-staging.shopifycloud.com/docs/admin-api/graphql/reference/online-store/scripttag) for you by setting which scripttags you require in the initializer:
|
|
10
|
-
|
|
11
|
-
```ruby
|
|
12
|
-
ShopifyApp.configure do |config|
|
|
13
|
-
config.scripttags = [
|
|
14
|
-
{event:'onload', src: 'https://example.com/fancy.js'},
|
|
15
|
-
{event:'onload', src: ->(domain) { dynamic_tag_url(domain) } }
|
|
16
|
-
]
|
|
17
|
-
end
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
You also need to have write_script_tags permission in the config scope in order to add script tags automatically:
|
|
21
|
-
|
|
22
|
-
```ruby
|
|
23
|
-
config.scope = '... , write_script_tags'
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Scripttags are created in the same way as the [Webhooks](/docs/shopify_app/webhooks.md), with a background job which will create the required scripttags.
|
|
27
|
-
|
|
28
|
-
If `src` responds to `call` its return value will be used as the scripttag's source. It will be called on scripttag creation and deletion.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "rails/generators/base"
|
|
4
|
-
|
|
5
|
-
module ShopifyApp
|
|
6
|
-
module Generators
|
|
7
|
-
class AddMarketingActivityExtensionGenerator < Rails::Generators::Base
|
|
8
|
-
source_root File.expand_path("../templates", __FILE__)
|
|
9
|
-
|
|
10
|
-
def generate_app_extension
|
|
11
|
-
ShopifyApp::Logger.deprecated("MarketingActivitiesController will be removed in an upcoming version", "22.0.0")
|
|
12
|
-
template("marketing_activities_controller.rb", "app/controllers/marketing_activities_controller.rb")
|
|
13
|
-
generate_routes
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
private
|
|
17
|
-
|
|
18
|
-
def generate_routes
|
|
19
|
-
inject_into_file(
|
|
20
|
-
"config/routes.rb",
|
|
21
|
-
optimize_indentation(routes, 2),
|
|
22
|
-
after: "root :to => 'home#index'\n",
|
|
23
|
-
)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def routes
|
|
27
|
-
<<~EOS
|
|
28
|
-
|
|
29
|
-
resource :marketing_activities, only: [:create, :update] do
|
|
30
|
-
patch :resume
|
|
31
|
-
patch :pause
|
|
32
|
-
patch :delete
|
|
33
|
-
post :republish
|
|
34
|
-
post :preload_form_data
|
|
35
|
-
post :preview
|
|
36
|
-
post :errors
|
|
37
|
-
end
|
|
38
|
-
EOS
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class MarketingActivitiesController < ShopifyApp::ExtensionVerificationController
|
|
4
|
-
def preload_form_data
|
|
5
|
-
preload_data = {
|
|
6
|
-
"form_data": {},
|
|
7
|
-
}
|
|
8
|
-
render(json: preload_data, status: :ok)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def update
|
|
12
|
-
render(json: {}, status: :accepted)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def pause
|
|
16
|
-
render(json: {}, status: :accepted)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def resume
|
|
20
|
-
render(json: {}, status: :accepted)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def delete
|
|
24
|
-
render(json: {}, status: :accepted)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def preview
|
|
28
|
-
placeholder_img = "https://cdn.shopify.com/s/files/1/0533/2089/files/placeholder-images-image_small.png"
|
|
29
|
-
preview_response = {
|
|
30
|
-
"desktop": {
|
|
31
|
-
"preview_url": placeholder_img,
|
|
32
|
-
"content_type": "text/html",
|
|
33
|
-
"width": 360,
|
|
34
|
-
"height": 200,
|
|
35
|
-
},
|
|
36
|
-
"mobile": {
|
|
37
|
-
"preview_url": placeholder_img,
|
|
38
|
-
"content_type": "text/html",
|
|
39
|
-
"width": 360,
|
|
40
|
-
"height": 200,
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
render(json: preview_response, status: :ok)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def create
|
|
47
|
-
render(json: {}, status: :ok)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def republish
|
|
51
|
-
render(json: {}, status: :accepted)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def errors
|
|
55
|
-
request_id = params[:request_id]
|
|
56
|
-
message = params[:message]
|
|
57
|
-
|
|
58
|
-
ShopifyApp::Logger.info("[Marketing Activity App Error Feedback]"\
|
|
59
|
-
"Request id: #{request_id}, message: #{message}")
|
|
60
|
-
|
|
61
|
-
render(json: {}, status: :ok)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module ShopifyApp
|
|
4
|
-
# Cookie management helpers required for ITP implementation
|
|
5
|
-
module Itp
|
|
6
|
-
extend ActiveSupport::Concern
|
|
7
|
-
included do
|
|
8
|
-
ShopifyApp::Logger.deprecated("Itp will be removed in an upcoming version", "22.0.0")
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
def set_test_cookie
|
|
14
|
-
return unless ShopifyApp.configuration.embedded_app?
|
|
15
|
-
return unless user_agent_can_partition_cookies
|
|
16
|
-
|
|
17
|
-
session["shopify.cookies_persist"] = true
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def set_top_level_oauth_cookie
|
|
21
|
-
session["shopify.top_level_oauth"] = true
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def clear_top_level_oauth_cookie
|
|
25
|
-
session.delete("shopify.top_level_oauth")
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def user_agent_is_mobile
|
|
29
|
-
user_agent = BrowserSniffer.new(request.user_agent).browser_info
|
|
30
|
-
|
|
31
|
-
user_agent[:name].to_s.match(/Shopify\sMobile/)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def user_agent_is_pos
|
|
35
|
-
user_agent = BrowserSniffer.new(request.user_agent).browser_info
|
|
36
|
-
|
|
37
|
-
user_agent[:name].to_s.match(/Shopify\sPOS/)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def user_agent_can_partition_cookies
|
|
41
|
-
user_agent = BrowserSniffer.new(request.user_agent).browser_info
|
|
42
|
-
|
|
43
|
-
is_safari = user_agent[:name].to_s.match(/Safari/)
|
|
44
|
-
|
|
45
|
-
return false unless is_safari
|
|
46
|
-
|
|
47
|
-
user_agent[:version].to_s.match(/12\.0/)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module ShopifyApp
|
|
4
|
-
class ScripttagsManagerJob < ActiveJob::Base
|
|
5
|
-
queue_as do
|
|
6
|
-
ShopifyApp.configuration.scripttags_manager_queue_name
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def perform(shop_domain:, shop_token:, scripttags:)
|
|
10
|
-
ShopifyAPI::Auth::Session.temp(shop: shop_domain, access_token: shop_token) do
|
|
11
|
-
manager = ScripttagsManager.new(scripttags, shop_domain)
|
|
12
|
-
manager.create_scripttags
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module ShopifyApp
|
|
4
|
-
class ScripttagsManager
|
|
5
|
-
def self.queue(shop_domain, shop_token, scripttags)
|
|
6
|
-
ShopifyApp::ScripttagsManagerJob.perform_later(
|
|
7
|
-
shop_domain: shop_domain,
|
|
8
|
-
shop_token: shop_token,
|
|
9
|
-
# Procs cannot be serialized so we interpolate now, if necessary
|
|
10
|
-
scripttags: build_src(scripttags, shop_domain),
|
|
11
|
-
)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def self.build_src(scripttags, domain)
|
|
15
|
-
scripttags.map do |tag|
|
|
16
|
-
next tag unless tag[:src].respond_to?(:call)
|
|
17
|
-
|
|
18
|
-
tag = tag.dup
|
|
19
|
-
tag[:src] = tag[:src].call(domain)
|
|
20
|
-
tag
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
attr_reader :required_scripttags, :shop_domain
|
|
25
|
-
|
|
26
|
-
def initialize(scripttags, shop_domain)
|
|
27
|
-
ShopifyApp::Logger.deprecated("The ScripttagsManager will become deprecated in an upcoming version", "22.0.0")
|
|
28
|
-
@required_scripttags = scripttags
|
|
29
|
-
@shop_domain = shop_domain
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def recreate_scripttags!
|
|
33
|
-
destroy_scripttags
|
|
34
|
-
create_scripttags
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def create_scripttags
|
|
38
|
-
return unless required_scripttags.present?
|
|
39
|
-
|
|
40
|
-
expanded_scripttags.each do |scripttag|
|
|
41
|
-
create_scripttag(scripttag) unless scripttag_exists?(scripttag[:src])
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def destroy_scripttags
|
|
46
|
-
scripttags = expanded_scripttags
|
|
47
|
-
ShopifyAPI::ScriptTag.all.each do |tag|
|
|
48
|
-
tag.delete if required_scripttag?(scripttags, tag)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
@current_scripttags = nil
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
def expanded_scripttags
|
|
57
|
-
self.class.build_src(required_scripttags, shop_domain)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def required_scripttag?(scripttags, tag)
|
|
61
|
-
scripttags.map { |w| w[:src] }.include?(tag.src)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def create_scripttag(attributes)
|
|
65
|
-
scripttag = ShopifyAPI::ScriptTag.new
|
|
66
|
-
attributes.each { |key, value| scripttag.public_send("#{key}=", value) }
|
|
67
|
-
|
|
68
|
-
begin
|
|
69
|
-
scripttag.save!
|
|
70
|
-
rescue ShopifyAPI::Errors::HttpResponseError => e
|
|
71
|
-
raise ::ShopifyApp::CreationFailed, e.message
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
scripttag
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def scripttag_exists?(src)
|
|
78
|
-
current_scripttags[src]
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def current_scripttags
|
|
82
|
-
@current_scripttags ||= ShopifyAPI::ScriptTag.all.index_by(&:src)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|