Webhooks
- {pathItemsElements}
+
+ {pathItemNames.map((pathItemName) => (
+
+ {operationDTOs[pathItemName].map((operationDTO) => (
+
+ ))}
+
+ ))}
)
}
Webhooks.propTypes = {
- specSelectors: PropTypes.object.isRequired,
+ specSelectors: PropTypes.shape({
+ selectWebhooksOperations: PropTypes.func.isRequired,
+ }).isRequired,
getComponent: PropTypes.func.isRequired,
- specPath: ImPropTypes.list,
-}
-
-Webhooks.defaultProps = {
- specPath: fromJS([])
}
export default Webhooks
diff --git a/src/core/plugins/oas31/helpers.js b/src/core/plugins/oas31/helpers.js
index ac7fd3e3..c9357310 100644
--- a/src/core/plugins/oas31/helpers.js
+++ b/src/core/plugins/oas31/helpers.js
@@ -1,6 +1,7 @@
/**
* @prettier
*/
+
export const isOAS31 = (jsSpec) => {
const oasVersion = jsSpec.get("openapi")
@@ -9,14 +10,34 @@ export const isOAS31 = (jsSpec) => {
)
}
+/**
+ * Selector maker the only calls the passed selector
+ * when spec is of OpenAPI 3.1.0 version.
+ */
export const onlyOAS31 =
(selector) =>
- () =>
- (system, ...args) => {
+ (state, ...args) =>
+ (system) => {
if (system.getSystem().specSelectors.isOAS31()) {
- const result = selector(...args)
- return typeof result === "function" ? result(system, ...args) : result
+ const result = selector(state, ...args)
+ return typeof result === "function" ? result(system) : result
} else {
return null
}
}
+
+/**
+ * Selector wrapper maker the only wraps the passed selector
+ * when spec is of OpenAPI 3.1.0 version.
+ */
+export const onlyOAS31Wrap =
+ (selector) =>
+ (oriSelector, system) =>
+ (state, ...args) => {
+ if (system.getSystem().specSelectors.isOAS31()) {
+ const result = selector(state, ...args)
+ return typeof result === "function" ? result(system) : result
+ } else {
+ return oriSelector(...args)
+ }
+ }
diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js
index d01378cd..d20f7116 100644
--- a/src/core/plugins/oas31/index.js
+++ b/src/core/plugins/oas31/index.js
@@ -25,10 +25,11 @@ import {
selectInfoSummaryField,
selectInfoDescriptionField,
selectInfoTermsOfServiceField,
- makeSelectInfoTermsOfServiceUrl as makeSelectTosUrl,
+ makeSelectInfoTermsOfServiceUrl,
selectExternalDocsDescriptionField,
selectExternalDocsUrlField,
makeSelectExternalDocsUrl,
+ makeSelectWebhooksOperations,
} from "./spec-extensions/selectors"
import {
isOAS3 as isOAS3Wrapper,
@@ -45,8 +46,9 @@ const OAS31Plugin = () => {
specSelectors.isOAS31 = makeIsOAS31(system)
specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system)
specSelectors.selectContactUrl = makeSelectContactUrl(system)
- specSelectors.selectInfoTermsOfServiceUrl = makeSelectTosUrl(system)
+ specSelectors.selectInfoTermsOfServiceUrl = makeSelectInfoTermsOfServiceUrl(system) // prettier-ignore
specSelectors.selectExternalDocsUrl = makeSelectExternalDocsUrl(system)
+ specSelectors.selectWebhooksOperations = makeSelectWebhooksOperations(system) // prettier-ignore
oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system)
},
diff --git a/src/core/plugins/oas31/spec-extensions/selectors.js b/src/core/plugins/oas31/spec-extensions/selectors.js
index 363cc958..acf2092b 100644
--- a/src/core/plugins/oas31/spec-extensions/selectors.js
+++ b/src/core/plugins/oas31/spec-extensions/selectors.js
@@ -1,7 +1,7 @@
/**
* @prettier
*/
-import { Map } from "immutable"
+import { List, Map } from "immutable"
import { createSelector } from "reselect"
import { safeBuildUrl } from "core/utils/url"
@@ -16,6 +16,39 @@ export const webhooks = onlyOAS31(() => (system) => {
return system.specSelectors.specJson().get("webhooks", map)
})
+/**
+ * `specResolvedSubtree` selector is needed as input selector,
+ * so that we regenerate the selected result whenever the lazy
+ * resolution happens.
+ */
+export const makeSelectWebhooksOperations = (system) =>
+ onlyOAS31(
+ createSelector(
+ () => system.specSelectors.webhooks(),
+ () => system.specSelectors.validOperationMethods(),
+ () => system.specSelectors.specResolvedSubtree(["webhooks"]),
+ (webhooks, validOperationMethods) => {
+ return webhooks
+ .reduce((allOperations, pathItem, pathItemName) => {
+ const pathItemOperations = pathItem
+ .entrySeq()
+ .filter(([key]) => validOperationMethods.includes(key))
+ .map(([method, operation]) => ({
+ operation: Map({ operation }),
+ method,
+ path: pathItemName,
+ specPath: List(["webhooks", pathItemName, method]),
+ }))
+
+ return allOperations.concat(pathItemOperations)
+ }, List())
+ .groupBy((operation) => operation.path)
+ .map((operations) => operations.toArray())
+ .toObject()
+ }
+ )
+ )
+
export const license = () => (system) => {
return system.specSelectors.info().get("license", map)
}
diff --git a/src/core/plugins/oas31/spec-extensions/wrap-selectors.js b/src/core/plugins/oas31/spec-extensions/wrap-selectors.js
index af207436..0631d49c 100644
--- a/src/core/plugins/oas31/spec-extensions/wrap-selectors.js
+++ b/src/core/plugins/oas31/spec-extensions/wrap-selectors.js
@@ -1,6 +1,8 @@
/**
* @prettier
*/
+import { onlyOAS31Wrap } from "../helpers"
+
export const isOAS3 =
(oriSelector, system) =>
(state, ...args) => {
@@ -8,12 +10,6 @@ export const isOAS3 =
return isOAS31 || oriSelector(...args)
}
-export const selectLicenseUrl =
- (oriSelector, system) =>
- (state, ...args) => {
- if (system.specSelectors.isOAS31()) {
- return system.oas31Selectors.selectLicenseUrl()
- }
-
- return oriSelector(...args)
- }
+export const selectLicenseUrl = onlyOAS31Wrap(() => (system) => {
+ return system.oas31Selectors.selectLicenseUrl()
+})
diff --git a/src/core/plugins/spec/selectors.js b/src/core/plugins/spec/selectors.js
index 97a4788b..2647fef6 100644
--- a/src/core/plugins/spec/selectors.js
+++ b/src/core/plugins/spec/selectors.js
@@ -114,6 +114,8 @@ export const paths = createSelector(
spec => spec.get("paths")
)
+export const validOperationMethods = createSelector(() => ["get", "put", "post", "delete", "options", "head", "patch"])
+
export const operations = createSelector(
paths,
paths => {
diff --git a/test/unit/components/operations.jsx b/test/unit/components/operations.jsx
index d8295aa3..4afeb61f 100644
--- a/test/unit/components/operations.jsx
+++ b/test/unit/components/operations.jsx
@@ -28,6 +28,7 @@ describe("