class PuppetHerald::App::ApiImplV1
An implementation of API v1
Public Class Methods
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
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 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
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
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
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
# File lib/puppet-herald/app/api.rb, line 129 def clienterror(ex) err = { error: "#{ex.class}: #{ex.message}" } [400, err.to_json] end
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
# File lib/puppet-herald/app/api.rb, line 124 def httpize(header_name) upper = header_name.upcase.gsub('-', '_') "HTTP_#{upper}" end
# 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
# 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
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