Skip to content
This repository was archived by the owner on Nov 8, 2024. It is now read-only.

Commit e6cb222

Browse files
committed
feat(oas3): added support for global security requirement
1 parent 8c656f5 commit e6cb222

13 files changed

+1183
-101
lines changed

packages/fury-adapter-oas3-parser/lib/parser/oas/parseOpenAPIObject.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ const parseOpenAPI = require('../openapi');
1515
const parseInfoObject = require('./parseInfoObject');
1616
const parsePathsObject = require('./parsePathsObject');
1717
const parseComponentsObject = require('./parseComponentsObject');
18+
const parseSecurityRequirementsArray = require('./parseSecurityRequirementsArray');
1819

1920
const name = 'OpenAPI Object';
2021
const requiredKeys = ['openapi', 'info', 'paths'];
21-
const unsupportedKeys = ['servers', 'security', 'tags', 'externalDocs'];
22+
const unsupportedKeys = ['servers', 'tags', 'externalDocs'];
2223

2324
/**
2425
* Returns whether the given member element is unsupported
@@ -111,6 +112,7 @@ function parseOASObject(context, object) {
111112
[hasKey('info'), R.compose(parseInfoObject(context), getValue)],
112113
[hasKey('paths'), R.compose(asArray, parsePathsObject(context), getValue)],
113114
[hasKey('components'), R.compose(parseComponentsObject(context), getValue)],
115+
[hasKey('security'), R.compose(parseSecurityRequirementsArray(context), getValue)],
114116

115117
// FIXME Support exposing extensions into parse result
116118
[isExtension, () => new namespace.elements.ParseResult()],
@@ -126,6 +128,7 @@ function parseOASObject(context, object) {
126128
(object) => {
127129
const api = object.get('info');
128130
const components = object.get('components');
131+
const security = object.get('security');
129132

130133
if (components) {
131134
const schemes = R.or(components.get('securitySchemes'), new namespace.elements.Array());
@@ -142,6 +145,20 @@ function parseOASObject(context, object) {
142145
api.content = api.content.concat(resources.content);
143146
}
144147

148+
api.resources.forEach((resource) => {
149+
resource.transitions.forEach((transition) => {
150+
transition.transactions.forEach((transaction) => {
151+
if (!transaction.authSchemes && security && !security.isEmpty) {
152+
transaction.attributes.set('authSchemes', security.clone());
153+
}
154+
155+
if (transaction.authSchemes && transaction.authSchemes.isEmpty) {
156+
transaction.attributes.remove('authSchemes');
157+
}
158+
});
159+
});
160+
});
161+
145162
if (components) {
146163
const schemas = R.or(components.get('schemas'), new namespace.elements.Array())
147164
.content

packages/fury-adapter-oas3-parser/lib/parser/oas/parseOperationObject.js

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
const R = require('ramda');
22
const {
3-
isArray, isMember, isExtension, hasKey, getValue,
3+
isMember, isExtension, hasKey, getValue,
44
} = require('../../predicates');
55
const {
6-
createWarning,
76
createUnsupportedMemberWarning,
87
createInvalidMemberWarning,
98
createIdentifierNotUniqueWarning,
@@ -14,8 +13,8 @@ const parseObject = require('../parseObject');
1413
const parseString = require('../parseString');
1514
const parseResponsesObject = require('./parseResponsesObject');
1615
const parseParameterObjects = require('./parseParameterObjects');
17-
const parseSecurityRequirementObject = require('./parseSecurityRequirementObject');
1816
const parseRequestBodyObject = require('./parseRequestBodyObject');
17+
const parseSecurityRequirementsArray = require('./parseSecurityRequirementsArray');
1918
const parseReference = require('../parseReference');
2019

2120
const parseRequestBodyObjectOrRef = parseReference('requestBodies', parseRequestBodyObject);
@@ -104,32 +103,14 @@ function parseOperationObject(context, path, member) {
104103
),
105104
]));
106105

107-
const parseSecurity = pipeParseResult(namespace,
108-
R.unless(isArray, createWarning(namespace, `'${name}' 'security' is not an array`)),
109-
R.compose(R.chain(parseSecurityRequirementObject(context)), R.constructN(1, namespace.elements.Array)),
110-
requirements => requirements.map((requirement) => {
111-
if (requirement.length === 1) {
112-
return requirement.get(0);
113-
}
114-
115-
const link = new namespace.elements.Link();
116-
link.relation = 'profile';
117-
link.href = 'https://github.com/refractproject/rfcs/issues/39';
118-
119-
const allOf = new namespace.elements.Extension(requirement.content);
120-
allOf.meta.set('links', new namespace.elements.Array([link]));
121-
122-
return allOf;
123-
}));
124-
125106
const parseMember = R.cond([
126107
[hasKey('summary'), parseString(context, name, false)],
127108
[hasKey('description'), parseCopy(context, name, false)],
128109
[hasKey('operationId'), pipeParseResult(namespace, parseString(context, name, false), parseOperationId)],
129110
[hasKey('responses'), R.compose(parseResponsesObject(context), getValue)],
130111
[hasKey('requestBody'), R.compose(parseRequestBodyObjectOrRef(context), getValue)],
131112
[hasKey('parameters'), R.compose(parseParameterObjects(context, name), getValue)],
132-
[hasKey('security'), R.compose(parseSecurity, getValue)],
113+
[hasKey('security'), R.compose(parseSecurityRequirementsArray(context), getValue)],
133114

134115
[isUnsupportedKey, createUnsupportedMemberWarning(namespace, name)],
135116

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const R = require('ramda');
2+
const pipeParseResult = require('../../pipeParseResult');
3+
const parseArray = require('../parseArray');
4+
const parseSecurityRequirementObject = require('./parseSecurityRequirementObject');
5+
6+
const name = 'Security Requirements Array';
7+
8+
/**
9+
* Parse Security Requirements Array
10+
*
11+
* @param namespace {Namespace}
12+
* @param element {Element}
13+
* @returns ParseResult
14+
*
15+
* @private
16+
*/
17+
function parseSecurityRequirementsArray(context, element) {
18+
const { namespace } = context;
19+
20+
const parseSecurityRequirements = pipeParseResult(namespace,
21+
parseArray(context, name, R.curry(parseSecurityRequirementObject)(context)),
22+
requirements => requirements.map((requirement) => {
23+
if (requirement.length === 1) {
24+
return requirement.get(0);
25+
}
26+
27+
const link = new namespace.elements.Link();
28+
link.relation = 'profile';
29+
link.href = 'https://github.com/refractproject/rfcs/issues/39';
30+
31+
const allOf = new namespace.elements.Extension(requirement.content);
32+
allOf.meta.set('links', new namespace.elements.Array([link]));
33+
34+
return allOf;
35+
}));
36+
37+
return parseSecurityRequirements(element);
38+
}
39+
40+
module.exports = R.curry(parseSecurityRequirementsArray);

0 commit comments

Comments
 (0)