1
1
const R = require ( 'ramda' ) ;
2
2
const {
3
- isMember, isExtension, hasKey, getValue,
3
+ isArray , isMember, isExtension, hasKey, getValue,
4
4
} = require ( '../../predicates' ) ;
5
5
const {
6
+ createWarning,
6
7
createUnsupportedMemberWarning,
7
8
createInvalidMemberWarning,
8
9
createIdentifierNotUniqueWarning,
@@ -13,6 +14,7 @@ const parseObject = require('../parseObject');
13
14
const parseString = require ( '../parseString' ) ;
14
15
const parseResponsesObject = require ( './parseResponsesObject' ) ;
15
16
const parseParameterObjects = require ( './parseParameterObjects' ) ;
17
+ const parseSecurityRequirementObject = require ( './parseSecurityRequirementObject' ) ;
16
18
const parseRequestBodyObject = require ( './parseRequestBodyObject' ) ;
17
19
const parseReference = require ( '../parseReference' ) ;
18
20
@@ -21,7 +23,7 @@ const parseRequestBodyObjectOrRef = parseReference('requestBodies', parseRequest
21
23
const name = 'Operation Object' ;
22
24
const requiredKeys = [ 'responses' ] ;
23
25
const unsupportedKeys = [
24
- 'tags' , 'externalDocs' , 'callbacks' , 'deprecated' , 'security' ,
26
+ 'tags' , 'externalDocs' , 'callbacks' , 'deprecated' ,
25
27
] ;
26
28
const isUnsupportedKey = R . anyPass ( R . map ( hasKey , unsupportedKeys ) ) ;
27
29
@@ -102,13 +104,32 @@ function parseOperationObject(context, path, member) {
102
104
) ,
103
105
] ) ) ;
104
106
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
+
105
125
const parseMember = R . cond ( [
106
126
[ hasKey ( 'summary' ) , parseString ( context , name , false ) ] ,
107
127
[ hasKey ( 'description' ) , parseCopy ( context , name , false ) ] ,
108
128
[ hasKey ( 'operationId' ) , pipeParseResult ( namespace , parseString ( context , name , false ) , parseOperationId ) ] ,
109
129
[ hasKey ( 'responses' ) , R . compose ( parseResponsesObject ( context ) , getValue ) ] ,
110
130
[ hasKey ( 'requestBody' ) , R . compose ( parseRequestBodyObjectOrRef ( context ) , getValue ) ] ,
111
131
[ hasKey ( 'parameters' ) , R . compose ( parseParameterObjects ( context , name ) , getValue ) ] ,
132
+ [ hasKey ( 'security' ) , R . compose ( parseSecurity , getValue ) ] ,
112
133
113
134
[ isUnsupportedKey , createUnsupportedMemberWarning ( namespace , name ) ] ,
114
135
@@ -161,6 +182,13 @@ function parseOperationObject(context, path, member) {
161
182
}
162
183
}
163
184
185
+ const security = operation . get ( 'security' ) ;
186
+ if ( security ) {
187
+ transactions . forEach ( ( transaction ) => {
188
+ transaction . attributes . set ( 'authSchemes' , security . clone ( ) ) ;
189
+ } ) ;
190
+ }
191
+
164
192
return transition ;
165
193
} ) ;
166
194
0 commit comments