diff --git a/lib/swagger/resources.js b/lib/swagger/resources.js index 15893fb..f5a0e5b 100644 --- a/lib/swagger/resources.js +++ b/lib/swagger/resources.js @@ -68,6 +68,9 @@ swaggerPaths._getResourceDefinition = resourceConfig => { swaggerScheme.type = 'string' swaggerScheme.format = 'date' } + if (swaggerScheme.type === 'array') { + swaggerScheme = mapJoiArray(joiScheme, swaggerScheme) + } attributeShortcut[attribute] = swaggerScheme if ((joiScheme._flags || { }).presence === 'required') { @@ -183,3 +186,29 @@ swaggerPaths._getErrorDefinition = () => ({ } } }) +function mapJoiArray (joiScheme, swaggerScheme) { + const swaggerSchemeResult = Object.assign({}, swaggerScheme) + const items = joiScheme._inner.items + swaggerSchemeResult.items = { type: 'object' } + if (items.length > 0 && items[0]._inner.children) { + items[0]._inner.children.forEach(x => { + let innerSwaggerSchemeResult = {} + const innerJoiScheme = x.schema + if (innerJoiScheme._description) { + innerSwaggerSchemeResult.description = innerJoiScheme._description + } + innerSwaggerSchemeResult.type = innerJoiScheme._type + if (innerSwaggerSchemeResult.type === 'date') { + innerSwaggerSchemeResult.type = 'string' + innerSwaggerSchemeResult.format = 'date' + } + if (innerSwaggerSchemeResult.type === 'array') { + innerSwaggerSchemeResult = mapJoiArray(innerJoiScheme, innerSwaggerSchemeResult) + } + swaggerSchemeResult.items.properties = { ...swaggerSchemeResult.items.properties, [x.key]: innerSwaggerSchemeResult } + }) + } else { + swaggerSchemeResult.items = { type: items[0]._type } + } + return swaggerSchemeResult +}