/**
* @module
*/
import Joi from 'joi'
const arrayOfStrings = Joi.array().items(Joi.string()).min(0).required()
/**
* Joi schema describing the subset of OpenAPI paths we use in this application
*
* @see https://swagger.io/specification/#paths-object
*/
const openApiSchema = Joi.object()
.pattern(
/./,
Joi.object({
get: Joi.object({
summary: Joi.string().required(),
description: Joi.string(),
parameters: Joi.array()
.items(
Joi.object({
name: Joi.string().required(),
description: Joi.string(),
in: Joi.string().valid('query', 'path').required(),
required: Joi.boolean().required(),
schema: Joi.object({
type: Joi.string().required(),
enum: Joi.array(),
}).required(),
allowEmptyValue: Joi.boolean(),
example: Joi.string().allow(null),
}),
)
.min(1)
.required(),
}).required(),
}).required(),
)
.default({})
const serviceDefinition = Joi.object({
category: Joi.string().required(),
name: Joi.string().required(),
isDeprecated: Joi.boolean().required(),
route: Joi.alternatives().try(
Joi.object({
pattern: Joi.string().required(),
queryParams: arrayOfStrings,
}),
Joi.object({
format: Joi.string().required(),
queryParams: arrayOfStrings,
}),
),
openApi: openApiSchema,
}).required()
function assertValidServiceDefinition(service, message = undefined) {
Joi.assert(service, serviceDefinition, message)
}
const serviceDefinitionExport = Joi.object({
schemaVersion: Joi.equal('0').required(),
categories: Joi.array()
.items(
Joi.object({
id: Joi.string().required(),
name: Joi.string().required(),
}),
)
.required(),
services: Joi.array().items(serviceDefinition).required(),
}).required()
function assertValidServiceDefinitionExport(openApiSpec, message = undefined) {
Joi.assert(openApiSpec, serviceDefinitionExport, message)
}
export {
assertValidServiceDefinition,
assertValidServiceDefinitionExport,
openApiSchema,
}