@@ -117,7 +117,7 @@ data Swagger = Swagger
117117 , _swaggerResponses :: Definitions Response
118118
119119 -- | Security scheme definitions that can be used across the specification.
120− , _swaggerSecurityDefinitions :: Definitions SecurityScheme
120+ , _swaggerSecurityDefinitions :: SecurityDefinitions
121121
122122 -- | A declaration of which security schemes are applied for the API as a whole.
123123 -- The list of values describes alternative security schemes that can be used
@@ -755,6 +755,22 @@ data SecurityScheme = SecurityScheme
755755 , _securitySchemeDescription :: Maybe Text
756756 } deriving (Eq, Show, Generic, Data, Typeable)
757757
758+
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
766+ else
767+ s1
768+mergeSecurityScheme s1 _ = s1
769+
770+newtype SecurityDefinitions
771+ = SecurityDefinitions (Definitions SecurityScheme)
772+ deriving (Eq, Show, Generic, Data, Typeable)
773+
758774-- | Lists the required security schemes to execute this operation.
759775-- The object can have multiple security schemes declared in it which are all required
760776-- (that is, there is a logical AND between the schemes).
@@ -904,6 +920,17 @@ instance Monoid Example where
904920 mempty = genericMempty
905921 mappend = (<>)
906922
923+instance Semigroup SecurityScheme where
924+ (<>) = mergeSecurityScheme
925+
926+instance Semigroup SecurityDefinitions where
927+ (SecurityDefinitions sd1) <> (SecurityDefinitions sd2) =
928+ SecurityDefinitions $ InsOrdHashMap.unionWith (<>) sd1 sd2
929+
930+instance Monoid SecurityDefinitions where
931+ mempty = SecurityDefinitions $ InsOrdHashMap.empty
932+ mappend = (<>)
933+
907934-- =======================================================================
908935-- SwaggerMonoid helper instances
909936-- =======================================================================
@@ -918,6 +945,7 @@ instance SwaggerMonoid Responses
918945instance SwaggerMonoid Response
919946instance SwaggerMonoid ExternalDocs
920947instance SwaggerMonoid Operation
948+instance SwaggerMonoid SecurityDefinitions
921949instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
922950
923951instance SwaggerMonoid MimeList
@@ -935,18 +963,6 @@ instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
935963 swaggerMempty = InsOrdHashMap.empty
936964 swaggerMappend = InsOrdHashMap.unionWith mappend
937965
938−instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap Text SecurityScheme) where
939− swaggerMempty = InsOrdHashMap.empty
940− swaggerMappend = InsOrdHashMap.unionWith mergeFun
941− where
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
946− else
947− s2
948− mergeFun _ ss = ss
949−
950966instance Monoid a => SwaggerMonoid (Referenced a) where
951967 swaggerMempty = Inline mempty
952968 swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
@@ -1130,6 +1146,9 @@ instance ToJSON PathItem where
11301146instance ToJSON Example where
11311147 toJSON = toJSON . Map.mapKeys show . getExample
11321148
1149+instance ToJSON SecurityDefinitions where
1150+ toJSON (SecurityDefinitions sd) = toJSON sd
1151+
11331152instance ToJSON Reference where
11341153 toJSON (Reference ref) = object [ "$ref" .= ref ]
11351154
@@ -1291,6 +1310,9 @@ instance FromJSON Operation where
12911310instance FromJSON PathItem where
12921311 parseJSON = sopSwaggerGenericParseJSON
12931312
1313+instance FromJSON SecurityDefinitions where
1314+ parseJSON js = SecurityDefinitions <$> parseJSON js
1315+
12941316instance FromJSON Reference where
12951317 parseJSON (Object o) = Reference <$> o .: "$ref"
12961318 parseJSON _ = empty
@@ -1402,3 +1424,4 @@ instance AesonDefaultValue (SwaggerType a)
14021424instance AesonDefaultValue MimeList where defaultValue = Just mempty
14031425instance AesonDefaultValue Info
14041426instance AesonDefaultValue ParamLocation
1427+instance AesonDefaultValue SecurityDefinitions where defaultValue = Just $ SecurityDefinitions mempty