class PuppetHerald::App::ApiImplV1

An implementation of API v1

Public Class Methods

new(app) click to toggle source

Constructor @param app [Sinatra::Base] an app module @return [ApiImplV1] an API impl

# File lib/puppet-herald/app/api.rb, line 18
def initialize(app)
  @app = app
end

Public Instance Methods

get_node(params, request) click to toggle source

Gets a node by its ID, with pagination

@param params [Hash] an requests parsed params @param request [Sinatra::Request] an request object @return [Array] an response array: [code, body] or [code, headers, body]

# File lib/puppet-herald/app/api.rb, line 59
def get_node(params, request)
  id = params[:id]
  pag = paginate request
  node = PuppetHerald::Models::Node.with_reports(id, pag)
  status = 200
  status = 404 if node.nil?
  body = node.to_json(include: :reports, methods: :no_of_reports)
  [status, headers(pag), body]
rescue ArgumentError => ex
  clienterror ex
end
get_report(params) click to toggle source

Get a report by its ID

@param params [Hash] an requests parsed params @return [Array] an response array: [code, body] or [code, headers, body]

# File lib/puppet-herald/app/api.rb, line 35
def get_report(params)
  id = params[:id]
  report = PuppetHerald::Models::Report.with_log_entries(id)
  status = 200
  status = 404 if report.nil?
  body = report.to_json(include: :log_entries)
  [status, body]
end
nodes(request) click to toggle source

Gets all nodes with pagination

@param request [Sinatra::Request] an request object @return [Array] an response array: [code, body] or [code, headers, body]

# File lib/puppet-herald/app/api.rb, line 47
def nodes(request)
  pag = paginate request
  nodes = PuppetHerald::Models::Node.paginate(pag)
  [200, headers(pag), nodes.to_json(methods: :no_of_reports)]
rescue ArgumentError => ex
  clienterror ex
end
post_reports(request) click to toggle source

Creates a new report

@param request [Sinatra::Request] an request object @return [Array] an response array: [code, body] or [code, headers, body]

# File lib/puppet-herald/app/api.rb, line 25
def post_reports(request)
  yaml = request.body.read
  report = PuppetHerald::Models::Report.create_from_yaml yaml
  body = { id: report.id }.to_json
  [201, body]
end
version_json() click to toggle source

Get a app’s artifact information

@return [Array] an response array: [code, body] or [code, headers, body]

# File lib/puppet-herald/app/api.rb, line 73
def version_json
  ver = {}
  [:VERSION, :LICENSE, :NAME, :PACKAGE, :SUMMARY, :DESCRIPTION, :HOMEPAGE].each do |const|
    ver[const.downcase] = PuppetHerald.const_get const
  end
  [200, ver.to_json]
end

Private Instance Methods

clienterror(ex) click to toggle source
# File lib/puppet-herald/app/api.rb, line 129
def clienterror(ex)
  err = { error: "#{ex.class}: #{ex.message}" }
  [400, err.to_json]
end
headers(pagination, httpize = false) click to toggle source

Creates headers for given pagination

@param pagination [PuppetHerald::Models::Pagination] a pagination @param httpize [Boolean] if true given, will change headers to Rack format HTTP_* @return [Hash] a HTTP request headers

# File lib/puppet-herald/app/api.rb, line 88
def headers(pagination, httpize = false)
  keys = httpize_keys(httpize)
  head = {
    keys[:page]  => pagination.page.to_s,
    keys[:limit] => pagination.limit.to_s
  }
  head[keys[:total]] = pagination.total.to_s unless pagination.total.nil?
  head[keys[:pages]] = pagination.pages.to_s unless pagination.pages.nil?
  head
end
httpize(header_name) click to toggle source
# File lib/puppet-herald/app/api.rb, line 124
def httpize(header_name)
  upper = header_name.upcase.gsub('-', '_')
  "HTTP_#{upper}"
end
httpize_key(key, httpize = false) click to toggle source
# File lib/puppet-herald/app/api.rb, line 106
def httpize_key(key, httpize = false)
  noop = ->(name) { name }
  oper = httpize ? method(:httpize) : noop
  oper.call key
end
httpize_keys(httpize = false) click to toggle source
# File lib/puppet-herald/app/api.rb, line 99
def httpize_keys(httpize = false)
  map = PuppetHerald::Models::Pagination::KEYS.map do |k, str|
    [k, httpize_key(str, httpize)]
  end
  Hash[map]
end
paginate(request) click to toggle source

Creates a pagination from request

@param request [Sinatra::Request] a HTTP request @return [PuppetHerald::Models::Pagination] a pagination

# File lib/puppet-herald/app/api.rb, line 116
def paginate(request)
  pkey = httpize(PuppetHerald::Models::Pagination::KEYS[:page])
  lkey = httpize(PuppetHerald::Models::Pagination::KEYS[:limit])
  page = request.env[pkey] ? request.env[pkey] : PuppetHerald::Models::Pagination::DEFAULT.page
  limit = request.env[lkey] ? request.env[lkey] : PuppetHerald::Models::Pagination::DEFAULT.limit
  PuppetHerald::Models::Pagination.new(page, limit)
end