webflow_sync 6.1.1 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3874cf42b829542c647a91935f17fe61d04072b8ad3f30ac8a483e8a019bb6ab
4
- data.tar.gz: 32af885137c5c68b1720e6ec816adf584b4215540cc004fac9824fe71bcea3d4
3
+ metadata.gz: f639ebd2128267a119b8dd6a93e2d06858e8713a2faeb6b6f17bc123e60438bb
4
+ data.tar.gz: 43294f31bc2fa6e5b0772ecbd28480b8c071c6472c1748b05a3109bd2818dc47
5
5
  SHA512:
6
- metadata.gz: 32209b9c2500d2ba13f229fc4826296ead24d002fd2ee429f2c4c71076c70f8a23fb3bad1b4386cf4253120a958bfef10bd832ab4c2496b3914a542282d3beca
7
- data.tar.gz: d447ac378e5c6ceb3ee19e400e2e337baefbc152146a58b5a64a371fe49d18c1fc72f4e9e9328a924a37749e22608faadf1d449847ef55b32296f56902b4384e
6
+ metadata.gz: 2fac06bf9bc32b9618636acd2ab18437385f01071435757db1d311225c4f032800cb210c51168c9fb659bc095dcec5d716ce718d1c2e89449bbbf842e59bf4a8
7
+ data.tar.gz: 8109face21e162c8826b25fec73409009a4bc94ffd519c1648c9c7916f9a4ae6b7bdbe5c328d95031ae0fadfbc0ade771c196a83b3cf4232be80e1cefe19a8de
@@ -11,11 +11,14 @@ module WebflowSync
11
11
  # collection_slug => slug of the WebFlow collection
12
12
  # model_name = 'articles'; id = article.id, collection_slug = 'stories'
13
13
  def perform(model_name, id, collection_slug = model_name.underscore.dasherize.pluralize)
14
+ return if WebflowSync.configuration.skip_webflow_sync
15
+
14
16
  model_class = model_name.underscore.classify.constantize
15
17
  record = model_class.find_by(id:)
16
18
  return if record.blank?
19
+ return if record.skip_webflow_sync
17
20
  return if record.webflow_site_id.blank?
18
- return WebflowSync::UpdateItemJob.perform_now(model_name, id, collection_slug) if record.webflow_item_id.present?
21
+ return WebflowSync::UpdateItemJob.perform_later(model_name, id, collection_slug) if record.webflow_item_id.present?
19
22
 
20
23
  WebflowSync::Api.new(record.webflow_site_id).create_item(record, collection_slug)
21
24
  end
@@ -3,6 +3,7 @@
3
3
  module WebflowSync
4
4
  class DestroyItemJob < ApplicationJob
5
5
  def perform(collection_slug:, webflow_site_id:, webflow_item_id:)
6
+ return if WebflowSync.configuration.skip_webflow_sync
6
7
  return if webflow_site_id.blank?
7
8
  return if webflow_item_id.blank?
8
9
 
@@ -7,11 +7,14 @@ module WebflowSync
7
7
  # 'JobListing'.underscore.dasherize.pluralize => 'job-listings'
8
8
  # 'job_listing'.underscore.dasherize.pluralize => 'job-listings'
9
9
  def perform(model_name, id, collection_slug = model_name.underscore.dasherize.pluralize)
10
+ return if WebflowSync.configuration.skip_webflow_sync
11
+
10
12
  model_class = model_name.underscore.classify.constantize
11
13
  record = model_class.find_by(id:)
12
14
  return if record.blank?
15
+ return if record.skip_webflow_sync
13
16
  return if record.webflow_site_id.blank?
14
- return WebflowSync::CreateItemJob.perform_now(model_name, id, collection_slug) if record.webflow_item_id.blank?
17
+ return WebflowSync::CreateItemJob.perform_later(model_name, id, collection_slug) if record.webflow_item_id.blank?
15
18
 
16
19
  WebflowSync::Api.new(record.webflow_site_id).update_item(record, collection_slug)
17
20
  end
@@ -1,27 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebflowSync
4
- class Api # rubocop:disable Metrics/ClassLength
4
+ class Api
5
5
  attr_reader :site_id
6
6
 
7
7
  def initialize(site_id = nil)
8
8
  @site_id = site_id
9
9
  end
10
10
 
11
- def get_all_items(collection_slug:, page_limit: 100) # rubocop:disable Metrics/MethodLength
12
- collection_id = find_webflow_collection(collection_slug)['_id']
13
- max_items_per_page = page_limit # Webflow::Error: 'limit' must be less than or equal to 100
11
+ def get_all_items(collection_slug:, page_limit: 100) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
12
+ collection_id = find_webflow_collection(collection_slug).fetch('id')
13
+ max_items_per_page = [page_limit, 100].min
14
14
  first_page_number = 1
15
15
 
16
16
  result = make_request(:paginate_items, collection_id, page: first_page_number, per_page: max_items_per_page)
17
17
  puts "Get all items from WebFlow for #{collection_slug} page: #{first_page_number}"
18
18
 
19
- total_items = result['total']
19
+ total_items = result.dig('pagination', 'total')
20
20
  total_pages = (total_items.to_f / max_items_per_page).ceil
21
- items = result['items']
21
+ items = result.fetch('items')
22
22
 
23
23
  (2..total_pages).each do |page_number|
24
- next_page_items = make_request(:paginate_items, collection_id, page: page_number, per_page: max_items_per_page)['items']
24
+ next_page_items = make_request(:paginate_items, collection_id, page: page_number, per_page: max_items_per_page).fetch('items')
25
25
  puts "Get all items from WebFlow for #{collection_slug} page: #{page_number}"
26
26
 
27
27
  items.concat next_page_items
@@ -30,59 +30,41 @@ module WebflowSync
30
30
  items
31
31
  end
32
32
 
33
- def self.get_all_items(collection_slug:, page_limit: 100) = new.get_all_items(collection_slug:, page_limit:)
34
-
35
33
  def get_item(collection_slug, webflow_item_id)
36
34
  collection = find_webflow_collection(collection_slug)
37
35
 
38
- make_request(:item, collection['_id'], webflow_item_id)
36
+ make_request(:item, collection.fetch('id'), webflow_item_id)
39
37
  end
40
- def self.get_item(collection_slug, webflow_item_id) = new.get_item(collection_slug, webflow_item_id)
41
38
 
42
39
  def create_item(record, collection_slug)
43
40
  collection = find_webflow_collection(collection_slug)
44
- response = make_request(:create_item, collection['_id'],
45
- record.as_webflow_json.reverse_merge(_archived: false, _draft: false), live: true)
41
+ response = make_request(:create_item, collection.fetch('id'), record.as_webflow_json, publish: true)
46
42
 
47
43
  if update_record_columns(record, response)
48
44
  puts "Created #{record.inspect} in #{collection_slug}"
49
45
  response
50
46
  else
51
- raise "Failed to store webflow_item_id: '#{response['_id']}' " \
47
+ raise "Failed to store webflow_item_id: '#{response.fetch('id')}' " \
52
48
  "after creating item in WebFlow collection #{record.inspect}"
53
49
  end
54
50
  end
55
51
 
56
- def self.create_item(record, collection_slug) = new.create_item(record, collection_slug)
57
-
58
52
  def update_item(record, collection_slug)
59
53
  collection = find_webflow_collection(collection_slug)
60
- response = make_request(:update_item, { '_cid' => collection['_id'], '_id' => record.webflow_item_id },
61
- record.as_webflow_json.reverse_merge(_archived: false, _draft: false), live: true)
62
-
54
+ response = make_request(:update_item, collection.fetch('id'), record.webflow_item_id, record.as_webflow_json, publish: true)
63
55
  puts "Updated #{record.inspect} in #{collection_slug}"
64
56
  response
65
57
  end
66
58
 
67
- def self.update_item(record, collection_slug) = new.update_item(record, collection_slug)
68
-
69
59
  def delete_item(collection_slug, webflow_item_id)
70
60
  collection = find_webflow_collection(collection_slug)
71
- # deleting items from Webflow doesn't work as expected.
72
- # if we delete without `live: true`, the item will stay visible on the site until the site is published again
73
- # if we delete with `live: true`, the item will be set as draft and not visible on the site, but it will be visible in the Webflow CMS
74
- # we then call delete again to remove the item from Webflow CMS
75
- make_request(:delete_item, { '_cid' => collection['_id'], '_id' => webflow_item_id }, live: true)
76
- response = make_request(:delete_item, { '_cid' => collection['_id'], '_id' => webflow_item_id })
77
-
61
+ response = make_request(:delete_item, collection.fetch('id'), webflow_item_id)
78
62
  puts "Deleted #{webflow_item_id} from #{collection_slug}"
79
63
  response
80
64
  end
81
65
 
82
- def self.delete_item(collection_slug, webflow_item_id) = new.delete_item(collection_slug, webflow_item_id)
83
-
84
66
  def publish
85
- response = make_request(:publish, site_id, domain_names:)
67
+ response = make_request(:publish, site_id)
86
68
 
87
69
  puts "Publish all domains for Webflow site with id: #{site_id}"
88
70
  response
@@ -98,23 +80,7 @@ module WebflowSync
98
80
  end
99
81
 
100
82
  def collections
101
- @collections ||= make_request(:collections, site_id)
102
- end
103
-
104
- def domain_names
105
- @domain_names ||= find_domain_names
106
- end
107
-
108
- def find_domain_names
109
- # client.domains request does not return the default domain
110
- # We need to get default domain name if there are no custom domains set to avoid error:
111
- # Webflow::Error: Domain not found for site
112
- site = make_request(:site, site_id)
113
- default_domain_name = "#{site.fetch('shortName')}.webflow.io"
114
- names = [default_domain_name]
115
- make_request(:domains, site_id).each { |domain| names << domain.fetch('name') }
116
-
117
- names
83
+ @collections ||= make_request(:collections, site_id).fetch('collections')
118
84
  end
119
85
 
120
86
  def find_webflow_collection(collection_slug)
@@ -127,9 +93,9 @@ module WebflowSync
127
93
  def update_record_columns(record, response)
128
94
  # use update_column to skip callbacks to prevent WebflowSync::ItemSync to kick off
129
95
  if WebflowSync.configuration.sync_webflow_slug
130
- record.update_columns(webflow_item_id: response['_id'], webflow_slug: response['slug']) # rubocop:disable Rails/SkipsModelValidations
96
+ record.update_columns(webflow_item_id: response.fetch('id'), webflow_slug: response.dig('fieldData', 'slug')) # rubocop:disable Rails/SkipsModelValidations
131
97
  else
132
- record.update_column(:webflow_item_id, response['_id']) # rubocop:disable Rails/SkipsModelValidations
98
+ record.update_column(:webflow_item_id, response.fetch('id')) # rubocop:disable Rails/SkipsModelValidations
133
99
  end
134
100
  end
135
101
 
@@ -140,7 +106,7 @@ module WebflowSync
140
106
  client.public_send(method_name, *args)
141
107
  end
142
108
  rescue Webflow::Error => e
143
- raise unless e.message.strip == 'Rate limit hit'
109
+ raise unless e.message.strip == 'Too Many Requests'
144
110
 
145
111
  puts 'Sleeping 10 seconds'
146
112
  sleep 10
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rails'
4
+
3
5
  module WebflowSync
4
6
  class Engine < ::Rails::Engine
5
7
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebflowSync
4
- VERSION = '6.1.1'
4
+ VERSION = '7.0.0'
5
5
  end
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: 6.1.1
4
+ version: 7.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: 2023-05-23 00:00:00.000000000 Z
11
+ date: 2023-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
104
  - !ruby/object:Gem::Version
105
105
  version: '0'
106
106
  requirements: []
107
- rubygems_version: 3.3.26
107
+ rubygems_version: 3.4.21
108
108
  signing_key:
109
109
  specification_version: 4
110
110
  summary: Keep Rails models in sync with WebFlow.