rooftop-rails 0.0.6.4 → 0.1.3
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/app/controllers/concerns/rooftop/rails/preview.rb +24 -0
- data/app/controllers/rooftop/rails/preview_controller.rb +38 -0
- data/app/models/concerns/rooftop/rails/object_cache.rb +6 -0
- data/app/models/concerns/rooftop/rails/preview_model.rb +16 -0
- data/config/routes.rb +2 -0
- data/lib/rooftop/rails.rb +13 -6
- data/lib/rooftop/rails/engine.rb +7 -0
- data/lib/rooftop/rails/version.rb +1 -1
- metadata +7 -5
- data/lib/rooftop/rails/preview.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 999a8685afdfab12db176b020b83f959868fce71
|
4
|
+
data.tar.gz: 525946c0293c90ef21824651362949ed3747597b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12d8a8a7b2485ba1e1adaa73c4d0a66a41f57b2035b0c779fc5ac0b8b446a99f17fa649c55b8a2ed13f082929bd3e332fc626e6510b1bfc17a05020fd1499cf1
|
7
|
+
data.tar.gz: 17369a9d432389976470c3c5ea77273bee5ea4624e96835b930c854480786655c074b69e6198f01316a91c6bb0e9e4fd0af4204a4d26aaffdbbc94b22098c867
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Rooftop
|
2
|
+
module Rails
|
3
|
+
# A controller mixin with utility methods for handling previews. This presupposes you're using the mounted Rooftop::Rails::PreviewController to receive POST requests for previews from Rooftop.
|
4
|
+
module Preview
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.send(:before_action, -> {
|
8
|
+
if preview?
|
9
|
+
Rooftop.include_drafts = true
|
10
|
+
else
|
11
|
+
Rooftop.include_drafts = false
|
12
|
+
end
|
13
|
+
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
def preview?
|
18
|
+
params[:preview].present? && session[:preview].present? && params[:preview] == session[:preview]["secret"]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Rooftop::Rails::PreviewController < ActionController::Base
|
2
|
+
skip_before_filter :verify_authenticity_token, :only => [:create]
|
3
|
+
|
4
|
+
#this is where we receive a message from Rooftop via a POST
|
5
|
+
def create
|
6
|
+
raise Rooftop::Content::PreviewKeyMissingError, "You need to POST a preview key" unless params[:preview_key].present?
|
7
|
+
session.delete(:preview)
|
8
|
+
# Rooftop will POST data to this endpoint
|
9
|
+
Rooftop.include_drafts = true
|
10
|
+
|
11
|
+
request.format = :json
|
12
|
+
session[:preview] = {
|
13
|
+
secret: Digest::SHA256.hexdigest(params[:preview_key]),
|
14
|
+
key: params[:preview_key]
|
15
|
+
}
|
16
|
+
item = Rooftop::Rails::PostTypeResolver.new(params[:post_type]).resolve.find(params[:id])
|
17
|
+
slug = item.respond_to?(:nested_path) ? item.nested_path : item.slug
|
18
|
+
if item.preview_key_matches?(params[:preview_key])
|
19
|
+
redirect_path = Rooftop::Rails::RouteResolver.new(params[:post_type].to_sym, slug).resolve(preview: session[:preview][:secret])
|
20
|
+
if redirect_path.nil?
|
21
|
+
raise ActionController::RoutingError, "Couldn't find a route to preview this post type"
|
22
|
+
else
|
23
|
+
redirect_to redirect_path
|
24
|
+
end
|
25
|
+
else
|
26
|
+
raise Rooftop::Content::PreviewKeyMismatchError, "The preview key received doesn't match the key in Rooftop"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def preview_params
|
33
|
+
params.permit!
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
end
|
@@ -11,6 +11,12 @@ module Rooftop
|
|
11
11
|
"#{self.class.cache_key_base}/#{self.id}"
|
12
12
|
end
|
13
13
|
|
14
|
+
def expire_cache!
|
15
|
+
self.class.send(:expire_cache_for, self)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :expire!, :expire_cache!
|
19
|
+
|
14
20
|
module ClassMethods
|
15
21
|
|
16
22
|
# Base of the cache key for this class.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Rooftop
|
2
|
+
module Rails
|
3
|
+
module PreviewModel
|
4
|
+
include ActiveSupport::Concern
|
5
|
+
|
6
|
+
# Call the preview() method defined in Rooftop, but expire the cache afterwards
|
7
|
+
def preview
|
8
|
+
# super here is defined in Rooftop::Preview#preview()
|
9
|
+
preview = super
|
10
|
+
# expire is defined in Rooftop::Rails::ObjectCache#expire!
|
11
|
+
preview.expire!
|
12
|
+
return preview
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/config/routes.rb
CHANGED
data/lib/rooftop/rails.rb
CHANGED
@@ -23,12 +23,7 @@ module Rooftop
|
|
23
23
|
:authenticate_webhooks,
|
24
24
|
:webhooks_username,
|
25
25
|
:webhooks_password,
|
26
|
-
:preview_username,
|
27
|
-
:preview_password,
|
28
|
-
:preview_domain,
|
29
|
-
:enable_preview_domain,
|
30
26
|
:perform_http_response_caching,
|
31
|
-
:perform_object_caching,
|
32
27
|
:cache_store,
|
33
28
|
:cache_logger,
|
34
29
|
:logger,
|
@@ -37,10 +32,22 @@ module Rooftop
|
|
37
32
|
:resource_route_map,
|
38
33
|
:post_type_mapping
|
39
34
|
|
35
|
+
def perform_object_caching=(perform_caching)
|
36
|
+
if perform_caching.is_a?(Proc)
|
37
|
+
@perform_object_caching = perform_caching
|
38
|
+
else
|
39
|
+
@perform_object_caching = ->{perform_caching}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def perform_object_caching
|
44
|
+
@perform_object_caching.call
|
45
|
+
end
|
46
|
+
|
40
47
|
def initialize
|
41
48
|
@authenticate_webhooks = true
|
42
49
|
@perform_http_response_caching = ::Rails.configuration.action_controller.perform_caching
|
43
|
-
@perform_object_caching = ::Rails.configuration.action_controller.perform_caching
|
50
|
+
@perform_object_caching = ->{::Rails.configuration.action_controller.perform_caching}
|
44
51
|
@cache_store = ::Rails.cache
|
45
52
|
@cache_logger = ::Rails.logger
|
46
53
|
@ssl_options = {}
|
data/lib/rooftop/rails/engine.rb
CHANGED
@@ -50,6 +50,13 @@ module Rooftop
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
initializer "add_preview_to_rooftop_models" do
|
54
|
+
::Rails.application.eager_load!
|
55
|
+
Rooftop::Base.included_classes.each do |klass|
|
56
|
+
klass.send(:include, Rooftop::Rails::PreviewModel)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
53
60
|
initializer "clear_caches_on_webhook_notification" do
|
54
61
|
ActiveSupport::Notifications.subscribe(/rooftop.*/) do |name, start, finish, id, payload|
|
55
62
|
Rooftop::Rails::CacheExpirer.expire(payload)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rooftop-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Error Studio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: require_all
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.0
|
61
|
+
version: 0.1.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.0
|
68
|
+
version: 0.1.0
|
69
69
|
description: This gem provides utility methods and a mountable engine for Rails applications
|
70
70
|
using the Rooftop gem
|
71
71
|
email:
|
@@ -76,11 +76,14 @@ extra_rdoc_files: []
|
|
76
76
|
files:
|
77
77
|
- Rakefile
|
78
78
|
- app/controllers/concerns/rooftop/rails/nested_resource.rb
|
79
|
+
- app/controllers/concerns/rooftop/rails/preview.rb
|
80
|
+
- app/controllers/rooftop/rails/preview_controller.rb
|
79
81
|
- app/controllers/rooftop/rails/webhooks_controller.rb
|
80
82
|
- app/helpers/rooftop/rails/content_helper.rb
|
81
83
|
- app/helpers/rooftop/rails/menu_helper.rb
|
82
84
|
- app/models/concerns/rooftop/rails/nested_model.rb
|
83
85
|
- app/models/concerns/rooftop/rails/object_cache.rb
|
86
|
+
- app/models/concerns/rooftop/rails/preview_model.rb
|
84
87
|
- config/routes.rb
|
85
88
|
- lib/generators/rooftop/rooftop_generator.rb
|
86
89
|
- lib/generators/rooftop/templates/initializer.rb.erb
|
@@ -90,7 +93,6 @@ files:
|
|
90
93
|
- lib/rooftop/rails/engine.rb
|
91
94
|
- lib/rooftop/rails/errors.rb
|
92
95
|
- lib/rooftop/rails/post_type_resolver.rb
|
93
|
-
- lib/rooftop/rails/preview.rb
|
94
96
|
- lib/rooftop/rails/route_resolver.rb
|
95
97
|
- lib/rooftop/rails/version.rb
|
96
98
|
- test/controllers/rooftop_rails/webhooks_controller_test.rb
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module Rooftop::Rails
|
2
|
-
module Preview
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
before_action :check_preview_domain
|
7
|
-
after_action :remove_preview_cache
|
8
|
-
helper_method :preview?
|
9
|
-
end
|
10
|
-
# Check whether the subdomain being presented is the preview domain.
|
11
|
-
# If so, set Rooftop to add the preview header
|
12
|
-
def check_preview_domain
|
13
|
-
# If enable_preview_domain is not enabled, explicitly set use_preview_api false and return
|
14
|
-
unless Rooftop::Rails.configuration.enable_preview_domain
|
15
|
-
Rooftop.preview = false
|
16
|
-
return
|
17
|
-
end
|
18
|
-
|
19
|
-
#check subdomain matches the configured one - we assume it's first sub.domain.in.the.array
|
20
|
-
if request.subdomains.first == Rooftop::Rails.configuration.preview_domain
|
21
|
-
authenticated = authenticate_with_http_basic do |u,p|
|
22
|
-
u == Rooftop::Rails.configuration.preview_username
|
23
|
-
p == Rooftop::Rails.configuration.preview_password
|
24
|
-
end
|
25
|
-
# If user is authenticated, we're good to switch to the preview api
|
26
|
-
if authenticated
|
27
|
-
Rooftop.preview = true
|
28
|
-
else
|
29
|
-
#otherwise ask for user / pass
|
30
|
-
request_http_basic_authentication
|
31
|
-
end
|
32
|
-
else
|
33
|
-
#if the subdomain doesn't match the configured one, explicitly set to false
|
34
|
-
Rooftop.preview = false
|
35
|
-
return
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
# If we're in preview mode, we need to remove the preview view caches which were created.
|
41
|
-
# this is a bit of a hack but it's probably not feasible to turn off caching in preview mode.
|
42
|
-
def remove_preview_cache
|
43
|
-
# in preview mode, we alias_method_chain the cache_key method on Rooftop::Base to append 'preview/'
|
44
|
-
# to the front of the key.
|
45
|
-
return unless request.subdomain == Rooftop::Rails.configuration.preview_domain
|
46
|
-
expire_fragment(%r{.*/preview/.*})
|
47
|
-
end
|
48
|
-
|
49
|
-
def preview?
|
50
|
-
Rooftop.preview == true
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|