wcc-contentful 0.2.2 → 0.3.0.pre.rc
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/.rspec +0 -1
- data/README.md +181 -8
- data/app/controllers/wcc/contentful/webhook_controller.rb +42 -2
- data/app/jobs/wcc/contentful/delayed_sync_job.rb +52 -3
- data/app/jobs/wcc/contentful/webhook_enable_job.rb +43 -0
- data/bin/console +4 -3
- data/bin/rails +2 -0
- data/config/initializers/mime_types.rb +10 -1
- data/lib/wcc/contentful.rb +14 -142
- data/lib/wcc/contentful/client_ext.rb +17 -4
- data/lib/wcc/contentful/configuration.rb +25 -84
- data/lib/wcc/contentful/engine.rb +19 -0
- data/lib/wcc/contentful/exceptions.rb +25 -28
- data/lib/wcc/contentful/graphql.rb +0 -1
- data/lib/wcc/contentful/graphql/types.rb +1 -1
- data/lib/wcc/contentful/helpers.rb +3 -2
- data/lib/wcc/contentful/indexed_representation.rb +6 -0
- data/lib/wcc/contentful/model.rb +68 -34
- data/lib/wcc/contentful/model_builder.rb +65 -67
- data/lib/wcc/contentful/model_methods.rb +189 -0
- data/lib/wcc/contentful/model_singleton_methods.rb +83 -0
- data/lib/wcc/contentful/services.rb +146 -0
- data/lib/wcc/contentful/simple_client.rb +35 -33
- data/lib/wcc/contentful/simple_client/http_adapter.rb +9 -0
- data/lib/wcc/contentful/simple_client/management.rb +81 -0
- data/lib/wcc/contentful/simple_client/response.rb +61 -37
- data/lib/wcc/contentful/simple_client/typhoeus_adapter.rb +12 -0
- data/lib/wcc/contentful/store.rb +45 -18
- data/lib/wcc/contentful/store/base.rb +128 -8
- data/lib/wcc/contentful/store/cdn_adapter.rb +92 -22
- data/lib/wcc/contentful/store/lazy_cache_store.rb +94 -9
- data/lib/wcc/contentful/store/memory_store.rb +13 -8
- data/lib/wcc/contentful/store/postgres_store.rb +44 -11
- data/lib/wcc/contentful/sys.rb +28 -0
- data/lib/wcc/contentful/version.rb +1 -1
- data/wcc-contentful.gemspec +3 -9
- metadata +87 -107
- data/.circleci/config.yml +0 -51
- data/.gitignore +0 -26
- data/.rubocop.yml +0 -243
- data/.rubocop_todo.yml +0 -13
- data/.travis.yml +0 -5
- data/CHANGELOG.md +0 -45
- data/CODE_OF_CONDUCT.md +0 -74
- data/Guardfile +0 -58
- data/LICENSE.txt +0 -21
- data/Rakefile +0 -8
- data/lib/generators/wcc/USAGE +0 -24
- data/lib/generators/wcc/model_generator.rb +0 -90
- data/lib/generators/wcc/templates/.keep +0 -0
- data/lib/generators/wcc/templates/Procfile +0 -3
- data/lib/generators/wcc/templates/contentful_shell_wrapper +0 -385
- data/lib/generators/wcc/templates/menu/generated_add_menus.ts +0 -90
- data/lib/generators/wcc/templates/menu/models/menu.rb +0 -23
- data/lib/generators/wcc/templates/menu/models/menu_button.rb +0 -23
- data/lib/generators/wcc/templates/page/generated_add_pages.ts +0 -50
- data/lib/generators/wcc/templates/page/models/page.rb +0 -23
- data/lib/generators/wcc/templates/release +0 -9
- data/lib/generators/wcc/templates/wcc_contentful.rb +0 -17
- data/lib/wcc/contentful/model/menu.rb +0 -7
- data/lib/wcc/contentful/model/menu_button.rb +0 -15
- data/lib/wcc/contentful/model/page.rb +0 -8
- data/lib/wcc/contentful/model/redirect.rb +0 -19
- data/lib/wcc/contentful/model_validators.rb +0 -115
- data/lib/wcc/contentful/model_validators/dsl.rb +0 -165
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08ab30632430c1a52ed10b696480397ac53fc682'
|
4
|
+
data.tar.gz: be04ea6c9ce005456b08cf87770b70c466dadcff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f0c325803a5b8c5f0a228401fea6634e9498c21cf50ac929d8881d5772a70732e8e4a7346fcd8e13e0434b0a42d3687480818750fe0008ff4cc2bfef76169d3
|
7
|
+
data.tar.gz: 90f7524d0bdbbbc5b40db0f060e6e631dabaeff0ee5fb8142eeadde3117cf6b6add58dec68914454fe9ef28db608b3e29af2ae5f6b616460842b31662677b257
|
data/.rspec
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
[](https://badge.fury.io/rb/wcc-contentful)
|
2
|
+
[](https://circleci.com/gh/watermarkchurch/wcc-contentful)
|
3
|
+
|
4
|
+
Full documentation: https://www.rubydoc.info/github/watermarkchurch/wcc-contentful
|
5
|
+
|
1
6
|
# WCC::Contentful
|
2
7
|
|
3
8
|
## Installation
|
@@ -21,20 +26,188 @@ Or install it yourself as:
|
|
21
26
|
```ruby
|
22
27
|
WCC::Contentful.configure do |config|
|
23
28
|
config.access_token = <CONTENTFUL_ACCESS_TOKEN>
|
24
|
-
config.preview_token = <CONTENTFUL_PREVIEW_TOKEN>
|
25
29
|
config.space = <CONTENTFUL_SPACE_ID>
|
26
|
-
config.default_locale = "en-US"
|
27
30
|
end
|
31
|
+
|
32
|
+
WCC::Contentful.init!
|
28
33
|
```
|
29
34
|
|
30
35
|
## Usage
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
37
|
+
### WCC::Contentful::Model API
|
38
|
+
|
39
|
+
The WCC::Contentful::Model API exposes Contentful data as a set of dynamically
|
40
|
+
generated Ruby objects. These objects are based on the content types in your
|
41
|
+
Contentful space. All these objects are generated by WCC::Contentful.init!
|
42
|
+
|
43
|
+
The following examples show how to use this API to find entries of the `page`
|
44
|
+
content type:
|
35
45
|
|
36
|
-
|
46
|
+
```ruby
|
47
|
+
# Find objects by id
|
48
|
+
WCC::Contentful::Model::Page.find('1E2ucWSdacxxf233sfa3')
|
49
|
+
# => #<WCC::Contentful::Model::Page:0x0000000005c71a78 @created_at=2018-04-16 18:41:17 UTC...>
|
50
|
+
|
51
|
+
# Find objects by field
|
52
|
+
WCC::Contentful::Model::Page.find_by(slug: '/some-slug')
|
53
|
+
# => #<WCC::Contentful::Model::Page:0x0000000005c71a78 @created_at=2018-04-16 18:41:17 UTC...>
|
54
|
+
|
55
|
+
# Use operators to filter by a field
|
56
|
+
# must use full notation for sys attributes (except ID)
|
57
|
+
WCC::Contentful::Model::Page.find_all('sys.created_at' => { lte: Date.today })
|
58
|
+
# => [#<WCC::Contentful::Model::Page:0x0000000005c71a78 @created_at=2018-04-16 18:41:17 UTC...>, ... ]
|
59
|
+
|
60
|
+
# Nest queries to mimick joins
|
61
|
+
WCC::Contentful::Model::Page.find_by(subpages: { slug: '/some-slug' })
|
62
|
+
# => #<WCC::Contentful::Model::Page:0x0000000005c71a78 @created_at=2018-04-16 18:41:17 UTC...>
|
63
|
+
|
64
|
+
# Pass the preview flag to use the preview client (must have set preview_token config param)
|
65
|
+
preview_redirect = WCC::Contentful::Model::Redirect.find_by({ slug: 'draft-redirect' }, preview: true)
|
66
|
+
# => #<WCC::Contentful::Model::Redirect:0x0000000005d879ad @created_at=2018-04-16 18:41:17 UTC...>
|
37
67
|
preview_redirect_object.href
|
68
|
+
# => 'http://www.somesite.com/slug-for-redirect'
|
69
|
+
```
|
70
|
+
|
71
|
+
See the {WCC::Contentful::Model} documentation for more details.
|
72
|
+
|
73
|
+
### Store API
|
74
|
+
|
75
|
+
The Store layer is used by the Model API to access Contentful data in a raw form.
|
76
|
+
The Store layer returns entries as hashes parsed from JSON, conforming to the
|
77
|
+
object structure returned from the Contentful CDN.
|
78
|
+
|
79
|
+
The following examples show how to use the Store API to retrieve raw data from
|
80
|
+
the store:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
store = WCC::Contentful::Services.instance.store
|
84
|
+
# => #<WCC::Contentful::Store::CDNAdapter:0x00007fb92a221498
|
85
|
+
|
86
|
+
store.find('5FsqsbMECsM62e04U8sY4Y')
|
87
|
+
# => {"sys"=>
|
88
|
+
# ...
|
89
|
+
# "fields"=>
|
90
|
+
# ...}
|
91
|
+
|
92
|
+
store.find_by(content_type: 'page', filter: { slug: '/some-slug' })
|
93
|
+
# => {"sys"=>
|
94
|
+
# ...
|
95
|
+
# "fields"=>
|
96
|
+
# ...}
|
97
|
+
|
98
|
+
query = store.find_all(content_type: 'page').eq('group', 'some-group')
|
99
|
+
# => #<WCC::Contentful::Store::CDNAdapter::Query:0x00007fa3d40b84f0
|
100
|
+
query.first
|
101
|
+
# => {"sys"=>
|
102
|
+
# ...
|
103
|
+
# "fields"=>
|
104
|
+
# ...}
|
105
|
+
query.result
|
106
|
+
# => #<Enumerator::Lazy: ...>
|
107
|
+
query.result.force
|
108
|
+
# => [{"sys"=> ...}, {"sys"=> ...}, ...]
|
109
|
+
```
|
110
|
+
|
111
|
+
See the {WCC::Contentful::Store} documentation for more details.
|
112
|
+
|
113
|
+
### Direct CDN API (SimpleClient)
|
114
|
+
|
115
|
+
The SimpleClient is the bottom layer, and is used to get raw data directly from
|
116
|
+
the Contentful CDN. It handles response parsing and paging, but does not resolve
|
117
|
+
links or transform the result into a Model class.
|
118
|
+
|
119
|
+
The following examples show how to use the SimpleClient to retrieve data directly
|
120
|
+
from the Contentful CDN:
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
client = WCC::Contentful::Services.instance.client
|
124
|
+
# => #<WCC::Contentful::SimpleClient::Cdn:0x00007fa3cde89310
|
125
|
+
|
126
|
+
response = client.entry('5FsqsbMECsM62e04U8sY4Y')
|
127
|
+
# => #<WCC::Contentful::SimpleClient::Response:0x00007fa3d103a4e0
|
128
|
+
response.body
|
129
|
+
# => "{\n \"sys\": {\n ...
|
130
|
+
response.raw
|
131
|
+
# => {"sys"=>
|
132
|
+
# ...
|
133
|
+
# "fields"=>
|
134
|
+
# ...}
|
135
|
+
|
136
|
+
client.asset('5FsqsbMECsM62e04U8sY4Y').raw
|
137
|
+
# => {"sys"=>
|
138
|
+
# ...
|
139
|
+
# "fields"=>
|
140
|
+
# ...}
|
141
|
+
|
142
|
+
response = client.entries('fields.group' => 'some-group', 'limit' => 5)
|
143
|
+
# => #<WCC::Contentful::SimpleClient::Response:0x00007fa3d103a4e0
|
144
|
+
response.count
|
145
|
+
# => 99
|
146
|
+
response.first
|
147
|
+
# => {"sys"=>
|
148
|
+
# ...
|
149
|
+
# "fields"=>
|
150
|
+
# ...}
|
151
|
+
response.items
|
152
|
+
=> #<Enumerator::Lazy: ...>
|
153
|
+
response.items.count # Careful! This evaluates the lazy iterator and gets all pages
|
154
|
+
# => 99
|
155
|
+
|
156
|
+
response.includes
|
157
|
+
# => {"4xNnFJ77egkSMEogE2yISa"=>
|
158
|
+
# {"sys"=> ...}
|
159
|
+
# "6Fwukxxkxa6qQCC04WCaqg"=>
|
160
|
+
# {"sys"=> ...}
|
161
|
+
# ...}
|
162
|
+
```
|
163
|
+
|
164
|
+
The client handles Paging automatically within the lazy iterator returned by #items.
|
165
|
+
This lazy iterator does not respect the `limit` param - that param is only passed
|
166
|
+
through to the API to set the page size.
|
167
|
+
|
168
|
+
Entries included via the `include` parameter are made available on the #includes
|
169
|
+
field. This is a hash of `<entry ID> => <raw entry>` and makes it easy to grab
|
170
|
+
links. This hash is added to lazily as you enumerate the pages.
|
171
|
+
|
172
|
+
See the {WCC::Contentful::SimpleClient} documentation for more details.
|
173
|
+
|
174
|
+
### Accessing the APIs within application code
|
175
|
+
|
176
|
+
The Model API is best exposed by defining your own model classes in the `app/models`
|
177
|
+
directory which inherit from the WCC::Contentful models.
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
# app/models/page.rb
|
181
|
+
class Page < WCC::Contentful::Model::Page
|
182
|
+
|
183
|
+
# You can add additional methods here
|
184
|
+
end
|
185
|
+
|
186
|
+
# app/controllers/pages_controller.rb
|
187
|
+
class PagesController < ApplicationController
|
188
|
+
def show
|
189
|
+
@page = Page.find_by(slug: params[:slug])
|
190
|
+
raise Exceptions::PageNotFoundError, params[:slug] unless @page
|
191
|
+
end
|
192
|
+
end
|
193
|
+
```
|
194
|
+
|
195
|
+
The {WCC::Contentful::Services} singleton gives access to the other configured services.
|
196
|
+
You can also include the {WCC::Contentful::ServiceAccessors} concern to define these
|
197
|
+
services as attributes in a class.
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
class MyJob < ApplicationJob
|
201
|
+
include WCC::Contentful::ServiceAccessors
|
202
|
+
|
203
|
+
def perform
|
204
|
+
Page.find(...)
|
205
|
+
|
206
|
+
store.find(...)
|
207
|
+
|
208
|
+
client.entries(...)
|
209
|
+
end
|
210
|
+
end
|
38
211
|
```
|
39
212
|
|
40
213
|
## Development
|
@@ -45,7 +218,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
45
218
|
|
46
219
|
## Contributing
|
47
220
|
|
48
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
221
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/watermarkchurch/wcc-contentful. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
49
222
|
|
50
223
|
## License
|
51
224
|
|
@@ -53,4 +226,4 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
53
226
|
|
54
227
|
## Code of Conduct
|
55
228
|
|
56
|
-
Everyone interacting in the WCC::Contentful project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
229
|
+
Everyone interacting in the WCC::Contentful project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/watermarkchurch/wcc-contentful/blob/master/CODE_OF_CONDUCT.md).
|
@@ -3,13 +3,45 @@
|
|
3
3
|
require_dependency 'wcc/contentful/application_controller'
|
4
4
|
|
5
5
|
module WCC::Contentful
|
6
|
+
# The WebhookController is mounted by the WCC::Contentful::Engine to receive
|
7
|
+
# webhook events from Contentful. It passes these webhook events to
|
8
|
+
# the jobs configured in {WCC::Contentful::Configuration WCC::Contentful::Configuration#webhook_jobs}
|
6
9
|
class WebhookController < ApplicationController
|
10
|
+
include WCC::Contentful::ServiceAccessors
|
11
|
+
|
7
12
|
before_action :authorize_contentful
|
13
|
+
protect_from_forgery unless: -> { request.format.json? }
|
14
|
+
|
15
|
+
rescue_from ActionController::ParameterMissing do |_e|
|
16
|
+
render json: { msg: 'The request must conform to Contentful webhook structure' }, status: 400
|
17
|
+
end
|
8
18
|
|
9
19
|
def receive
|
10
|
-
|
20
|
+
event = params.require('webhook').permit!
|
21
|
+
event.require('sys').require(%w[id type])
|
22
|
+
event = event.to_h
|
23
|
+
|
24
|
+
# Immediately update the store, we may update again later using DelayedSyncJob.
|
25
|
+
store.index(event) if store.respond_to?(:index)
|
26
|
+
|
27
|
+
jobs.each do |job|
|
28
|
+
begin
|
29
|
+
if job.respond_to?(:perform_later)
|
30
|
+
job.perform_later(event)
|
31
|
+
elsif job.respond_to?(:call)
|
32
|
+
job.call(event)
|
33
|
+
else
|
34
|
+
Rails.logger.error "Misconfigured webhook job: #{job} does not respond to " \
|
35
|
+
':perform_later or :call'
|
36
|
+
end
|
37
|
+
rescue StandardError => e
|
38
|
+
Rails.logger.error "Error in job #{job}: #{e}"
|
39
|
+
end
|
40
|
+
end
|
11
41
|
end
|
12
42
|
|
43
|
+
private
|
44
|
+
|
13
45
|
def authorize_contentful
|
14
46
|
config = WCC::Contentful.configuration
|
15
47
|
|
@@ -23,8 +55,16 @@ module WCC::Contentful
|
|
23
55
|
end
|
24
56
|
end
|
25
57
|
|
26
|
-
|
58
|
+
# 'application/vnd.contentful.management.v1+json' is an alias for the 'application/json'
|
59
|
+
# content-type, so 'request.content_type' will give 'application/json'
|
60
|
+
return if request.headers['Content-Type'] == 'application/vnd.contentful.management.v1+json'
|
61
|
+
|
27
62
|
render json: { msg: 'This endpoint only responds to webhooks from Contentful' }, status: 406
|
28
63
|
end
|
64
|
+
|
65
|
+
def jobs
|
66
|
+
jobs = [WCC::Contentful::DelayedSyncJob]
|
67
|
+
jobs.push(*WCC::Contentful.configuration.webhook_jobs)
|
68
|
+
end
|
29
69
|
end
|
30
70
|
end
|
@@ -3,12 +3,61 @@
|
|
3
3
|
require 'active_job'
|
4
4
|
|
5
5
|
module WCC::Contentful
|
6
|
+
# This job uses the Contentful Sync API to update the configured store with
|
7
|
+
# the latest data from Contentful.
|
6
8
|
class DelayedSyncJob < ActiveJob::Base
|
9
|
+
include WCC::Contentful::ServiceAccessors
|
10
|
+
|
11
|
+
self.queue_adapter = :async
|
7
12
|
queue_as :default
|
8
13
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
14
|
+
def self.mutex
|
15
|
+
@mutex ||= Mutex.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def perform(event = nil)
|
19
|
+
up_to_id = nil
|
20
|
+
up_to_id = event[:up_to_id] || event.dig('sys', 'id') if event
|
21
|
+
sync!(up_to_id: up_to_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Calls the Contentful Sync API and updates the configured store with the returned
|
25
|
+
# data.
|
26
|
+
#
|
27
|
+
# @param [String] up_to_id
|
28
|
+
# An ID that we know has changed and should come back from the sync.
|
29
|
+
# If we don't find this ID in the sync data, then drop a job to try
|
30
|
+
# the sync again after a few minutes.
|
31
|
+
#
|
32
|
+
def sync!(up_to_id: nil)
|
33
|
+
return unless store.respond_to?(:index)
|
34
|
+
|
35
|
+
self.class.mutex.synchronize do
|
36
|
+
next_sync_token = store.find('sync:token')&.fetch('token')
|
37
|
+
sync_resp = client.sync(sync_token: next_sync_token)
|
38
|
+
|
39
|
+
id_found = up_to_id.nil?
|
40
|
+
|
41
|
+
count = 0
|
42
|
+
sync_resp.items.each do |item|
|
43
|
+
id = item.dig('sys', 'id')
|
44
|
+
id_found ||= id == up_to_id
|
45
|
+
store.index(item)
|
46
|
+
count += 1
|
47
|
+
end
|
48
|
+
store.set('sync:token', token: sync_resp.next_sync_token)
|
49
|
+
|
50
|
+
logger.info "Synced #{count} entries. Next sync token:\n #{sync_resp.next_sync_token}"
|
51
|
+
sync_later!(up_to_id: up_to_id) unless id_found
|
52
|
+
sync_resp.next_sync_token
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Drops an ActiveJob job to invoke WCC::Contentful.sync! after a given amount
|
57
|
+
# of time.
|
58
|
+
def sync_later!(up_to_id: nil, wait: 10.minutes)
|
59
|
+
WCC::Contentful::DelayedSyncJob.set(wait: wait)
|
60
|
+
.perform_later(up_to_id: up_to_id)
|
12
61
|
end
|
13
62
|
end
|
14
63
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_job'
|
4
|
+
|
5
|
+
module WCC::Contentful
|
6
|
+
class WebhookEnableJob < ActiveJob::Base
|
7
|
+
self.queue_adapter = :async
|
8
|
+
queue_as :default
|
9
|
+
|
10
|
+
def perform(args)
|
11
|
+
client = WCC::Contentful::SimpleClient::Management.new(
|
12
|
+
args
|
13
|
+
)
|
14
|
+
enable_webhook(client, args.slice(:app_url, :webhook_username, :webhook_password))
|
15
|
+
end
|
16
|
+
|
17
|
+
def enable_webhook(client, app_url:, webhook_username: nil, webhook_password: nil)
|
18
|
+
expected_url = URI.join(app_url, 'webhook/receive').to_s
|
19
|
+
webhook = client.webhook_definitions.items.find { |w| w['url'] == expected_url }
|
20
|
+
logger.debug "existing webhook: #{webhook.inspect}" if webhook
|
21
|
+
return if webhook
|
22
|
+
|
23
|
+
body = {
|
24
|
+
'name' => 'WCC::Contentful webhook',
|
25
|
+
'url' => expected_url,
|
26
|
+
'topics' => [
|
27
|
+
'*.publish',
|
28
|
+
'*.unpublish'
|
29
|
+
]
|
30
|
+
}
|
31
|
+
body['httpBasicUsername'] = webhook_username if webhook_username.present?
|
32
|
+
body['httpBasicPassword'] = webhook_password if webhook_password.present?
|
33
|
+
|
34
|
+
begin
|
35
|
+
resp = client.post_webhook_definition(body)
|
36
|
+
logger.info "Created webhook: #{resp.raw.dig('sys', 'id')}"
|
37
|
+
rescue WCC::Contentful::SimpleClient::ApiError => e
|
38
|
+
logger.error "#{e.response.code}: #{e.response.raw}" if e.response
|
39
|
+
raise
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'wcc/contentful'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "wcc/contentful"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start(__FILE__)
|
data/bin/rails
CHANGED
@@ -1,3 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
# https://www.contentful.com/developers/docs/references/content-management-api/
|
4
|
+
Mime::Type.register 'application/vnd.contentful.management.v1+json', :json_mgmt
|
5
|
+
# https://www.contentful.com/developers/docs/references/content-delivery-api/
|
6
|
+
Mime::Type.register 'application/vnd.contentful.delivery.v1+json', :json_cda
|
7
|
+
|
8
|
+
Mime::Type.register 'application/json', :json, [
|
9
|
+
'application/vnd.contentful.management.v1+json',
|
10
|
+
'application/vnd.contentful.delivery.v1+json',
|
11
|
+
'application/json'
|
12
|
+
]
|