octoblu/meshblu-core-protocol-adapter-http-streaming

View on GitHub
src/helpers/job-to-http.coffee

Summary

Maintainability
Test Coverage
_ = require 'lodash'
MeshbluAuthParser = require '../helpers/meshblu-auth-parser'

class JobToHttp
  constructor: () ->
    @authParser = new MeshbluAuthParser

  httpToJob: ({jobType, request, toUuid, data}) ->
    data ?= request.body
    userMetadata = @getMetadataFromHeaders request.headers
    auth = @authParser.parse request
    systemMetadata =
      auth: auth
      fromUuid: request.get('x-meshblu-as') ? auth.uuid
      toUuid: toUuid
      jobType: jobType

    job =
      metadata: _.extend userMetadata, systemMetadata
      data: data

    job

  getMetadataFromHeaders: (headers) =>
    _.transform headers, (newMetadata, value, header) =>
      header = header.toLowerCase()
      return unless _.startsWith header, 'x-meshblu-'
      key = _.camelCase( _.replace(header, "x-meshblu-", '' ))
      newMetadata[key] = value

  metadataToHeaders: (metadata) =>
    headers = {}
    _.each metadata, (value, key) =>
      header = "x-meshblu-#{_.kebabCase(key)}"
      return _.set headers, header, value if _.isString value
      return _.set headers, header, JSON.stringify value
    headers

  sendJobResponse: ({jobResponse, res}) ->
    return res.sendStatus 500  unless jobResponse?

    res.set 'Content-Type', 'application/json'
    res.set @metadataToHeaders jobResponse.metadata
    res.status jobResponse.metadata.code
    res.send jobResponse.rawData

  module.exports = JobToHttp