From 67c61a0638fa46f90162f07f09e4b9b61d86dfdd Mon Sep 17 00:00:00 2001 From: Mark Kaylor Date: Fri, 8 Oct 2021 12:06:16 -0400 Subject: [PATCH] use map to recursively clean relation attributes --- .../server/utils/clean-schema-attributes.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/plugins/documentation/server/utils/clean-schema-attributes.js b/packages/plugins/documentation/server/utils/clean-schema-attributes.js index 627587150b..465e9cbc4a 100644 --- a/packages/plugins/documentation/server/utils/clean-schema-attributes.js +++ b/packages/plugins/documentation/server/utils/clean-schema-attributes.js @@ -11,7 +11,7 @@ const getSchemaData = require('./get-schema-data'); * @returns Attributes using OpenAPI acceptable data types */ -const cleanSchemaAttributes = attributes => { +const cleanSchemaAttributes = (attributes, typeMap = new Map()) => { const attributesCopy = _.cloneDeep(attributes); for (const prop in attributesCopy) { @@ -21,6 +21,9 @@ const cleanSchemaAttributes = attributes => { } switch (attribute.type) { + case 'password': + case 'email': + case 'date': case 'datetime': { attributesCopy[prop] = { type: 'string' }; break; @@ -66,12 +69,22 @@ const cleanSchemaAttributes = attributes => { break; } case 'relation': { - // TODO: Sanitize relation attributes and list them in the schema const isListOfEntities = attribute.relation.includes('ToMany'); + if (!attribute.target || typeMap.has(attribute.target)) { + attributesCopy[prop] = { + type: 'object', + properties: { data: getSchemaData(isListOfEntities, {}) }, + }; + break; + } + + typeMap.set(attribute.target, true); + const targetAttributes = strapi.contentType(attribute.target).attributes; + attributesCopy[prop] = { type: 'object', properties: { - data: getSchemaData(isListOfEntities, {}), + data: getSchemaData(isListOfEntities, cleanSchemaAttributes(targetAttributes, typeMap)), }, };