84 lines
2.1 KiB
JavaScript
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,
|
|
}
|