lib/storyblok/client.rb in storyblok-3.0.1 vs lib/storyblok/client.rb in storyblok-3.1.0

- old
+ new

@@ -9,11 +9,10 @@ module Storyblok class Client DEFAULT_CONFIGURATION = { secure: true, - api_url: 'api.storyblok.com', api_version: 2, logger: false, log_level: Logger::INFO, version: 'draft', # :nocov: @@ -30,21 +29,22 @@ # @option given_configuration [String] :token Required if oauth_token is not set # @option given_configuration [String] :oauth_token Required if token is not set # @option given_configuration [String] :api_url # @option given_configuration [Proc] :component_resolver # @option given_configuration [Number] :api_version + # @option given_configuration [String] :api_region # @option given_configuration [false, ::Logger] :logger # @option given_configuration [::Logger::DEBUG, ::Logger::INFO, ::Logger::WARN, ::Logger::ERROR] :log_level def initialize(given_configuration = {}) @configuration = default_configuration.merge(given_configuration) @cache_version = '0' validate_configuration! if configuration[:oauth_token] @rest_client = RestClient::Resource.new(base_url, :headers => { - :authorization => configuration[:oauth_token] - }) + :authorization => configuration[:oauth_token] + }) end @renderer = Richtext::HtmlRenderer.new @renderer.set_component_resolver(@configuration[:component_resolver]) setup_logger @@ -195,11 +195,10 @@ end result end - def flush unless cache.nil? cache.set('storyblok:' + configuration[:token] + ':version', space['data']['space']['version']) end end @@ -221,177 +220,182 @@ def set_component_resolver component_resolver @renderer.set_component_resolver(component_resolver) end private + def parse_result(res) + { 'headers' => res.headers, 'data' => JSON.parse(res.body) } + end - def parse_result(res) - {'headers' => res.headers, 'data' => JSON.parse(res.body)} - end + def run_request(endpoint, query_string) + logger.info(request: { endpoint: endpoint, query: query_string }) if logger - def run_request(endpoint, query_string) - logger.info(request: { endpoint: endpoint, query: query_string }) if logger + retries_left = 3 - retries_left = 3 + begin + res = RestClient.get "#{endpoint}?#{query_string}" + rescue RestClient::TooManyRequests + if retries_left != 0 + retries_left -= 1 + logger.info("Too many requests. Retry nr. #{(3 - retries_left).to_s} of max. 3 times.") if logger + sleep(0.5) + retry + end - begin - res = RestClient.get "#{endpoint}?#{query_string}" - rescue RestClient::TooManyRequests - if retries_left != 0 - retries_left -= 1 - logger.info("Too many requests. Retry nr. #{(3 - retries_left).to_s} of max. 3 times.") if logger - sleep(0.5) - retry + raise end - raise - end + body = JSON.parse(res.body) + self.cache_version = body['cv'] if body['cv'] - body = JSON.parse(res.body) - self.cache_version = body['cv'] if body['cv'] + unless cache.nil? + cache.set('storyblok:' + configuration[:token] + ':version', cache_version) + end - unless cache.nil? - cache.set('storyblok:' + configuration[:token] + ':version', cache_version) + { 'headers' => res.headers, 'data' => body }.to_json end - {'headers' => res.headers, 'data' => body}.to_json - end + # Patches a query hash with the client configurations for queries + def request_query(query) + query[:token] = configuration[:token] if query[:token].nil? + query[:version] = configuration[:version] if query[:version].nil? - # Patches a query hash with the client configurations for queries - def request_query(query) - query[:token] = configuration[:token] if query[:token].nil? - query[:version] = configuration[:version] if query[:version].nil? + unless cache.nil? + query[:cv] = (cache.get('storyblok:' + configuration[:token] + ':version') or cache_version) if query[:cv].nil? + else + query[:cv] = cache_version if query[:cv].nil? + end - unless cache.nil? - query[:cv] = (cache.get('storyblok:' + configuration[:token] + ':version') or cache_version) if query[:cv].nil? - else - query[:cv] = cache_version if query[:cv].nil? + query end - query - end + # Returns the base url for all of the client's requests + def base_url + if !configuration[:api_url] + region = configuration[:api_region] ? "-#{configuration[:api_region]}" : "" + "http#{configuration[:secure] ? 's' : ''}://api#{region}.storyblok.com/v#{configuration[:api_version]}" + else + "http#{configuration[:secure] ? 's' : ''}://#{configuration[:api_url]}/v#{configuration[:api_version]}" + end + end - # Returns the base url for all of the client's requests - def base_url - "http#{configuration[:secure] ? 's' : ''}://#{configuration[:api_url]}/v#{configuration[:api_version]}" - end + def default_configuration + DEFAULT_CONFIGURATION.dup + end - def default_configuration - DEFAULT_CONFIGURATION.dup - end + def cache + configuration[:cache] + end - def cache - configuration[:cache] - end + def setup_logger + @logger = configuration[:logger] + logger.level = configuration[:log_level] if logger + end - def setup_logger - @logger = configuration[:logger] - logger.level = configuration[:log_level] if logger - end + def validate_configuration! + fail ArgumentError, 'You will need to initialize a client with an :token or :oauth_token' if !configuration[:token] and !configuration[:oauth_token] + fail ArgumentError, 'The :api_version must be a positive number' unless configuration[:api_version].to_i >= 0 + end - def validate_configuration! - fail ArgumentError, 'You will need to initialize a client with an :token or :oauth_token' if !configuration[:token] and !configuration[:oauth_token] - fail ArgumentError, 'The client configuration needs to contain an :api_url' if configuration[:api_url].empty? - fail ArgumentError, 'The :api_version must be a positive number' unless configuration[:api_version].to_i >= 0 - end + def build_nested_query(value, prefix = nil) + case value + when Array + value.map { |v| + build_nested_query(v, "#{prefix}[]") + }.join("&") + when Hash + value.map { |k, v| + build_nested_query(v, + prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k)) + }.reject(&:empty?).join('&') + when nil + prefix + else + raise ArgumentError, "value must be a Hash" if prefix.nil? - def build_nested_query(value, prefix = nil) - case value - when Array - value.map { |v| - build_nested_query(v, "#{prefix}[]") - }.join("&") - when Hash - value.map { |k, v| - build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k)) - }.reject(&:empty?).join('&') - when nil - prefix - else - raise ArgumentError, "value must be a Hash" if prefix.nil? - "#{prefix}=#{URI.encode_www_form_component(value)}" + "#{prefix}=#{URI.encode_www_form_component(value)}" + end end - end - def resolve_stories(result, params) - data = result['data'] - rels = data['rels'] - links = data['links'] - resolve_relations = params[:resolve_relations] || params["resolve_relations"] + def resolve_stories(result, params) + data = result['data'] + rels = data['rels'] + links = data['links'] + resolve_relations = params[:resolve_relations] || params["resolve_relations"] - if data['stories'].nil? - find_and_fill_relations(data.dig('story', 'content'), resolve_relations, rels) - find_and_fill_links(data.dig('story', 'content'), links) - else - data['stories'].each do |story| - find_and_fill_relations(story['content'], resolve_relations, rels) - find_and_fill_links(story['content'], links) + if data['stories'].nil? + find_and_fill_relations(data.dig('story', 'content'), resolve_relations, rels) + find_and_fill_links(data.dig('story', 'content'), links) + else + data['stories'].each do |story| + find_and_fill_relations(story['content'], resolve_relations, rels) + find_and_fill_links(story['content'], links) + end end + + result end - result - end + def find_and_fill_links(content, links) + return if content.nil? || links.nil? || links.size.zero? - def find_and_fill_links(content, links) - return if content.nil? || links.nil? || links.size.zero? + if content.is_a? Array + content.each do |item| + find_and_fill_links(item, links) + end + elsif content.is_a? Hash + content['story'] = nil + content.each do |_k, value| + if !content['fieldtype'].nil? + if content['fieldtype'] == 'multilink' && content['linktype'] == 'story' + id = + if content['id'].is_a? String + content['id'] + elsif content['uuid'].is_a? String + content['uuid'] + end - if content.is_a? Array - content.each do |item| - find_and_fill_links(item, links) - end - elsif content.is_a? Hash - content['story'] = nil - content.each do |_k, value| - if !content['fieldtype'].nil? - if content['fieldtype'] == 'multilink' && content['linktype'] == 'story' - id = - if content['id'].is_a? String - content['id'] - elsif content['uuid'].is_a? String - content['uuid'] + links.each do |link| + if link['uuid'] == id + content['story'] = link + break + end end - - links.each do |link| - if link['uuid'] == id - content['story'] = link - break - end end end - end - find_and_fill_links(value, links) + find_and_fill_links(value, links) + end + content.delete('story') if content['story'].nil? end - content.delete('story') if content['story'].nil? end - end - def find_and_fill_relations(content, relation_params, rels) - return if content.nil? || rels.nil? || rels.size.zero? + def find_and_fill_relations(content, relation_params, rels) + return if content.nil? || rels.nil? || rels.size.zero? - if content.is_a? Array - content.each do |item| - find_and_fill_relations(item, relation_params, rels) - end - elsif content.is_a? Hash - content.each do |_k, value| - if !content['component'].nil? && !content['_uid'].nil? - relation_params.split(',').each do |relation| - component, field_name = relation.split('.') + if content.is_a? Array + content.each do |item| + find_and_fill_relations(item, relation_params, rels) + end + elsif content.is_a? Hash + content.each do |_k, value| + if !content['component'].nil? && !content['_uid'].nil? + relation_params.split(',').each do |relation| + component, field_name = relation.split('.') - if (content['component'] == component) && !content[field_name].nil? - rels.each do |rel| - index = content[field_name].index(rel['uuid']) - if !index.nil? - content[field_name][index] = rel + if (content['component'] == component) && !content[field_name].nil? + rels.each do |rel| + index = content[field_name].index(rel['uuid']) + if !index.nil? + content[field_name][index] = rel + end end end end end - end - find_and_fill_relations(value, relation_params, rels) + find_and_fill_relations(value, relation_params, rels) + end end end - end end end