From 3acebcffc03652b87c320b6494a65e023e786950 Mon Sep 17 00:00:00 2001 From: EpicUsaMan Date: Tue, 5 Mar 2019 20:55:46 +0200 Subject: [PATCH 1/3] Support array of methods in documentation plugin --- .../services/Documentation.js | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/strapi-plugin-documentation/services/Documentation.js b/packages/strapi-plugin-documentation/services/Documentation.js index 2291b70533..4b0bc012d2 100755 --- a/packages/strapi-plugin-documentation/services/Documentation.js +++ b/packages/strapi-plugin-documentation/services/Documentation.js @@ -369,7 +369,13 @@ module.exports = { const routeTagConfig = _.get(current, ['config', 'tag']); // Add curly braces between dynamic params const endPoint = this.formatApiEndPoint(current.path); - const verb = current.method.toLowerCase(); + let verb; + + if (Array.isArray(current.method)) { + verb = current.method.map((method) => method.toLowerCase()); + } else { + verb = current.method.toLowerCase(); + } // The key corresponds to firsts keys of the returned object let key; let tags; @@ -932,6 +938,24 @@ module.exports = { */ generateResponseDescription: function(verb, tag, endPoint) { const isModelRelated = strapi.models[tag] !== undefined && tag === endPoint; + + if (Array.isArray(verb)) { + verb = verb.map((method) => method.toLocaleLowerCase()); + + if ( + verb.includes('get') || + verb.includes('put') || + verb.includes('post') + ) { + return isModelRelated ? `Retrieve ${tag} document(s)` : 'response'; + } else if (verb.includes('delete')) { + return isModelRelated + ? `deletes a single ${tag} based on the ID supplied` + : 'deletes a single record based on the ID supplied'; + } else { + return 'response'; + } + } switch (verb.toLocaleLowerCase()) { case 'get': @@ -1080,6 +1104,26 @@ module.exports = { if (description) { return description; } + + if (Array.isArray(verb)) { + const [, controllerMethod] = handler.split('.'); + + if ( + (verb.includes('get') && verb.includes('post')) || + controllerMethod === 'findOrCreate' + ) { + return `Find or create ${tag} record`; + } + + if ( + (verb.includes('put') && verb.includes('post')) || + controllerMethod === 'createOrUpdate' + ) { + return `Create or update ${tag} record`; + } + + return ''; + } switch (verb) { case 'get': { From 585051b77f1c0f02b83941862001b33d6d52c161 Mon Sep 17 00:00:00 2001 From: EpicUsaMan Date: Tue, 5 Mar 2019 21:12:35 +0200 Subject: [PATCH 2/3] Remove unused code --- .../services/Documentation.js | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/packages/strapi-plugin-documentation/services/Documentation.js b/packages/strapi-plugin-documentation/services/Documentation.js index 4b0bc012d2..8c0674429b 100755 --- a/packages/strapi-plugin-documentation/services/Documentation.js +++ b/packages/strapi-plugin-documentation/services/Documentation.js @@ -941,33 +941,20 @@ module.exports = { if (Array.isArray(verb)) { verb = verb.map((method) => method.toLocaleLowerCase()); - - if ( - verb.includes('get') || - verb.includes('put') || - verb.includes('post') - ) { - return isModelRelated ? `Retrieve ${tag} document(s)` : 'response'; - } else if (verb.includes('delete')) { - return isModelRelated - ? `deletes a single ${tag} based on the ID supplied` - : 'deletes a single record based on the ID supplied'; - } else { - return 'response'; - } } - switch (verb.toLocaleLowerCase()) { - case 'get': - case 'post': - case 'put': - return isModelRelated ? `Retrieve ${tag} document(s)` : 'response'; - case 'delete': - return isModelRelated - ? `deletes a single ${tag} based on the ID supplied` - : 'deletes a single record based on the ID supplied'; - default: - return 'response'; + if ( + verb.includes('get') || + verb.includes('put') || + verb.includes('post') + ) { + return isModelRelated ? `Retrieve ${tag} document(s)` : 'response'; + } else if (verb.includes('delete')) { + return isModelRelated + ? `deletes a single ${tag} based on the ID supplied` + : 'deletes a single record based on the ID supplied'; + } else { + return 'response'; } }, From 38887214ed5fe8a58ac24ad4a1a2322c11aac87f Mon Sep 17 00:00:00 2001 From: EpicUsaMan Date: Tue, 5 Mar 2019 22:03:52 +0200 Subject: [PATCH 3/3] Add support for array of methods to plugins --- .../services/Documentation.js | 87 ++++++++++++++++--- 1 file changed, 77 insertions(+), 10 deletions(-) diff --git a/packages/strapi-plugin-documentation/services/Documentation.js b/packages/strapi-plugin-documentation/services/Documentation.js index 8c0674429b..b7d6b596e3 100755 --- a/packages/strapi-plugin-documentation/services/Documentation.js +++ b/packages/strapi-plugin-documentation/services/Documentation.js @@ -410,9 +410,16 @@ module.exports = { tags: _.isEmpty(tags) ? [_.upperFirst(key)] : [_.upperFirst(tags)], }; - _.set(acc, [key, 'paths', endPoint, verb], verbObject); + // Swagger is not support key with ',' symbol, for array of methods need generate documentation for each method + if (Array.isArray(verb)) { + verb.forEach((method) => { + _.set(acc, [key, 'paths', endPoint, method], verbObject); + }); + } else { + _.set(acc, [key, 'paths', endPoint, verb], verbObject); + } - if (verb === 'post' || verb === 'put') { + if (verb.includes('post') || verb.includes('put')) { let requestBody; if (controllerMethod === 'create' || controllerMethod === 'update') { @@ -445,14 +452,38 @@ module.exports = { }; } - _.set(acc, [key, 'paths', endPoint, verb, 'requestBody'], requestBody); + if (Array.isArray(verb)) { + verb.forEach((method) => { + _.set( + acc, + [key, 'paths', endPoint, method, 'requestBody'], + requestBody, + ); + }); + } else { + _.set( + acc, + [key, 'paths', endPoint, verb, 'requestBody'], + requestBody, + ); + } } // Refer to https://swagger.io/specification/#pathItemObject const parameters = this.generateVerbParameters(verb, controllerMethod, current.path); - if (verb !== 'post') { - _.set(acc, [key, 'paths', endPoint, verb, 'parameters'], parameters); + if (!verb.includes('post')) { + if (Array.isArray(verb)) { + verb.forEach((method) => { + _.set( + acc, + [key, 'paths', endPoint, method, 'parameters'], + parameters, + ); + }); + } else { + _.set(acc, [key, 'paths', endPoint, verb, 'parameters'], parameters); + } } return acc; @@ -561,7 +592,14 @@ module.exports = { prefix === undefined ? this.formatApiEndPoint(`/${pluginName}${current.path}`) : this.formatApiEndPoint(`${prefix}${current.path}`); - const verb = current.method.toLowerCase(); + let verb; + + if (Array.isArray(current.method)) { + verb = current.method.map((method) => method.toLowerCase()); + } else { + verb = current.method.toLowerCase(); + } + const actionType = _.get(current, ['config', 'tag', 'actionType'], ''); let key; let tags; @@ -597,11 +635,25 @@ module.exports = { ); if (_.isEmpty(defaultDocumentation)) { - if (verb !== 'post') { - _.set(acc, [key, 'paths', endPoint, verb, 'parameters'], parameters); + if (!verb.includes('post')) { + if (Array.isArray(verb)) { + verb.forEach((method) => { + _.set( + acc, + [key, 'paths', endPoint, method, 'parameters'], + parameters, + ); + }); + } else { + _.set( + acc, + [key, 'paths', endPoint, verb, 'parameters'], + parameters, + ); + } } - if (verb === 'post' || verb === 'put') { + if (verb.includes('post') || verb.includes('put')) { let requestBody; if (actionType === 'create' || actionType === 'update') { @@ -639,7 +691,22 @@ module.exports = { }, }; } - _.set(acc, [key, 'paths', endPoint, verb, 'requestBody'], requestBody); + + if (Array.isArray(verb)) { + verb.forEach((method) => { + _.set( + acc, + [key, 'paths', endPoint, method, 'requestBody'], + requestBody, + ); + }); + } else { + _.set( + acc, + [key, 'paths', endPoint, verb, 'requestBody'], + requestBody, + ); + } } }