webflow_sync 7.0.0 → 9.0.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/README.md +32 -39
- data/app/jobs/webflow_sync/create_item_job.rb +3 -11
- data/app/jobs/webflow_sync/destroy_item_job.rb +2 -2
- data/app/jobs/webflow_sync/initial_sync_job.rb +3 -3
- data/app/jobs/webflow_sync/update_item_job.rb +3 -7
- data/app/models/concerns/webflow_sync/callbacks.rb +10 -10
- data/app/models/concerns/webflow_sync/item_sync.rb +11 -5
- data/app/services/webflow_sync/api.rb +22 -64
- data/lib/webflow_sync/version.rb +1 -1
- metadata +4 -21
- data/lib/generators/webflow_sync/api_token_flow_generator.rb +0 -55
- data/lib/generators/webflow_sync/templates/api_token/omniauth_webflow.rb.erb +0 -3
- data/lib/generators/webflow_sync/templates/api_token/webflow_callback_controller.rb.erb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8fd929a83a27160a05394b80cb0b00fdd70951d8a8be0e4c9dd59f584a9eb19
|
4
|
+
data.tar.gz: 61abc4b09b23fab7fbcbd31b560dde4cd0aaab365fac9e9d056cb524f4918a9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6f2d26fcd46a36806fe574f44151f5cb4ef1b0bd69008814386f7b4955a995564f48142f192761817bed452752ee27b608760c69121bd5fafad74d7cdd27c2b
|
7
|
+
data.tar.gz: 18b0167348eafdb20e96d14db7c10371b18f43f9d4905f7ab0e59cd6483fed02e9049c63093ca9a350640b31833833c817a0d21e76d24cfd3d3ea918e7dcf994
|
data/README.md
CHANGED
@@ -1,22 +1,18 @@
|
|
1
1
|
[](https://github.com/vfonic/webflow_sync/actions)
|
2
2
|
|
3
|
-
|
4
3
|
# WebflowSync
|
5
4
|
|
6
|
-
Keep your Ruby on Rails records in sync with WebFlow
|
5
|
+
Keep your Ruby on Rails records in sync with WebFlow.\*
|
7
6
|
|
8
|
-
|
7
|
+
\*Currently only one way Rails => WebFlow synchronization.
|
9
8
|
|
10
9
|
For the latest changes, check the [CHANGELOG.md](CHANGELOG.md).
|
11
10
|
|
12
11
|
## Installation
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
Add these lines to your application's Gemfile:
|
13
|
+
Add this line to your application's Gemfile:
|
17
14
|
|
18
15
|
```ruby
|
19
|
-
gem 'webflow-ruby', github: 'vfonic/webflow-ruby', branch: 'allow-live-delete'
|
20
16
|
gem 'webflow_sync'
|
21
17
|
```
|
22
18
|
|
@@ -36,11 +32,8 @@ bundle exec rails generate webflow_sync:install
|
|
36
32
|
|
37
33
|
### Generate and set WebFlow API token
|
38
34
|
|
39
|
-
|
35
|
+
The easiest way to generate API v2 token is to clone the official [webflow-app-starter-v2](https://github.com/Webflow-Examples/webflow-app-starter-v2) repo and follow the instructions in their README.md.
|
40
36
|
|
41
|
-
```bash
|
42
|
-
bundle exec rails generate webflow_sync:api_token_flow
|
43
|
-
```
|
44
37
|
### Configuration options
|
45
38
|
|
46
39
|
In `config/initializers/webflow_sync.rb` you can specify configuration options:
|
@@ -50,25 +43,25 @@ In `config/initializers/webflow_sync.rb` you can specify configuration options:
|
|
50
43
|
3. `skip_webflow_sync` - skip synchronization for different environments.
|
51
44
|
4. `sync_webflow_slug` - save slug generated on WebFlow to the Rails model, `webflow_slug` column.
|
52
45
|
|
53
|
-
|
46
|
+
This can be useful if you want to link to WebFlow item directly from your Rails app:
|
54
47
|
|
55
|
-
|
56
|
-
|
57
|
-
|
48
|
+
```rb
|
49
|
+
link_to('View on site', "https://#{webflow_domain}/articles/#{record.webflow_slug}", target: :blank)
|
50
|
+
```
|
58
51
|
|
59
|
-
|
52
|
+
To save slug generated on WebFlow in Rails model, `webflow_slug` column:
|
60
53
|
|
61
|
-
|
62
|
-
|
54
|
+
1. add `webflow_slug` column on the model table, then
|
55
|
+
2. set the `sync_webflow_slug` option to `true`.
|
63
56
|
|
64
|
-
|
57
|
+
Example:
|
65
58
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
59
|
+
```rb
|
60
|
+
WebflowSync.configure do |config|
|
61
|
+
config.skip_webflow_sync = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SKIP_WEBFLOW_SYNC'))
|
62
|
+
config.sync_webflow_slug = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SYNC_WEBFLOW_SLUG'))
|
63
|
+
end
|
64
|
+
```
|
72
65
|
|
73
66
|
### Add WebflowSync to models
|
74
67
|
|
@@ -78,7 +71,7 @@ For each model that you want to sync to WebFlow, you need to run the collection
|
|
78
71
|
bundle exec rails generate webflow_sync:collection Article
|
79
72
|
```
|
80
73
|
|
81
|
-
Please note that this _does not_ create a
|
74
|
+
Please note that this _does not_ create a collection in WebFlow. You need to create collections in Webflow manually.
|
82
75
|
|
83
76
|
### Create WebFlow collections
|
84
77
|
|
@@ -97,12 +90,13 @@ Your WebFlow collection `slug` should be `"articles"`.
|
|
97
90
|
|
98
91
|
For Rails models named with multiple words, make a collection that have a space between words in the name. WebFlow will set the `slug` by replacing space for "-".
|
99
92
|
|
100
|
-
For example, for `FeaturedArticle` model
|
93
|
+
For example, for `FeaturedArticle` model in your Rails app, in Webflow you'll create a collection called `"Featured Articles"`:
|
101
94
|
|
102
95
|
```ruby
|
103
96
|
> FeaturedArticle.model_name.to_s.underscore.dasherize.pluralize
|
104
97
|
# => "featured-articles"
|
105
98
|
```
|
99
|
+
|
106
100
|
Your WebFlow collection `slug` in this case should be `"featured-articles"`.
|
107
101
|
|
108
102
|
### Set `webflow_site_id`
|
@@ -128,8 +122,8 @@ To do this, override the `#webflow_site_id` method provided by `WebflowSync::Ite
|
|
128
122
|
For example, you could have `Site` model in your codebase:
|
129
123
|
|
130
124
|
```ruby
|
131
|
-
# app/models/
|
132
|
-
class
|
125
|
+
# app/models/webflow_site.rb
|
126
|
+
class WebflowSite < ApplicationRecord
|
133
127
|
has_many :articles
|
134
128
|
end
|
135
129
|
|
@@ -137,10 +131,10 @@ end
|
|
137
131
|
class Article < ApplicationRecord
|
138
132
|
include WebflowSync::ItemSync
|
139
133
|
|
140
|
-
belongs_to :
|
134
|
+
belongs_to :webflow_site
|
141
135
|
|
142
136
|
def webflow_site_id
|
143
|
-
self.
|
137
|
+
self.webflow_site.webflow_site_id
|
144
138
|
end
|
145
139
|
end
|
146
140
|
```
|
@@ -180,10 +174,10 @@ end
|
|
180
174
|
|
181
175
|
### Sync a Rails model with the custom collection
|
182
176
|
|
183
|
-
If collection `slug` does not match the Rails model collection name, you can
|
184
|
-
|
177
|
+
If collection `slug` in Webflow does not match the Rails model collection name, you can override `webflow_collection_slug` method in your Rails model.
|
178
|
+
If you want to call `WebflowSync::CreateItemJob`, `WebflowSync::UpdateItemJob`, or `WebflowSync::DestroyItemJob` directly in your code, you can do so by passing the `collection_slug` as an argument.
|
185
179
|
|
186
|
-
|
180
|
+
Here are method signatures:
|
187
181
|
|
188
182
|
```ruby
|
189
183
|
WebflowSync::CreateItemJob.perform_later(model_name, id, collection_slug)
|
@@ -193,15 +187,15 @@ WebflowSync::DestroyItemJob.perform_later(collection_slug:, webflow_site_id:, we
|
|
193
187
|
|
194
188
|
Where:
|
195
189
|
|
196
|
-
|
197
|
-
|
198
|
-
|
190
|
+
1. `model_name` - Rails model that has `webflow_site_id` and `webflow_item_id` defined
|
191
|
+
2. `collection_slug` - slug of the WebFlow collection (defaults to: `model_name.underscore.dasherize.pluralize`)
|
199
192
|
|
200
193
|
For example:
|
201
194
|
|
202
195
|
```ruby
|
203
196
|
WebflowSync::CreateItemJob.perform_now('articles', 1, 'stories')
|
204
197
|
```
|
198
|
+
|
205
199
|
Or, if you want to use the default 'articles' collection_slug:
|
206
200
|
|
207
201
|
```ruby
|
@@ -222,7 +216,7 @@ You can also run this from a Rake task:
|
|
222
216
|
bundle exec rails "webflow_sync:initial_sync[articles]"
|
223
217
|
```
|
224
218
|
|
225
|
-
|
219
|
+
\*Quotes are needed in order for this to work in all shells.
|
226
220
|
|
227
221
|
### Important note
|
228
222
|
|
@@ -242,7 +236,6 @@ bundle exec rake
|
|
242
236
|
|
243
237
|
This gem wouldn't be possible without the amazing work of [webflow-ruby](https://github.com/penseo/webflow-ruby) gem. Thank you, [@phoet](https://github.com/phoet)!
|
244
238
|
|
245
|
-
|
246
239
|
## License
|
247
240
|
|
248
241
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -2,15 +2,7 @@
|
|
2
2
|
|
3
3
|
module WebflowSync
|
4
4
|
class CreateItemJob < ApplicationJob
|
5
|
-
|
6
|
-
# For collections that have spaces in their name, WebFlow sets slug by replacing space for "-".
|
7
|
-
# 'JobListing'.underscore.dasherize.pluralize => "job-listings"
|
8
|
-
# 'job_listing'.underscore.dasherize.pluralize => "job-listings"
|
9
|
-
# We can sync Rails model that has different class name than its WebFlow collection
|
10
|
-
# model_name => Rails model that has webflow_site_id and webflow_item_id columns
|
11
|
-
# collection_slug => slug of the WebFlow collection
|
12
|
-
# model_name = 'articles'; id = article.id, collection_slug = 'stories'
|
13
|
-
def perform(model_name, id, collection_slug = model_name.underscore.dasherize.pluralize)
|
5
|
+
def perform(collection_id:, model_name:, id:)
|
14
6
|
return if WebflowSync.configuration.skip_webflow_sync
|
15
7
|
|
16
8
|
model_class = model_name.underscore.classify.constantize
|
@@ -18,9 +10,9 @@ module WebflowSync
|
|
18
10
|
return if record.blank?
|
19
11
|
return if record.skip_webflow_sync
|
20
12
|
return if record.webflow_site_id.blank?
|
21
|
-
return WebflowSync::UpdateItemJob.perform_later(model_name
|
13
|
+
return WebflowSync::UpdateItemJob.perform_later(collection_id:, model_name:, id:) if record.webflow_item_id.present?
|
22
14
|
|
23
|
-
WebflowSync::Api.new(record.webflow_site_id).create_item(record
|
15
|
+
WebflowSync::Api.new(site_id: record.webflow_site_id).create_item(collection_id:, record:)
|
24
16
|
end
|
25
17
|
end
|
26
18
|
end
|
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
module WebflowSync
|
4
4
|
class DestroyItemJob < ApplicationJob
|
5
|
-
def perform(
|
5
|
+
def perform(collection_id:, webflow_site_id:, webflow_item_id:)
|
6
6
|
return if WebflowSync.configuration.skip_webflow_sync
|
7
7
|
return if webflow_site_id.blank?
|
8
8
|
return if webflow_item_id.blank?
|
9
9
|
|
10
|
-
WebflowSync::Api.new(webflow_site_id).delete_item(
|
10
|
+
WebflowSync::Api.new(site_id: webflow_site_id).delete_item(collection_id:, webflow_item_id:)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -5,9 +5,9 @@ module WebflowSync
|
|
5
5
|
def perform(collection_slug)
|
6
6
|
model_class = collection_slug.underscore.classify.constantize
|
7
7
|
model_class.where(webflow_item_id: nil).find_each do |record|
|
8
|
-
next if record.
|
8
|
+
next if record.should_skip_webflow_sync?
|
9
9
|
|
10
|
-
client(record.webflow_site_id).create_item(record,
|
10
|
+
client(record.webflow_site_id).create_item(collection_id: record.webflow_collection_id, record:)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -17,7 +17,7 @@ module WebflowSync
|
|
17
17
|
if @client&.site_id == site_id
|
18
18
|
@client
|
19
19
|
else
|
20
|
-
@client = WebflowSync::Api.new(site_id)
|
20
|
+
@client = WebflowSync::Api.new(site_id:)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -2,11 +2,7 @@
|
|
2
2
|
|
3
3
|
module WebflowSync
|
4
4
|
class UpdateItemJob < ApplicationJob
|
5
|
-
|
6
|
-
# For collections that have spaces in their name, WebFlow sets slug by replacing space for "-".
|
7
|
-
# 'JobListing'.underscore.dasherize.pluralize => 'job-listings'
|
8
|
-
# 'job_listing'.underscore.dasherize.pluralize => 'job-listings'
|
9
|
-
def perform(model_name, id, collection_slug = model_name.underscore.dasherize.pluralize)
|
5
|
+
def perform(collection_id:, model_name:, id:)
|
10
6
|
return if WebflowSync.configuration.skip_webflow_sync
|
11
7
|
|
12
8
|
model_class = model_name.underscore.classify.constantize
|
@@ -14,9 +10,9 @@ module WebflowSync
|
|
14
10
|
return if record.blank?
|
15
11
|
return if record.skip_webflow_sync
|
16
12
|
return if record.webflow_site_id.blank?
|
17
|
-
return WebflowSync::CreateItemJob.perform_later(model_name
|
13
|
+
return WebflowSync::CreateItemJob.perform_later(collection_id:, model_name:, id:) if record.webflow_item_id.blank?
|
18
14
|
|
19
|
-
WebflowSync::Api.new(record.webflow_site_id).update_item(record
|
15
|
+
WebflowSync::Api.new(site_id: record.webflow_site_id).update_item(collection_id:, record:)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
@@ -13,26 +13,26 @@ module WebflowSync
|
|
13
13
|
after_commit :destroy_webflow_item, on: :destroy
|
14
14
|
|
15
15
|
def create_webflow_item
|
16
|
-
return if
|
16
|
+
return if self.should_skip_webflow_sync?
|
17
17
|
|
18
|
-
WebflowSync::CreateItemJob.perform_later(self.model_name.
|
18
|
+
WebflowSync::CreateItemJob.perform_later(collection_id: self.webflow_collection_id, model_name: self.model_name.name, id:)
|
19
19
|
end
|
20
20
|
|
21
21
|
def update_webflow_item
|
22
|
-
return if
|
22
|
+
return if self.should_skip_webflow_sync?
|
23
23
|
|
24
|
-
WebflowSync::UpdateItemJob.perform_later(self.model_name.
|
24
|
+
WebflowSync::UpdateItemJob.perform_later(collection_id: self.webflow_collection_id, model_name: self.model_name.name, id:)
|
25
25
|
end
|
26
26
|
|
27
27
|
def destroy_webflow_item
|
28
|
-
return if
|
28
|
+
return if self.should_skip_webflow_sync?
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
WebflowSync::DestroyItemJob.perform_later(collection_id: self.webflow_collection_id, webflow_site_id:, webflow_item_id:)
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
def should_skip_webflow_sync?
|
34
|
+
WebflowSync.configuration.skip_webflow_sync || self.skip_webflow_sync ||
|
35
|
+
self.webflow_site_id.blank? || self.webflow_collection_id.blank?
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -23,8 +23,16 @@ module WebflowSync
|
|
23
23
|
# end
|
24
24
|
# end
|
25
25
|
#
|
26
|
-
def webflow_site_id
|
27
|
-
|
26
|
+
def webflow_site_id = WebflowSync.configuration.webflow_site_id
|
27
|
+
|
28
|
+
# override this method in your model to match the collection slug in Webflow
|
29
|
+
def webflow_collection_slug = self.model_name.collection.underscore.dasherize
|
30
|
+
|
31
|
+
# override this method in your model to match the collection id in Webflow
|
32
|
+
# overriding this method is optional, but it will save you a Webflow API call!
|
33
|
+
def webflow_collection_id
|
34
|
+
@webflow_collection_id ||= WebflowSync::Api.new(site_id: self.webflow_site_id)
|
35
|
+
.find_collection_id(collection_slug: self.webflow_collection_slug)
|
28
36
|
end
|
29
37
|
|
30
38
|
# You can customize this to your liking:
|
@@ -36,9 +44,7 @@ module WebflowSync
|
|
36
44
|
# image: self.image_url
|
37
45
|
# }
|
38
46
|
# end
|
39
|
-
def as_webflow_json
|
40
|
-
self.as_json
|
41
|
-
end
|
47
|
+
def as_webflow_json = self.as_json
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -4,98 +4,56 @@ module WebflowSync
|
|
4
4
|
class Api
|
5
5
|
attr_reader :site_id
|
6
6
|
|
7
|
-
def initialize(site_id
|
7
|
+
def initialize(site_id: nil)
|
8
8
|
@site_id = site_id
|
9
9
|
end
|
10
10
|
|
11
|
-
def get_all_items(
|
12
|
-
collection_id = find_webflow_collection(collection_slug).fetch('id')
|
13
|
-
max_items_per_page = [page_limit, 100].min
|
14
|
-
first_page_number = 1
|
11
|
+
def get_all_items(collection_id:) = make_request(:list_all_items, collection_id)
|
15
12
|
|
16
|
-
|
17
|
-
puts "Get all items from WebFlow for #{collection_slug} page: #{first_page_number}"
|
13
|
+
def get_item(collection_id:, webflow_item_id:) = make_request(:get_item, collection_id, webflow_item_id)
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
items = result.fetch('items')
|
15
|
+
def create_item(collection_id:, record:)
|
16
|
+
response = make_request(:create_item, collection_id, record.as_webflow_json)
|
22
17
|
|
23
|
-
(
|
24
|
-
|
25
|
-
puts "Get all items from WebFlow for #{collection_slug} page: #{page_number}"
|
26
|
-
|
27
|
-
items.concat next_page_items
|
18
|
+
unless update_record_columns(record, response)
|
19
|
+
raise "Failed to store webflow_item_id: '#{response.fetch(:id)}' after creating item in WebFlow collection #{record.inspect}"
|
28
20
|
end
|
29
21
|
|
30
|
-
|
22
|
+
response
|
31
23
|
end
|
32
24
|
|
33
|
-
def
|
34
|
-
collection = find_webflow_collection(collection_slug)
|
25
|
+
def update_item(collection_id:, record:) = make_request(:update_item, collection_id, record.webflow_item_id, record.as_webflow_json)
|
35
26
|
|
36
|
-
|
37
|
-
end
|
27
|
+
def delete_item(collection_id:, webflow_item_id:) = make_request(:delete_item, collection_id, webflow_item_id)
|
38
28
|
|
39
|
-
def
|
40
|
-
collection = find_webflow_collection(collection_slug)
|
41
|
-
response = make_request(:create_item, collection.fetch('id'), record.as_webflow_json, publish: true)
|
29
|
+
def publish = make_request(:publish, site_id)
|
42
30
|
|
43
|
-
|
44
|
-
|
45
|
-
response
|
46
|
-
else
|
47
|
-
raise "Failed to store webflow_item_id: '#{response.fetch('id')}' " \
|
48
|
-
"after creating item in WebFlow collection #{record.inspect}"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def update_item(record, collection_slug)
|
53
|
-
collection = find_webflow_collection(collection_slug)
|
54
|
-
response = make_request(:update_item, collection.fetch('id'), record.webflow_item_id, record.as_webflow_json, publish: true)
|
55
|
-
puts "Updated #{record.inspect} in #{collection_slug}"
|
56
|
-
response
|
57
|
-
end
|
31
|
+
def sites = make_request(:sites)
|
32
|
+
def self.sites = self.new.sites
|
58
33
|
|
59
|
-
def
|
60
|
-
|
61
|
-
response = make_request(:delete_item, collection.fetch('id'), webflow_item_id)
|
62
|
-
puts "Deleted #{webflow_item_id} from #{collection_slug}"
|
63
|
-
response
|
34
|
+
def collections
|
35
|
+
@collections ||= make_request(:collections, site_id)
|
64
36
|
end
|
65
37
|
|
66
|
-
def
|
67
|
-
response =
|
38
|
+
def find_collection_id(collection_slug:)
|
39
|
+
response = collections.find { |collection| collection.fetch(:slug) == collection_slug }
|
40
|
+
raise "Cannot find collection #{collection_slug} for Webflow site #{site_id}" unless response
|
68
41
|
|
69
|
-
|
70
|
-
response
|
42
|
+
response.fetch(:id)
|
71
43
|
end
|
72
44
|
|
73
|
-
def sites = make_request(:sites)
|
74
|
-
def self.sites = new.sites
|
75
|
-
|
76
45
|
private
|
77
46
|
|
78
47
|
def client
|
79
|
-
@client ||=
|
80
|
-
end
|
81
|
-
|
82
|
-
def collections
|
83
|
-
@collections ||= make_request(:collections, site_id).fetch('collections')
|
84
|
-
end
|
85
|
-
|
86
|
-
def find_webflow_collection(collection_slug)
|
87
|
-
response = collections.find { |collection| collection.fetch('slug') == collection_slug }
|
88
|
-
raise "Cannot find collection #{collection_slug} for Webflow site #{site_id}" unless response
|
89
|
-
|
90
|
-
response
|
48
|
+
@client ||= Webflow::Client.new
|
91
49
|
end
|
92
50
|
|
93
51
|
def update_record_columns(record, response)
|
94
52
|
# use update_column to skip callbacks to prevent WebflowSync::ItemSync to kick off
|
95
53
|
if WebflowSync.configuration.sync_webflow_slug
|
96
|
-
record.update_columns(webflow_item_id: response.fetch(
|
54
|
+
record.update_columns(webflow_item_id: response.fetch(:id), webflow_slug: response.dig(:fieldData, :slug)) # rubocop:disable Rails/SkipsModelValidations
|
97
55
|
else
|
98
|
-
record.update_column(:webflow_item_id, response.fetch(
|
56
|
+
record.update_column(:webflow_item_id, response.fetch(:id)) # rubocop:disable Rails/SkipsModelValidations
|
99
57
|
end
|
100
58
|
end
|
101
59
|
|
data/lib/webflow_sync/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webflow_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Viktor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -25,21 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: webflow-ruby
|
28
|
+
name: webflow-rb
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - ">="
|
@@ -69,11 +55,8 @@ files:
|
|
69
55
|
- app/models/concerns/webflow_sync/callbacks.rb
|
70
56
|
- app/models/concerns/webflow_sync/item_sync.rb
|
71
57
|
- app/services/webflow_sync/api.rb
|
72
|
-
- lib/generators/webflow_sync/api_token_flow_generator.rb
|
73
58
|
- lib/generators/webflow_sync/collection_generator.rb
|
74
59
|
- lib/generators/webflow_sync/install_generator.rb
|
75
|
-
- lib/generators/webflow_sync/templates/api_token/omniauth_webflow.rb.erb
|
76
|
-
- lib/generators/webflow_sync/templates/api_token/webflow_callback_controller.rb.erb
|
77
60
|
- lib/generators/webflow_sync/templates/migration.rb.erb
|
78
61
|
- lib/generators/webflow_sync/templates/webflow_sync.rb
|
79
62
|
- lib/tasks/webflow_sync.rake
|
@@ -104,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
87
|
- !ruby/object:Gem::Version
|
105
88
|
version: '0'
|
106
89
|
requirements: []
|
107
|
-
rubygems_version: 3.
|
90
|
+
rubygems_version: 3.5.9
|
108
91
|
signing_key:
|
109
92
|
specification_version: 4
|
110
93
|
summary: Keep Rails models in sync with WebFlow.
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rails/generators/active_record'
|
4
|
-
|
5
|
-
module WebflowSync
|
6
|
-
module Generators
|
7
|
-
class ApiTokenFlowGenerator < Rails::Generators::Base
|
8
|
-
desc 'Generates Omniauth flow for authenticating WebFlow application to get WebFlow API token'
|
9
|
-
|
10
|
-
source_root File.expand_path('templates/api_token', __dir__)
|
11
|
-
|
12
|
-
def generate
|
13
|
-
gem 'omniauth-webflow'
|
14
|
-
run 'bundle install'
|
15
|
-
template 'webflow_callback_controller.rb.erb', 'app/controllers/webflow_callback_controller.rb'
|
16
|
-
template 'omniauth_webflow.rb.erb', 'config/initializers/omniauth_webflow.rb'
|
17
|
-
route "post '/auth/webflow/callback', to: 'webflow_callback#index'"
|
18
|
-
route "get '/auth/webflow/callback', to: 'webflow_callback#index'"
|
19
|
-
|
20
|
-
puts <<~END_OF_INSTRUCTIONS.indent(4)
|
21
|
-
|
22
|
-
|
23
|
-
We've generated all the files needed to successfully authenticate
|
24
|
-
with WebFlow to get API token.
|
25
|
-
There are couple of steps left to get the token:
|
26
|
-
|
27
|
-
1. Download ngrok: https://ngrok.com/download
|
28
|
-
2. Run `ngrok http 3000`
|
29
|
-
3. Copy the URL that ngrok gives you (something like: https://dd7cc807bf91.ngrok.io)
|
30
|
-
4. Go to: https://webflow.com/dashboard/account/integrations
|
31
|
-
5. Register New Application
|
32
|
-
6. In "Redirect URI" put: https://dd7cc807bf91.ngrok.io/auth/webflow/callback
|
33
|
-
7. Save
|
34
|
-
8. Copy client ID and client secret to ENV variables or add
|
35
|
-
them directly in config/initializers/omniauth_webflow.rb
|
36
|
-
9. Start rails server locally
|
37
|
-
10. Go to https://dd7cc807bf91.ngrok.io/auth/webflow
|
38
|
-
11. Finally authenticate, beware which permissions to give
|
39
|
-
(some are "allow access", some are "restrict access", it's confusing)
|
40
|
-
12. Copy the rendered API token and put it in ENV.fetch('WEBFLOW_API_TOKEN')
|
41
|
-
13. After you've got the API token, you probably don't need
|
42
|
-
the Omniauth WebFlow code so you can remove the code that this
|
43
|
-
generator created from your codebase.
|
44
|
-
It is also a security issue to leave the Omniauth endpoint in your
|
45
|
-
codebase, that has the ability to generate API tokens for your WebFlow
|
46
|
-
account!!!
|
47
|
-
|
48
|
-
Easy.
|
49
|
-
|
50
|
-
|
51
|
-
END_OF_INSTRUCTIONS
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|