octoblu/meshblu-server-http

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)}"
      try
        return _.set headers, header, value if _.isString value
        return _.set headers, header, JSON.stringify value
      catch error
        console.error error.stack
        console.error 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
    return res.end() unless jobResponse.rawData?
    res.send jobResponse.rawData

  module.exports = JobToHttp