From 9d2155d59974791b084980791759d52a6315d53a Mon Sep 17 00:00:00 2001 From: p-fernandez Date: Wed, 1 Feb 2023 04:43:44 +0000 Subject: [PATCH] fix(docs): render nested objects in payloads and responses --- .../subscribers/update-preference.md | 2 +- src/utils/build-properties.js | 22 +++++ src/utils/generate-responses.jsx | 28 ++++-- src/utils/generate-snippets.jsx | 96 +++++-------------- 4 files changed, 65 insertions(+), 83 deletions(-) create mode 100644 src/utils/build-properties.js diff --git a/content/code-examples/subscribers/update-preference.md b/content/code-examples/subscribers/update-preference.md index 34c997f..3f7fa29 100644 --- a/content/code-examples/subscribers/update-preference.md +++ b/content/code-examples/subscribers/update-preference.md @@ -11,7 +11,7 @@ export const novu = new Novu(''); await novu.subscribers.updatePreference(user.id, templateId, { channel: { - type: 'fcm', + type: 'email', enabled: true, }, enabled: true, diff --git a/src/utils/build-properties.js b/src/utils/build-properties.js new file mode 100644 index 0000000..016dc47 --- /dev/null +++ b/src/utils/build-properties.js @@ -0,0 +1,22 @@ +import getValueForParameter from './get-value-for-parameter'; + +export const buildProperty = (propertyName, property) => ` + ${propertyName}: ${getValueForParameter(property, property.type, propertyName)}`; + +export const buildPropertyFromAllOf = (propertyName, property, allOf) => { + const { properties } = allOf[0]; + + const renderedProperties = Object.keys(properties).map((propertyName) => { + const property = properties[propertyName]; + + if (property.allOf) { + return buildPropertyFromAllOf(propertyName, property, property.allOf); + } + + return buildProperty(propertyName, property); + }); + + return ` + ${propertyName}: {${renderedProperties} + }`; +}; diff --git a/src/utils/generate-responses.jsx b/src/utils/generate-responses.jsx index 0a1cee8..aaa3fc4 100644 --- a/src/utils/generate-responses.jsx +++ b/src/utils/generate-responses.jsx @@ -1,4 +1,20 @@ -import getValueForParameter from './get-value-for-parameter'; +import { buildPropertyFromAllOf, buildProperty } from './build-properties'; + +const renderProperties = (properties) => + Object.keys(properties).map((propertyName) => { + const property = properties[propertyName]; + + if (property.allOf) { + return buildPropertyFromAllOf(propertyName, property, property.allOf); + } + + return buildProperty(propertyName, property); + }); + +const buildContent = (properties) => + `{ + ${renderProperties(properties)} +}`; const generateResponses = (responses) => { const items = responses @@ -17,15 +33,7 @@ const generateResponses = (responses) => { return { label: `${response.status}`, language: 'json', - content: `{ - ${Object.keys(props) - .map((propertyName) => { - const { type } = props[propertyName]; - - return `${propertyName}: ${getValueForParameter(props[propertyName], type, propertyName)}`; - }) - .join(',\n ')} -}`, + content: buildContent(props), }; } diff --git a/src/utils/generate-snippets.jsx b/src/utils/generate-snippets.jsx index f5a9fbe..e8aa64f 100644 --- a/src/utils/generate-snippets.jsx +++ b/src/utils/generate-snippets.jsx @@ -1,5 +1,21 @@ +import { buildPropertyFromAllOf } from './build-properties'; import getValueForParameter from './get-value-for-parameter'; +const buildParameters = (parameters, addQuotes) => + Object.keys(parameters?.body?.properties) + .map((name) => { + const property = parameters.body.properties[name]; + const { type, allOf } = property; + const escapedName = addQuotes ? `"${name}"` : `${name}`; + if (allOf) { + return buildPropertyFromAllOf(name, property, allOf); + } + + return `${escapedName}: ${getValueForParameter(property, type, name)}`; + }) + .filter((item) => !!item) + .join(',\n '); + const generateSnippets = ({ method, endpoint, parameters, url }) => [ { label: 'Node.js', @@ -15,14 +31,8 @@ const response = await fetch('${url}${endpoint}', { 'Authorization': 'ApiKey REPLACE_WITH_API_KEY', }, body: JSON.stringify({ - ${Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `${name}: ${getValueForParameter(parameters.body.properties[name], type, name)}`; - }) - .filter((item) => !!item) - .join(',\n ')} - }),` + ${buildParameters(parameters)}, + })` : '' } }); @@ -36,14 +46,8 @@ const data = await response.json(); parameters?.body?.properties ? ` -H "Content-Type: application/json" \\\n -d ` + `'{ - ${Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `"${name}": ${getValueForParameter(parameters.body.properties[name], type, name)}`; - }) - .filter((item) => !!item) - .join(',\n ')} - }' \\\n` + ${buildParameters(parameters, true)} + }' \\\n` : '' }https://api.novu.co${endpoint}`, }, @@ -55,17 +59,7 @@ const data = await response.json(); response = requests.${method.toLowerCase()}('${url}${endpoint}'${ parameters?.body?.properties ? `, json={ - ${Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `"${name}": ${getValueForParameter( - parameters.body.properties[name], - type, - name - )},`; - }) - .filter((item) => !!item) - .join(',\n ')}\n` + + ${buildParameters(parameters, true)}\n` + `}, headers={ 'Content-Type': 'application/json' 'Authorization': 'ApiKey REPLACE_WITH_API_KEY' @@ -87,21 +81,7 @@ http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) request.body = '{ - ${ - parameters?.body?.properties - ? Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `"${name}": ${getValueForParameter( - parameters.body.properties[name], - type, - name - )}`; - }) - .filter((item) => !!item) - .join(',\n ') - : '[options]' - } + ${parameters?.body?.properties ? buildParameters(parameters, true) : '[options]'} }' request.content_type = 'application/json' request.add_field('Authorization', 'ApiKey REPLACE_WITH_API_KEY') @@ -120,21 +100,7 @@ puts response.body $url = '${url}${endpoint}'; $data = array( - ${ - parameters?.body?.properties - ? Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `"${name}": ${getValueForParameter( - parameters.body.properties[name], - type, - name - )}`; - }) - .filter((item) => !!item) - .join(',\n ') - : '[options]' - } + ${parameters?.body?.properties ? buildParameters(parameters, true) : '[options]'} ); $options = array( "http" => array( @@ -166,21 +132,7 @@ import ( func main() { url := "${url}${endpoint}" data := map[string]string{ - ${ - parameters?.body?.properties - ? Object.keys(parameters?.body?.properties) - .map((name) => { - const { type } = parameters.body.properties[name]; - return `"${name}": ${getValueForParameter( - parameters.body.properties[name], - type, - name - )}`; - }) - .filter((item) => !!item) - .join(',\n ') - : '[options]' - } + ${parameters?.body?.properties ? buildParameters(parameters, true) : '[options]'} } jsonValue, _ := json.Marshal(data) req, _ := http.NewRequest("${method.toUpperCase()}", url, bytes.NewBuffer(jsonValue))