class CommunityZero::CookbooksEndpoint

The endpoint for all cookbooks.

@author Seth Vargo <sethvargo@gmail.com>

Public Instance Methods

get(request) click to toggle source

GET /cookbooks

# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 27
def get(request)
  start = Integer(request.query_params['start'] || 0)
  items = Integer(request.query_params['items'] || 10)
  cookbooks = store.cookbooks[start...items] || []

  respond({
    'items' => cookbooks.collect { |cookbook|
      {
        'cookbook_name'        => cookbook.name,
        'cookbook_description' => cookbook.description,
        'cookbook'             => url_for(cookbook),
        'cookbook_maintainer'  => cookbook.maintainer
      }
    },
    'total' => store.size,
    'start' => start.to_i,
  })
end
post(request) click to toggle source

POST /cookbooks

# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 47
def post(request)
  params = Rack::Utils::Multipart.parse_multipart(request.env)
  cookbook = JSON.parse(params['cookbook'], symbolize_names: true)
  tarball = params['tarball']

  metadata = find_metadata(tarball)

  if store.find(metadata.name, metadata.version)
    respond(401,
      {
        'error_code' => 'ALREADY_EXISTS',
        'error_messages' => ['Resource already exists'],
      }
    )
  else
    respond(create_cookbook(metadata, cookbook).to_hash)
  end
end

Private Instance Methods

create_cookbook(metadata, overrides = {}) click to toggle source

Create the cookbook from the metadata.

@param [CommunityZero::Metadata] metadata

the metadata to create the cookbook from
# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 71
def create_cookbook(metadata, overrides = {})
  cookbook = Cookbook.new({
    :name        => metadata.name,
    :category    => nil,
    :maintainer  => metadata.maintainer,
    :description => metadata.description,
    :version     => metadata.version
  }.merge(overrides))

  store.add(cookbook)

  cookbook
end
find_metadata(tarball) click to toggle source

Parse the metadata from the tarball.

@param [Tempfile] tarball

the temporarily uploaded file

@return [Metadata]

# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 91
def find_metadata(tarball)
  gzip = Zlib::GzipReader.new(tarball[:tempfile])
  tar = Gem::Package::TarReader.new(gzip)

  tar.each do |entry|
    if entry.full_name =~ /metadata\.json$/
      return Metadata.from_json(entry.read)
    elsif entry.full_name =~ /metadata\.rb$/
      return Metadata.from_ruby(entry.read)
    end
  end
ensure
  tar.close
end