Files
shields/services/base-json.js
Paul Melnikow a252239018 Fix and test trace logging in BaseJsonService (#1944)
This fixes a regression introduced in #1929 which was caught by service tests post-merge.
2018-08-18 17:45:46 -04:00

68 lines
1.9 KiB
JavaScript

'use strict'
// See available emoji at http://emoji.muan.co/
const emojic = require('emojic')
const Joi = require('joi')
const { checkErrorResponse, asJson } = require('../lib/error-helper')
const BaseService = require('./base')
const { InvalidResponse } = require('./errors')
const trace = require('./trace')
class BaseJsonService extends BaseService {
static _validate(json, schema) {
const { error, value } = Joi.validate(json, schema, {
allowUnknown: true,
stripUnknown: true,
})
if (error) {
trace.logTrace(
'validate',
emojic.womanShrugging,
'Response did not match schema',
error.message
)
throw new InvalidResponse({
prettyMessage: 'invalid json response',
underlyingError: error,
})
} else {
trace.logTrace(
'validate',
emojic.bathtub,
'JSON after validation',
value,
{ deep: true }
)
return value
}
}
async _requestJson({ schema, url, options = {}, errorMessages = {} }) {
const logTrace = (...args) => trace.logTrace('fetch', ...args)
if (!schema || !schema.isJoi) {
throw Error('A Joi schema is required')
}
const mergedOptions = {
...{ headers: { Accept: 'application/json' } },
...options,
}
logTrace(emojic.bowAndArrow, 'Request', url, '\n', mergedOptions)
return this._sendAndCacheRequest(url, mergedOptions)
.then(({ res, buffer }) => {
logTrace(emojic.dart, 'Response status code', res.statusCode)
return { res, buffer }
})
.then(checkErrorResponse.asPromise(errorMessages))
.then(asJson)
.then(json => {
logTrace(emojic.dart, 'Response JSON (before validation)', json, {
deep: true,
})
return json
})
.then(json => this.constructor._validate(json, schema))
}
}
module.exports = BaseJsonService