class Contentful::Bootstrap::Generator

Constants

DELIVERY_API_URL
PREVIEW_API_URL

Attributes

client[R]
content_type_ids[R]
content_types_only[R]

Public Class Methods

new(space_id, access_token, environment, content_types_only, use_preview, content_type_ids) click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 15
def initialize(space_id, access_token, environment, content_types_only, use_preview, content_type_ids)
  @client = Contentful::Client.new(
    space: space_id,
    access_token: access_token,
    environment: environment,
    application_name: 'bootstrap',
    application_version: ::Contentful::Bootstrap::VERSION,
    api_url: use_preview ? PREVIEW_API_URL : DELIVERY_API_URL
  )
  @content_types_only = content_types_only
  @content_type_ids = content_type_ids
end

Public Instance Methods

generate_json() click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 28
def generate_json
  template = {}
  template['version'] = Contentful::Bootstrap.major_version
  template['contentTypes'] = content_types
  template['assets'] = assets
  template['entries'] = entries
  JSON.pretty_generate(template)
end

Private Instance Methods

assets() click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 56
def assets
  return [] if content_types_only

  processed_assets = []

  query = { order: 'sys.createdAt', limit: 1000 }
  assets_count = @client.assets(limit: 1).total
  ((assets_count / 1000) + 1).times do |i|
    query[:skip] = i * 1000

    @client.assets(query).each do |asset|
      processed_asset = {
        'id' => asset.sys[:id],
        'title' => asset.title,
        'file' => {
          'filename' => ::File.basename(asset.file.file_name, '.*'),
          'url' => "https:#{asset.file.url}"
        }
      }
      processed_assets << processed_asset
    end
  end

  processed_assets.sort_by { |item| item['id'] }
end
content_types() click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 39
def content_types
  query = {}
  query['sys.id[in]'] = content_type_ids.join(',') unless content_type_ids.empty?

  proccessed_content_types = @client.content_types(query).map do |type|
    result = { 'id' => type.sys[:id], 'name' => type.name }
    result['displayField'] = type.display_field unless type.display_field.nil?

    result['fields'] = type.fields.map do |field|
      map_field_properties(field)
    end

    result
  end
  proccessed_content_types.sort_by { |item| item['id'] }
end
entries() click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 82
def entries
  return {} if content_types_only

  entries = {}

  query = { order: 'sys.createdAt', limit: 1000 }
  count_query = { limit: 1 }

  unless content_type_ids.empty?
    search_key = 'sys.contentType.sys.id[in]'
    ids = content_type_ids.join(',')

    query[search_key] = ids
    count_query[search_key] = ids
  end

  entries_count = @client.entries(count_query).total
  ((entries_count / 1000) + 1).times do |i|
    query[:skip] = i * 1000

    @client.entries(query).each do |entry|
      result = { 'sys' => { 'id' => entry.sys[:id] }, 'fields' => {} }

      entry.fields.each do |key, value|
        value = map_field(value)
        result['fields'][field_id(entry, key)] = value unless value.nil?
      end

      ct_id = entry.content_type.sys[:id]
      entries[ct_id] = [] if entries[ct_id].nil?
      entries[ct_id] << result
    end
  end

  entries
end
field_id(entry, field_name) click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 119
def field_id(entry, field_name)
  entry.raw['fields'].keys.detect { |f| f == field_name.to_s || f == Support.camel_case(field_name.to_s).to_s }
end
map_field(value) click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 123
def map_field(value)
  return value.map { |v| map_field(v) } if value.is_a? ::Array

  if value.is_a?(Contentful::Asset) || value.is_a?(Contentful::Entry)
    return {
      'linkType' => value.class.name.split('::').last,
      'id' => value.sys[:id]
    }
  end

  return nil if value.is_a?(Contentful::Link)

  value
end
map_field_properties(field) click to toggle source
# File lib/contentful/bootstrap/generator.rb, line 138
def map_field_properties(field)
  properties = {}

  %i[id name type link_type required localized].each do |property|
    value = field.public_send(property) if field.respond_to?(property)
    properties[Support.camel_case(property.to_s).to_sym] = value unless value.nil? || %i[required localized].include?(property)
  end

  items = field.items if field.respond_to?(:items)
  properties[:items] = map_field_properties(items) unless items.nil?

  properties
end