Add cache for OEmbed endpoints to avoid extra HTTP requests (#12403)
* add youtube oembed endpoint * add check for oembed endpoint * change unless for a more readable if * clear blank lines * endpoint via https * Fix string literal in condition * use cache for endpoints * use cache for endpoints * clean up and adding check * clean up and remove redundant return * add html check * add false to return * use double quotes * use double quotes * Clean up
This commit is contained in:
parent
5a2c0707f1
commit
d14e74eff5
3 changed files with 64 additions and 8 deletions
|
@ -1,13 +1,20 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class FetchOEmbedService
|
||||
ENDPOINT_CACHE_EXPIRES_IN = 24.hours.freeze
|
||||
|
||||
attr_reader :url, :options, :format, :endpoint_url
|
||||
|
||||
def call(url, options = {})
|
||||
@url = url
|
||||
@options = options
|
||||
|
||||
discover_endpoint!
|
||||
if @options[:cached_endpoint]
|
||||
parse_cached_endpoint!
|
||||
else
|
||||
discover_endpoint!
|
||||
end
|
||||
|
||||
fetch!
|
||||
end
|
||||
|
||||
|
@ -32,10 +39,32 @@ class FetchOEmbedService
|
|||
return if @endpoint_url.blank?
|
||||
|
||||
@endpoint_url = (Addressable::URI.parse(@url) + @endpoint_url).to_s
|
||||
|
||||
cache_endpoint!
|
||||
rescue Addressable::URI::InvalidURIError
|
||||
@endpoint_url = nil
|
||||
end
|
||||
|
||||
def parse_cached_endpoint!
|
||||
cached = @options[:cached_endpoint]
|
||||
|
||||
return if cached[:endpoint].nil? || cached[:format].nil?
|
||||
|
||||
@endpoint_url = Addressable::Template.new(cached[:endpoint]).expand(url: @url).to_s
|
||||
@format = cached[:format]
|
||||
end
|
||||
|
||||
def cache_endpoint!
|
||||
url_domain = Addressable::URI.parse(@url).normalized_host
|
||||
|
||||
endpoint_hash = {
|
||||
endpoint: @endpoint_url.gsub(URI.encode_www_form_component(@url), '{url}'),
|
||||
format: @format,
|
||||
}
|
||||
|
||||
Rails.cache.write("oembed_endpoint:#{url_domain}", endpoint_hash, expires_in: ENDPOINT_CACHE_EXPIRES_IN)
|
||||
end
|
||||
|
||||
def fetch!
|
||||
return if @endpoint_url.blank?
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue