@@ -117,7 +117,7 @@ data Swagger = Swagger
117 , _swaggerResponses :: Definitions Response
117 , _swaggerResponses :: Definitions Response
119 -- | Security scheme definitions that can be used across the specification.
119 -- | Security scheme definitions that can be used across the specification.
120− , _swaggerSecurityDefinitions :: Definitions SecurityScheme
120+ , _swaggerSecurityDefinitions :: SecurityDefinitions
122 -- | A declaration of which security schemes are applied for the API as a whole.
122 -- | A declaration of which security schemes are applied for the API as a whole.
123 -- The list of values describes alternative security schemes that can be used
123 -- The list of values describes alternative security schemes that can be used
@@ -755,6 +755,22 @@ data SecurityScheme = SecurityScheme
755 , _securitySchemeDescription :: Maybe Text
755 , _securitySchemeDescription :: Maybe Text
756 } deriving (Eq, Show, Generic, Data, Typeable)
756 } deriving (Eq, Show, Generic, Data, Typeable)
759+-- | merge scopes of two OAuth2 security schemes when their flows are identical.
760+-- In other case returns first security scheme
761+mergeSecurityScheme :: SecurityScheme -> SecurityScheme -> SecurityScheme
762+mergeSecurityScheme s1@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 scopes1)) desc)
763+ s2@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow2 scopes2)) _)
764+ = if flow1 == flow2 then
765+ SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 (scopes1 <> scopes2))) desc
768+mergeSecurityScheme s1 _ = s1
770+newtype SecurityDefinitions
771+ = SecurityDefinitions (Definitions SecurityScheme)
772+ deriving (Eq, Show, Generic, Data, Typeable)
758-- | Lists the required security schemes to execute this operation.
774-- | Lists the required security schemes to execute this operation.
759-- The object can have multiple security schemes declared in it which are all required
775-- The object can have multiple security schemes declared in it which are all required
760-- (that is, there is a logical AND between the schemes).
776-- (that is, there is a logical AND between the schemes).
@@ -904,6 +920,17 @@ instance Monoid Example where
904 mempty = genericMempty
920 mempty = genericMempty
905 mappend = (<>)
921 mappend = (<>)
923+instance Semigroup SecurityScheme where
924+ (<>) = mergeSecurityScheme
926+instance Semigroup SecurityDefinitions where
927+ (SecurityDefinitions sd1) <> (SecurityDefinitions sd2) =
928+ SecurityDefinitions $ InsOrdHashMap.unionWith (<>) sd1 sd2
930+instance Monoid SecurityDefinitions where
931+ mempty = SecurityDefinitions $ InsOrdHashMap.empty
907-- =======================================================================
934-- =======================================================================
908-- SwaggerMonoid helper instances
935-- SwaggerMonoid helper instances
909-- =======================================================================
936-- =======================================================================
@@ -918,6 +945,7 @@ instance SwaggerMonoid Responses
918instance SwaggerMonoid Response
945instance SwaggerMonoid Response
919instance SwaggerMonoid ExternalDocs
946instance SwaggerMonoid ExternalDocs
920instance SwaggerMonoid Operation
947instance SwaggerMonoid Operation
948+instance SwaggerMonoid SecurityDefinitions
921instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
949instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
923instance SwaggerMonoid MimeList
951instance SwaggerMonoid MimeList
@@ -935,18 +963,6 @@ instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
935 swaggerMempty = InsOrdHashMap.empty
963 swaggerMempty = InsOrdHashMap.empty
936 swaggerMappend = InsOrdHashMap.unionWith mappend
964 swaggerMappend = InsOrdHashMap.unionWith mappend
938−instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap Text SecurityScheme) where
939− swaggerMempty = InsOrdHashMap.empty
940− swaggerMappend = InsOrdHashMap.unionWith mergeFun
942− mergeFun s1@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 scopes1)) desc)
943− s2@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow2 scopes2)) _)
944− = if flow1 == flow2 then
945− SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 (scopes1 <> scopes2))) desc
950instance Monoid a => SwaggerMonoid (Referenced a) where
966instance Monoid a => SwaggerMonoid (Referenced a) where
951 swaggerMempty = Inline mempty
967 swaggerMempty = Inline mempty
952 swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
968 swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
@@ -1130,6 +1146,9 @@ instance ToJSON PathItem where
1130instance ToJSON Example where
1146instance ToJSON Example where
1131 toJSON = toJSON . Map.mapKeys show . getExample
1147 toJSON = toJSON . Map.mapKeys show . getExample
1149+instance ToJSON SecurityDefinitions where
1150+ toJSON (SecurityDefinitions sd) = toJSON sd
1133instance ToJSON Reference where
1152instance ToJSON Reference where
1134 toJSON (Reference ref) = object [ "$ref" .= ref ]
1153 toJSON (Reference ref) = object [ "$ref" .= ref ]
@@ -1291,6 +1310,9 @@ instance FromJSON Operation where
1291instance FromJSON PathItem where
1310instance FromJSON PathItem where
1292 parseJSON = sopSwaggerGenericParseJSON
1311 parseJSON = sopSwaggerGenericParseJSON
1313+instance FromJSON SecurityDefinitions where
1314+ parseJSON js = SecurityDefinitions <$> parseJSON js
1294instance FromJSON Reference where
1316instance FromJSON Reference where
1295 parseJSON (Object o) = Reference <$> o .: "$ref"
1317 parseJSON (Object o) = Reference <$> o .: "$ref"
1296 parseJSON _ = empty
1318 parseJSON _ = empty
@@ -1402,3 +1424,4 @@ instance AesonDefaultValue (SwaggerType a)
1402instance AesonDefaultValue MimeList where defaultValue = Just mempty
1424instance AesonDefaultValue MimeList where defaultValue = Just mempty
1403instance AesonDefaultValue Info
1425instance AesonDefaultValue Info
1404instance AesonDefaultValue ParamLocation
1426instance AesonDefaultValue ParamLocation
1427+instance AesonDefaultValue SecurityDefinitions where defaultValue = Just $ SecurityDefinitions mempty