Files
shields/services/endpoint-common.js
2019-02-03 17:29:52 -05:00

84 lines
2.1 KiB
JavaScript

'use strict'
const Joi = require('joi')
const validate = require('../core/base-service/validate')
const { InvalidResponse } = require('.')
const optionalStringWhenNamedLogoPresent = Joi.alternatives().when(
'namedLogo',
{
is: Joi.string().required(),
then: Joi.string(),
}
)
const optionalNumberWhenAnyLogoPresent = Joi.alternatives()
.when('namedLogo', { is: Joi.string().required(), then: Joi.number() })
.when('logoSvg', { is: Joi.string().required(), then: Joi.number() })
const endpointSchema = Joi.object({
schemaVersion: 1,
label: Joi.string()
.allow('')
.required(),
message: Joi.string().required(),
color: Joi.string(),
labelColor: Joi.string(),
isError: Joi.boolean().default(false),
namedLogo: Joi.string(),
logoSvg: Joi.string(),
logoColor: optionalStringWhenNamedLogoPresent,
logoWidth: optionalNumberWhenAnyLogoPresent,
logoPosition: optionalNumberWhenAnyLogoPresent,
style: Joi.string(),
cacheSeconds: Joi.number()
.integer()
.min(0),
})
// `namedLogo` or `logoSvg`; not both.
.oxor('namedLogo', 'logoSvg')
.required()
// Strictly validate according to the endpoint schema. This rejects unknown /
// invalid keys. Optionally it prints those keys in the message in order to
// provide detailed feedback.
function validateEndpointData(
data,
{ prettyErrorMessage = 'invalid response data', includeKeys = false } = {}
) {
return validate(
{
ErrorClass: InvalidResponse,
prettyErrorMessage,
includeKeys,
traceErrorMessage: 'Response did not match schema',
traceSuccessMessage: 'Response after validation',
allowAndStripUnknownKeys: false,
},
data,
endpointSchema
)
}
const anySchema = Joi.any()
async function fetchEndpointData(
serviceInstance,
{ url, errorMessages, validationPrettyErrorMessage, includeKeys }
) {
const json = await serviceInstance._requestJson({
schema: anySchema,
url,
errorMessages,
})
return validateEndpointData(json, {
prettyErrorMessage: validationPrettyErrorMessage,
includeKeys,
})
}
module.exports = {
validateEndpointData,
fetchEndpointData,
}