{-# LANGUAGE TemplateHaskell #-}

-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Wire.API.Routes.FederationDomainConfig
  ( FederationDomainConfig (..),
    FederationDomainConfigs (..),
    defFederationDomainConfigs,
    FederationStrategy (..),
    FederationRemoteTeam (..),
    FederationRestriction (..),
  )
where

import Control.Lens (makePrisms, (?~))
import Control.Lens.Tuple (_1)
import Data.Aeson (FromJSON, ToJSON)
import Data.Domain (Domain)
import Data.Id
import Data.OpenApi qualified as S
import Data.Schema
import GHC.Generics
import Imports
import Wire.API.User.Search (FederatedUserSearchPolicy)
import Wire.Arbitrary (Arbitrary, GenericUniform (..))

data FederationRestriction = FederationRestrictionAllowAll | FederationRestrictionByTeam [TeamId]
  deriving (FederationRestriction -> FederationRestriction -> Bool
(FederationRestriction -> FederationRestriction -> Bool)
-> (FederationRestriction -> FederationRestriction -> Bool)
-> Eq FederationRestriction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationRestriction -> FederationRestriction -> Bool
== :: FederationRestriction -> FederationRestriction -> Bool
$c/= :: FederationRestriction -> FederationRestriction -> Bool
/= :: FederationRestriction -> FederationRestriction -> Bool
Eq, Int -> FederationRestriction -> ShowS
[FederationRestriction] -> ShowS
FederationRestriction -> String
(Int -> FederationRestriction -> ShowS)
-> (FederationRestriction -> String)
-> ([FederationRestriction] -> ShowS)
-> Show FederationRestriction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FederationRestriction -> ShowS
showsPrec :: Int -> FederationRestriction -> ShowS
$cshow :: FederationRestriction -> String
show :: FederationRestriction -> String
$cshowList :: [FederationRestriction] -> ShowS
showList :: [FederationRestriction] -> ShowS
Show, (forall x. FederationRestriction -> Rep FederationRestriction x)
-> (forall x. Rep FederationRestriction x -> FederationRestriction)
-> Generic FederationRestriction
forall x. Rep FederationRestriction x -> FederationRestriction
forall x. FederationRestriction -> Rep FederationRestriction x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FederationRestriction -> Rep FederationRestriction x
from :: forall x. FederationRestriction -> Rep FederationRestriction x
$cto :: forall x. Rep FederationRestriction x -> FederationRestriction
to :: forall x. Rep FederationRestriction x -> FederationRestriction
Generic, Eq FederationRestriction
Eq FederationRestriction =>
(FederationRestriction -> FederationRestriction -> Ordering)
-> (FederationRestriction -> FederationRestriction -> Bool)
-> (FederationRestriction -> FederationRestriction -> Bool)
-> (FederationRestriction -> FederationRestriction -> Bool)
-> (FederationRestriction -> FederationRestriction -> Bool)
-> (FederationRestriction
    -> FederationRestriction -> FederationRestriction)
-> (FederationRestriction
    -> FederationRestriction -> FederationRestriction)
-> Ord FederationRestriction
FederationRestriction -> FederationRestriction -> Bool
FederationRestriction -> FederationRestriction -> Ordering
FederationRestriction
-> FederationRestriction -> FederationRestriction
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FederationRestriction -> FederationRestriction -> Ordering
compare :: FederationRestriction -> FederationRestriction -> Ordering
$c< :: FederationRestriction -> FederationRestriction -> Bool
< :: FederationRestriction -> FederationRestriction -> Bool
$c<= :: FederationRestriction -> FederationRestriction -> Bool
<= :: FederationRestriction -> FederationRestriction -> Bool
$c> :: FederationRestriction -> FederationRestriction -> Bool
> :: FederationRestriction -> FederationRestriction -> Bool
$c>= :: FederationRestriction -> FederationRestriction -> Bool
>= :: FederationRestriction -> FederationRestriction -> Bool
$cmax :: FederationRestriction
-> FederationRestriction -> FederationRestriction
max :: FederationRestriction
-> FederationRestriction -> FederationRestriction
$cmin :: FederationRestriction
-> FederationRestriction -> FederationRestriction
min :: FederationRestriction
-> FederationRestriction -> FederationRestriction
Ord)
  deriving (Gen FederationRestriction
Gen FederationRestriction
-> (FederationRestriction -> [FederationRestriction])
-> Arbitrary FederationRestriction
FederationRestriction -> [FederationRestriction]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen FederationRestriction
arbitrary :: Gen FederationRestriction
$cshrink :: FederationRestriction -> [FederationRestriction]
shrink :: FederationRestriction -> [FederationRestriction]
Arbitrary) via (GenericUniform FederationRestriction)

makePrisms ''FederationRestriction

data FederationRestrictionTag = FederationRestrictionAllowAllTag | FederationRestrictionByTeamTag
  deriving (FederationRestrictionTag -> FederationRestrictionTag -> Bool
(FederationRestrictionTag -> FederationRestrictionTag -> Bool)
-> (FederationRestrictionTag -> FederationRestrictionTag -> Bool)
-> Eq FederationRestrictionTag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationRestrictionTag -> FederationRestrictionTag -> Bool
== :: FederationRestrictionTag -> FederationRestrictionTag -> Bool
$c/= :: FederationRestrictionTag -> FederationRestrictionTag -> Bool
/= :: FederationRestrictionTag -> FederationRestrictionTag -> Bool
Eq, Int -> FederationRestrictionTag
FederationRestrictionTag -> Int
FederationRestrictionTag -> [FederationRestrictionTag]
FederationRestrictionTag -> FederationRestrictionTag
FederationRestrictionTag
-> FederationRestrictionTag -> [FederationRestrictionTag]
FederationRestrictionTag
-> FederationRestrictionTag
-> FederationRestrictionTag
-> [FederationRestrictionTag]
(FederationRestrictionTag -> FederationRestrictionTag)
-> (FederationRestrictionTag -> FederationRestrictionTag)
-> (Int -> FederationRestrictionTag)
-> (FederationRestrictionTag -> Int)
-> (FederationRestrictionTag -> [FederationRestrictionTag])
-> (FederationRestrictionTag
    -> FederationRestrictionTag -> [FederationRestrictionTag])
-> (FederationRestrictionTag
    -> FederationRestrictionTag -> [FederationRestrictionTag])
-> (FederationRestrictionTag
    -> FederationRestrictionTag
    -> FederationRestrictionTag
    -> [FederationRestrictionTag])
-> Enum FederationRestrictionTag
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FederationRestrictionTag -> FederationRestrictionTag
succ :: FederationRestrictionTag -> FederationRestrictionTag
$cpred :: FederationRestrictionTag -> FederationRestrictionTag
pred :: FederationRestrictionTag -> FederationRestrictionTag
$ctoEnum :: Int -> FederationRestrictionTag
toEnum :: Int -> FederationRestrictionTag
$cfromEnum :: FederationRestrictionTag -> Int
fromEnum :: FederationRestrictionTag -> Int
$cenumFrom :: FederationRestrictionTag -> [FederationRestrictionTag]
enumFrom :: FederationRestrictionTag -> [FederationRestrictionTag]
$cenumFromThen :: FederationRestrictionTag
-> FederationRestrictionTag -> [FederationRestrictionTag]
enumFromThen :: FederationRestrictionTag
-> FederationRestrictionTag -> [FederationRestrictionTag]
$cenumFromTo :: FederationRestrictionTag
-> FederationRestrictionTag -> [FederationRestrictionTag]
enumFromTo :: FederationRestrictionTag
-> FederationRestrictionTag -> [FederationRestrictionTag]
$cenumFromThenTo :: FederationRestrictionTag
-> FederationRestrictionTag
-> FederationRestrictionTag
-> [FederationRestrictionTag]
enumFromThenTo :: FederationRestrictionTag
-> FederationRestrictionTag
-> FederationRestrictionTag
-> [FederationRestrictionTag]
Enum, FederationRestrictionTag
FederationRestrictionTag
-> FederationRestrictionTag -> Bounded FederationRestrictionTag
forall a. a -> a -> Bounded a
$cminBound :: FederationRestrictionTag
minBound :: FederationRestrictionTag
$cmaxBound :: FederationRestrictionTag
maxBound :: FederationRestrictionTag
Bounded)

deriving via Schema FederationRestriction instance (S.ToSchema FederationRestriction)

deriving via Schema FederationRestriction instance (FromJSON FederationRestriction)

deriving via Schema FederationRestriction instance (ToJSON FederationRestriction)

tagSchema :: ValueSchema NamedSwaggerDoc FederationRestrictionTag
tagSchema :: ValueSchema NamedSwaggerDoc FederationRestrictionTag
tagSchema =
  forall v doc a b.
(With v, HasEnum v doc) =>
Text
-> SchemaP [Value] v (Alt Maybe v) a b
-> SchemaP doc Value Value a b
enum @Text Text
"FederationRestrictionTag" (SchemaP
   [Value]
   Text
   (Alt Maybe Text)
   FederationRestrictionTag
   FederationRestrictionTag
 -> ValueSchema NamedSwaggerDoc FederationRestrictionTag)
-> SchemaP
     [Value]
     Text
     (Alt Maybe Text)
     FederationRestrictionTag
     FederationRestrictionTag
-> ValueSchema NamedSwaggerDoc FederationRestrictionTag
forall a b. (a -> b) -> a -> b
$
    [SchemaP
   [Value]
   Text
   (Alt Maybe Text)
   FederationRestrictionTag
   FederationRestrictionTag]
-> SchemaP
     [Value]
     Text
     (Alt Maybe Text)
     FederationRestrictionTag
     FederationRestrictionTag
forall a. Monoid a => [a] -> a
mconcat [Text
-> FederationRestrictionTag
-> SchemaP
     [Value]
     Text
     (Alt Maybe Text)
     FederationRestrictionTag
     FederationRestrictionTag
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"allow_all" FederationRestrictionTag
FederationRestrictionAllowAllTag, Text
-> FederationRestrictionTag
-> SchemaP
     [Value]
     Text
     (Alt Maybe Text)
     FederationRestrictionTag
     FederationRestrictionTag
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"restrict_by_team" FederationRestrictionTag
FederationRestrictionByTeamTag]

instance ToSchema FederationRestriction where
  schema :: ValueSchema NamedSwaggerDoc FederationRestriction
schema =
    Text
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     FederationRestriction
-> ValueSchema NamedSwaggerDoc FederationRestriction
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
object Text
"FederationRestriction" (SchemaP
   SwaggerDoc
   Object
   [Pair]
   FederationRestriction
   FederationRestriction
 -> ValueSchema NamedSwaggerDoc FederationRestriction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     FederationRestriction
-> ValueSchema NamedSwaggerDoc FederationRestriction
forall a b. (a -> b) -> a -> b
$
      (FederationRestrictionTag, FederationRestriction)
-> FederationRestriction
fromTagged
        ((FederationRestrictionTag, FederationRestriction)
 -> FederationRestriction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     (FederationRestrictionTag, FederationRestriction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     FederationRestriction
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FederationRestriction
-> (FederationRestrictionTag, FederationRestriction)
toTagged
          (FederationRestriction
 -> (FederationRestrictionTag, FederationRestriction))
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (FederationRestrictionTag, FederationRestriction)
     (FederationRestrictionTag, FederationRestriction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     (FederationRestrictionTag, FederationRestriction)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP
  SwaggerDoc
  Object
  [Pair]
  (FederationRestrictionTag, FederationRestriction)
  FederationRestrictionTag
-> SchemaP
     SwaggerDoc
     (Object, FederationRestrictionTag)
     [Pair]
     (FederationRestrictionTag, FederationRestriction)
     FederationRestriction
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (FederationRestrictionTag, FederationRestriction)
     (FederationRestrictionTag, FederationRestriction)
forall d w v a b c.
(Monoid d, Monoid w) =>
SchemaP d v w a b
-> SchemaP d (v, b) w a c -> SchemaP d v w a (b, c)
bind
            ((FederationRestrictionTag, FederationRestriction)
-> FederationRestrictionTag
forall a b. (a, b) -> a
fst ((FederationRestrictionTag, FederationRestriction)
 -> FederationRestrictionTag)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestrictionTag
     FederationRestrictionTag
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     (FederationRestrictionTag, FederationRestriction)
     FederationRestrictionTag
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> ValueSchema NamedSwaggerDoc FederationRestrictionTag
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestrictionTag
     FederationRestrictionTag
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"tag" ValueSchema NamedSwaggerDoc FederationRestrictionTag
tagSchema)
            ((FederationRestrictionTag, FederationRestriction)
-> FederationRestriction
forall a b. (a, b) -> b
snd ((FederationRestrictionTag, FederationRestriction)
 -> FederationRestriction)
-> SchemaP
     SwaggerDoc
     (Object, FederationRestrictionTag)
     [Pair]
     FederationRestriction
     FederationRestriction
-> SchemaP
     SwaggerDoc
     (Object, FederationRestrictionTag)
     [Pair]
     (FederationRestrictionTag, FederationRestriction)
     FederationRestriction
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Lens
  (Object, FederationRestrictionTag)
  (Value, FederationRestrictionTag)
  Object
  Value
-> Text
-> SchemaP
     SwaggerDoc
     (Value, FederationRestrictionTag)
     Value
     FederationRestriction
     FederationRestriction
-> SchemaP
     SwaggerDoc
     (Object, FederationRestrictionTag)
     [Pair]
     FederationRestriction
     FederationRestriction
forall doc' doc v v' a b.
HasField doc' doc =>
Lens v v' Object Value
-> Text -> SchemaP doc' v' Value a b -> SchemaP doc v [Pair] a b
fieldOver (Object -> f Value)
-> (Object, FederationRestrictionTag)
-> f (Value, FederationRestrictionTag)
forall s t a b. Field1 s t a b => Lens s t a b
Lens
  (Object, FederationRestrictionTag)
  (Value, FederationRestrictionTag)
  Object
  Value
_1 Text
"value" SchemaP
  SwaggerDoc
  (Value, FederationRestrictionTag)
  Value
  FederationRestriction
  FederationRestriction
untaggedSchema)
    where
      toTagged :: FederationRestriction -> (FederationRestrictionTag, FederationRestriction)
      toTagged :: FederationRestriction
-> (FederationRestrictionTag, FederationRestriction)
toTagged d :: FederationRestriction
d@(FederationRestriction
FederationRestrictionAllowAll) = (FederationRestrictionTag
FederationRestrictionAllowAllTag, FederationRestriction
d)
      toTagged d :: FederationRestriction
d@(FederationRestrictionByTeam [TeamId]
_) = (FederationRestrictionTag
FederationRestrictionByTeamTag, FederationRestriction
d)

      fromTagged :: (FederationRestrictionTag, FederationRestriction) -> FederationRestriction
      fromTagged :: (FederationRestrictionTag, FederationRestriction)
-> FederationRestriction
fromTagged = (FederationRestrictionTag, FederationRestriction)
-> FederationRestriction
forall a b. (a, b) -> b
snd

      untaggedSchema :: SchemaP
  SwaggerDoc
  (Value, FederationRestrictionTag)
  Value
  FederationRestriction
  FederationRestriction
untaggedSchema = (FederationRestrictionTag
 -> SchemaP
      SwaggerDoc Value Value FederationRestriction FederationRestriction)
-> SchemaP
     SwaggerDoc
     (Value, FederationRestrictionTag)
     Value
     FederationRestriction
     FederationRestriction
forall t d v w a b.
(Bounded t, Enum t, Monoid d) =>
(t -> SchemaP d v w a b) -> SchemaP d (v, t) w a b
dispatch ((FederationRestrictionTag
  -> SchemaP
       SwaggerDoc Value Value FederationRestriction FederationRestriction)
 -> SchemaP
      SwaggerDoc
      (Value, FederationRestrictionTag)
      Value
      FederationRestriction
      FederationRestriction)
-> (FederationRestrictionTag
    -> SchemaP
         SwaggerDoc Value Value FederationRestriction FederationRestriction)
-> SchemaP
     SwaggerDoc
     (Value, FederationRestrictionTag)
     Value
     FederationRestriction
     FederationRestriction
forall a b. (a -> b) -> a -> b
$ \case
        FederationRestrictionTag
FederationRestrictionAllowAllTag -> Prism' FederationRestriction ()
-> SchemaP SwaggerDoc Value Value () ()
-> SchemaP
     SwaggerDoc Value Value FederationRestriction FederationRestriction
forall b b' a a' ss v m.
Prism b b' a a' -> SchemaP ss v m a a' -> SchemaP ss v m b b'
tag p () (f ()) -> p FederationRestriction (f FederationRestriction)
Prism' FederationRestriction ()
_FederationRestrictionAllowAll SchemaP SwaggerDoc Value Value () ()
forall d. Monoid d => ValueSchemaP d () ()
null_
        FederationRestrictionTag
FederationRestrictionByTeamTag -> Prism' FederationRestriction [TeamId]
-> SchemaP SwaggerDoc Value Value [TeamId] [TeamId]
-> SchemaP
     SwaggerDoc Value Value FederationRestriction FederationRestriction
forall b b' a a' ss v m.
Prism b b' a a' -> SchemaP ss v m a a' -> SchemaP ss v m b b'
tag p [TeamId] (f [TeamId])
-> p FederationRestriction (f FederationRestriction)
Prism' FederationRestriction [TeamId]
_FederationRestrictionByTeam (ValueSchema NamedSwaggerDoc TeamId
-> SchemaP SwaggerDoc Value Value [TeamId] [TeamId]
forall ndoc doc a.
(HasArray ndoc doc, HasName ndoc) =>
ValueSchema ndoc a -> ValueSchema doc [a]
array ValueSchema NamedSwaggerDoc TeamId
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)

-- | Everything we need to know about a remote instance in order to federate with it.  Comes
-- in `AllowedDomains` if `AllowStrategy` is `AllowDynamic`.  If `AllowAll`, we still use this
-- information for search policy.
data FederationDomainConfig = FederationDomainConfig
  { FederationDomainConfig -> Domain
domain :: Domain,
    FederationDomainConfig -> FederatedUserSearchPolicy
searchPolicy :: FederatedUserSearchPolicy,
    FederationDomainConfig -> FederationRestriction
restriction :: FederationRestriction
  }
  deriving (FederationDomainConfig -> FederationDomainConfig -> Bool
(FederationDomainConfig -> FederationDomainConfig -> Bool)
-> (FederationDomainConfig -> FederationDomainConfig -> Bool)
-> Eq FederationDomainConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationDomainConfig -> FederationDomainConfig -> Bool
== :: FederationDomainConfig -> FederationDomainConfig -> Bool
$c/= :: FederationDomainConfig -> FederationDomainConfig -> Bool
/= :: FederationDomainConfig -> FederationDomainConfig -> Bool
Eq, Eq FederationDomainConfig
Eq FederationDomainConfig =>
(FederationDomainConfig -> FederationDomainConfig -> Ordering)
-> (FederationDomainConfig -> FederationDomainConfig -> Bool)
-> (FederationDomainConfig -> FederationDomainConfig -> Bool)
-> (FederationDomainConfig -> FederationDomainConfig -> Bool)
-> (FederationDomainConfig -> FederationDomainConfig -> Bool)
-> (FederationDomainConfig
    -> FederationDomainConfig -> FederationDomainConfig)
-> (FederationDomainConfig
    -> FederationDomainConfig -> FederationDomainConfig)
-> Ord FederationDomainConfig
FederationDomainConfig -> FederationDomainConfig -> Bool
FederationDomainConfig -> FederationDomainConfig -> Ordering
FederationDomainConfig
-> FederationDomainConfig -> FederationDomainConfig
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FederationDomainConfig -> FederationDomainConfig -> Ordering
compare :: FederationDomainConfig -> FederationDomainConfig -> Ordering
$c< :: FederationDomainConfig -> FederationDomainConfig -> Bool
< :: FederationDomainConfig -> FederationDomainConfig -> Bool
$c<= :: FederationDomainConfig -> FederationDomainConfig -> Bool
<= :: FederationDomainConfig -> FederationDomainConfig -> Bool
$c> :: FederationDomainConfig -> FederationDomainConfig -> Bool
> :: FederationDomainConfig -> FederationDomainConfig -> Bool
$c>= :: FederationDomainConfig -> FederationDomainConfig -> Bool
>= :: FederationDomainConfig -> FederationDomainConfig -> Bool
$cmax :: FederationDomainConfig
-> FederationDomainConfig -> FederationDomainConfig
max :: FederationDomainConfig
-> FederationDomainConfig -> FederationDomainConfig
$cmin :: FederationDomainConfig
-> FederationDomainConfig -> FederationDomainConfig
min :: FederationDomainConfig
-> FederationDomainConfig -> FederationDomainConfig
Ord, Int -> FederationDomainConfig -> ShowS
[FederationDomainConfig] -> ShowS
FederationDomainConfig -> String
(Int -> FederationDomainConfig -> ShowS)
-> (FederationDomainConfig -> String)
-> ([FederationDomainConfig] -> ShowS)
-> Show FederationDomainConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FederationDomainConfig -> ShowS
showsPrec :: Int -> FederationDomainConfig -> ShowS
$cshow :: FederationDomainConfig -> String
show :: FederationDomainConfig -> String
$cshowList :: [FederationDomainConfig] -> ShowS
showList :: [FederationDomainConfig] -> ShowS
Show, (forall x. FederationDomainConfig -> Rep FederationDomainConfig x)
-> (forall x.
    Rep FederationDomainConfig x -> FederationDomainConfig)
-> Generic FederationDomainConfig
forall x. Rep FederationDomainConfig x -> FederationDomainConfig
forall x. FederationDomainConfig -> Rep FederationDomainConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FederationDomainConfig -> Rep FederationDomainConfig x
from :: forall x. FederationDomainConfig -> Rep FederationDomainConfig x
$cto :: forall x. Rep FederationDomainConfig x -> FederationDomainConfig
to :: forall x. Rep FederationDomainConfig x -> FederationDomainConfig
Generic)
  deriving ([FederationDomainConfig] -> Value
[FederationDomainConfig] -> Encoding
FederationDomainConfig -> Value
FederationDomainConfig -> Encoding
(FederationDomainConfig -> Value)
-> (FederationDomainConfig -> Encoding)
-> ([FederationDomainConfig] -> Value)
-> ([FederationDomainConfig] -> Encoding)
-> ToJSON FederationDomainConfig
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: FederationDomainConfig -> Value
toJSON :: FederationDomainConfig -> Value
$ctoEncoding :: FederationDomainConfig -> Encoding
toEncoding :: FederationDomainConfig -> Encoding
$ctoJSONList :: [FederationDomainConfig] -> Value
toJSONList :: [FederationDomainConfig] -> Value
$ctoEncodingList :: [FederationDomainConfig] -> Encoding
toEncodingList :: [FederationDomainConfig] -> Encoding
ToJSON, Value -> Parser [FederationDomainConfig]
Value -> Parser FederationDomainConfig
(Value -> Parser FederationDomainConfig)
-> (Value -> Parser [FederationDomainConfig])
-> FromJSON FederationDomainConfig
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser FederationDomainConfig
parseJSON :: Value -> Parser FederationDomainConfig
$cparseJSONList :: Value -> Parser [FederationDomainConfig]
parseJSONList :: Value -> Parser [FederationDomainConfig]
FromJSON, Typeable FederationDomainConfig
Typeable FederationDomainConfig =>
(Proxy FederationDomainConfig
 -> Declare (Definitions Schema) NamedSchema)
-> ToSchema FederationDomainConfig
Proxy FederationDomainConfig
-> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy FederationDomainConfig
-> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy FederationDomainConfig
-> Declare (Definitions Schema) NamedSchema
S.ToSchema) via Schema FederationDomainConfig
  deriving (Gen FederationDomainConfig
Gen FederationDomainConfig
-> (FederationDomainConfig -> [FederationDomainConfig])
-> Arbitrary FederationDomainConfig
FederationDomainConfig -> [FederationDomainConfig]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen FederationDomainConfig
arbitrary :: Gen FederationDomainConfig
$cshrink :: FederationDomainConfig -> [FederationDomainConfig]
shrink :: FederationDomainConfig -> [FederationDomainConfig]
Arbitrary) via (GenericUniform FederationDomainConfig)

instance ToSchema FederationDomainConfig where
  schema :: ValueSchema NamedSwaggerDoc FederationDomainConfig
schema =
    Text
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederationDomainConfig
-> ValueSchema NamedSwaggerDoc FederationDomainConfig
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
object Text
"FederationDomainConfig" (SchemaP
   SwaggerDoc
   Object
   [Pair]
   FederationDomainConfig
   FederationDomainConfig
 -> ValueSchema NamedSwaggerDoc FederationDomainConfig)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederationDomainConfig
-> ValueSchema NamedSwaggerDoc FederationDomainConfig
forall a b. (a -> b) -> a -> b
$
      Domain
-> FederatedUserSearchPolicy
-> FederationRestriction
-> FederationDomainConfig
FederationDomainConfig
        (Domain
 -> FederatedUserSearchPolicy
 -> FederationRestriction
 -> FederationDomainConfig)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig Domain
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     (FederatedUserSearchPolicy
      -> FederationRestriction -> FederationDomainConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FederationDomainConfig -> Domain
domain (FederationDomainConfig -> Domain)
-> SchemaP SwaggerDoc Object [Pair] Domain Domain
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig Domain
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Domain Domain
-> SchemaP SwaggerDoc Object [Pair] Domain Domain
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"domain" SchemaP NamedSwaggerDoc Value Value Domain Domain
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  FederationDomainConfig
  (FederatedUserSearchPolicy
   -> FederationRestriction -> FederationDomainConfig)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederatedUserSearchPolicy
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     (FederationRestriction -> FederationDomainConfig)
forall a b.
SchemaP SwaggerDoc Object [Pair] FederationDomainConfig (a -> b)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig a
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FederationDomainConfig -> FederatedUserSearchPolicy
searchPolicy (FederationDomainConfig -> FederatedUserSearchPolicy)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederatedUserSearchPolicy
     FederatedUserSearchPolicy
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederatedUserSearchPolicy
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP
     NamedSwaggerDoc
     Value
     Value
     FederatedUserSearchPolicy
     FederatedUserSearchPolicy
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederatedUserSearchPolicy
     FederatedUserSearchPolicy
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"search_policy" SchemaP
  NamedSwaggerDoc
  Value
  Value
  FederatedUserSearchPolicy
  FederatedUserSearchPolicy
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  FederationDomainConfig
  (FederationRestriction -> FederationDomainConfig)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederationRestriction
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederationDomainConfig
forall a b.
SchemaP SwaggerDoc Object [Pair] FederationDomainConfig (a -> b)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig a
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfig b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FederationDomainConfig -> FederationRestriction
restriction (FederationDomainConfig -> FederationRestriction)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     FederationRestriction
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfig
     FederationRestriction
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> ValueSchema NamedSwaggerDoc FederationRestriction
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationRestriction
     FederationRestriction
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"restriction" ValueSchema NamedSwaggerDoc FederationRestriction
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema

data FederationDomainConfigs = FederationDomainConfigs
  { FederationDomainConfigs -> FederationStrategy
strategy :: FederationStrategy,
    FederationDomainConfigs -> [FederationDomainConfig]
remotes :: [FederationDomainConfig],
    FederationDomainConfigs -> Int
updateInterval :: Int
  }
  deriving (Int -> FederationDomainConfigs -> ShowS
[FederationDomainConfigs] -> ShowS
FederationDomainConfigs -> String
(Int -> FederationDomainConfigs -> ShowS)
-> (FederationDomainConfigs -> String)
-> ([FederationDomainConfigs] -> ShowS)
-> Show FederationDomainConfigs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FederationDomainConfigs -> ShowS
showsPrec :: Int -> FederationDomainConfigs -> ShowS
$cshow :: FederationDomainConfigs -> String
show :: FederationDomainConfigs -> String
$cshowList :: [FederationDomainConfigs] -> ShowS
showList :: [FederationDomainConfigs] -> ShowS
Show, (forall x.
 FederationDomainConfigs -> Rep FederationDomainConfigs x)
-> (forall x.
    Rep FederationDomainConfigs x -> FederationDomainConfigs)
-> Generic FederationDomainConfigs
forall x. Rep FederationDomainConfigs x -> FederationDomainConfigs
forall x. FederationDomainConfigs -> Rep FederationDomainConfigs x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FederationDomainConfigs -> Rep FederationDomainConfigs x
from :: forall x. FederationDomainConfigs -> Rep FederationDomainConfigs x
$cto :: forall x. Rep FederationDomainConfigs x -> FederationDomainConfigs
to :: forall x. Rep FederationDomainConfigs x -> FederationDomainConfigs
Generic, FederationDomainConfigs -> FederationDomainConfigs -> Bool
(FederationDomainConfigs -> FederationDomainConfigs -> Bool)
-> (FederationDomainConfigs -> FederationDomainConfigs -> Bool)
-> Eq FederationDomainConfigs
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationDomainConfigs -> FederationDomainConfigs -> Bool
== :: FederationDomainConfigs -> FederationDomainConfigs -> Bool
$c/= :: FederationDomainConfigs -> FederationDomainConfigs -> Bool
/= :: FederationDomainConfigs -> FederationDomainConfigs -> Bool
Eq)
  deriving ([FederationDomainConfigs] -> Value
[FederationDomainConfigs] -> Encoding
FederationDomainConfigs -> Value
FederationDomainConfigs -> Encoding
(FederationDomainConfigs -> Value)
-> (FederationDomainConfigs -> Encoding)
-> ([FederationDomainConfigs] -> Value)
-> ([FederationDomainConfigs] -> Encoding)
-> ToJSON FederationDomainConfigs
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: FederationDomainConfigs -> Value
toJSON :: FederationDomainConfigs -> Value
$ctoEncoding :: FederationDomainConfigs -> Encoding
toEncoding :: FederationDomainConfigs -> Encoding
$ctoJSONList :: [FederationDomainConfigs] -> Value
toJSONList :: [FederationDomainConfigs] -> Value
$ctoEncodingList :: [FederationDomainConfigs] -> Encoding
toEncodingList :: [FederationDomainConfigs] -> Encoding
ToJSON, Value -> Parser [FederationDomainConfigs]
Value -> Parser FederationDomainConfigs
(Value -> Parser FederationDomainConfigs)
-> (Value -> Parser [FederationDomainConfigs])
-> FromJSON FederationDomainConfigs
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser FederationDomainConfigs
parseJSON :: Value -> Parser FederationDomainConfigs
$cparseJSONList :: Value -> Parser [FederationDomainConfigs]
parseJSONList :: Value -> Parser [FederationDomainConfigs]
FromJSON, Typeable FederationDomainConfigs
Typeable FederationDomainConfigs =>
(Proxy FederationDomainConfigs
 -> Declare (Definitions Schema) NamedSchema)
-> ToSchema FederationDomainConfigs
Proxy FederationDomainConfigs
-> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy FederationDomainConfigs
-> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy FederationDomainConfigs
-> Declare (Definitions Schema) NamedSchema
S.ToSchema) via Schema FederationDomainConfigs
  deriving (Gen FederationDomainConfigs
Gen FederationDomainConfigs
-> (FederationDomainConfigs -> [FederationDomainConfigs])
-> Arbitrary FederationDomainConfigs
FederationDomainConfigs -> [FederationDomainConfigs]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen FederationDomainConfigs
arbitrary :: Gen FederationDomainConfigs
$cshrink :: FederationDomainConfigs -> [FederationDomainConfigs]
shrink :: FederationDomainConfigs -> [FederationDomainConfigs]
Arbitrary) via (GenericUniform FederationDomainConfigs)

defFederationDomainConfigs :: FederationDomainConfigs
defFederationDomainConfigs :: FederationDomainConfigs
defFederationDomainConfigs =
  FederationDomainConfigs
    { $sel:strategy:FederationDomainConfigs :: FederationStrategy
strategy = FederationStrategy
AllowNone,
      $sel:remotes:FederationDomainConfigs :: [FederationDomainConfig]
remotes = [],
      $sel:updateInterval:FederationDomainConfigs :: Int
updateInterval = Int
10
    }

instance ToSchema FederationDomainConfigs where
  schema :: ValueSchema NamedSwaggerDoc FederationDomainConfigs
schema =
    Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> ObjectSchema SwaggerDoc FederationDomainConfigs
-> ValueSchema NamedSwaggerDoc FederationDomainConfigs
forall doc doc' a.
HasObject doc doc' =>
Text -> (doc' -> doc') -> ObjectSchema doc a -> ValueSchema doc' a
objectWithDocModifier
      Text
"FederationDomainConfigs"
      ((Maybe Text -> Identity (Maybe Text))
-> NamedSwaggerDoc -> Identity NamedSwaggerDoc
forall s a. HasDescription s a => Lens' s a
Lens' NamedSwaggerDoc (Maybe Text)
description ((Maybe Text -> Identity (Maybe Text))
 -> NamedSwaggerDoc -> Identity NamedSwaggerDoc)
-> Text -> NamedSwaggerDoc -> NamedSwaggerDoc
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Text
"See https://docs.wire.com/understand/federation/backend-communication.html#configuring-remote-connections.")
      (ObjectSchema SwaggerDoc FederationDomainConfigs
 -> ValueSchema NamedSwaggerDoc FederationDomainConfigs)
-> ObjectSchema SwaggerDoc FederationDomainConfigs
-> ValueSchema NamedSwaggerDoc FederationDomainConfigs
forall a b. (a -> b) -> a -> b
$ FederationStrategy
-> [FederationDomainConfig] -> Int -> FederationDomainConfigs
FederationDomainConfigs
        (FederationStrategy
 -> [FederationDomainConfig] -> Int -> FederationDomainConfigs)
-> SchemaP
     SwaggerDoc Object [Pair] FederationDomainConfigs FederationStrategy
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfigs
     ([FederationDomainConfig] -> Int -> FederationDomainConfigs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FederationDomainConfigs -> FederationStrategy
strategy (FederationDomainConfigs -> FederationStrategy)
-> SchemaP
     SwaggerDoc Object [Pair] FederationStrategy FederationStrategy
-> SchemaP
     SwaggerDoc Object [Pair] FederationDomainConfigs FederationStrategy
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP
     NamedSwaggerDoc Value Value FederationStrategy FederationStrategy
-> SchemaP
     SwaggerDoc Object [Pair] FederationStrategy FederationStrategy
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"strategy" SchemaP
  NamedSwaggerDoc Value Value FederationStrategy FederationStrategy
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  FederationDomainConfigs
  ([FederationDomainConfig] -> Int -> FederationDomainConfigs)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfigs
     [FederationDomainConfig]
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfigs
     (Int -> FederationDomainConfigs)
forall a b.
SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs (a -> b)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs a
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FederationDomainConfigs -> [FederationDomainConfig]
remotes (FederationDomainConfigs -> [FederationDomainConfig])
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     [FederationDomainConfig]
     [FederationDomainConfig]
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     FederationDomainConfigs
     [FederationDomainConfig]
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP
     SwaggerDoc
     Value
     Value
     [FederationDomainConfig]
     [FederationDomainConfig]
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     [FederationDomainConfig]
     [FederationDomainConfig]
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"remotes" (ValueSchema NamedSwaggerDoc FederationDomainConfig
-> SchemaP
     SwaggerDoc
     Value
     Value
     [FederationDomainConfig]
     [FederationDomainConfig]
forall ndoc doc a.
(HasArray ndoc doc, HasName ndoc) =>
ValueSchema ndoc a -> ValueSchema doc [a]
array ValueSchema NamedSwaggerDoc FederationDomainConfig
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  FederationDomainConfigs
  (Int -> FederationDomainConfigs)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs Int
-> ObjectSchema SwaggerDoc FederationDomainConfigs
forall a b.
SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs (a -> b)
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs a
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FederationDomainConfigs -> Int
updateInterval (FederationDomainConfigs -> Int)
-> SchemaP SwaggerDoc Object [Pair] Int Int
-> SchemaP SwaggerDoc Object [Pair] FederationDomainConfigs Int
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> SchemaP NamedSwaggerDoc Value Value Int Int
-> SchemaP SwaggerDoc Object [Pair] Int Int
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"update_interval" SchemaP NamedSwaggerDoc Value Value Int Int
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema

data FederationStrategy
  = -- | Disable federation.
    AllowNone
  | -- | Allow any backend that asks.
    AllowAll
  | -- | Any backend explicitly configured in table `brig.federation_remotes` (if that table
    -- is empty, this is the same as `AllowNone`).
    AllowDynamic
  deriving (FederationStrategy -> FederationStrategy -> Bool
(FederationStrategy -> FederationStrategy -> Bool)
-> (FederationStrategy -> FederationStrategy -> Bool)
-> Eq FederationStrategy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationStrategy -> FederationStrategy -> Bool
== :: FederationStrategy -> FederationStrategy -> Bool
$c/= :: FederationStrategy -> FederationStrategy -> Bool
/= :: FederationStrategy -> FederationStrategy -> Bool
Eq, Int -> FederationStrategy -> ShowS
[FederationStrategy] -> ShowS
FederationStrategy -> String
(Int -> FederationStrategy -> ShowS)
-> (FederationStrategy -> String)
-> ([FederationStrategy] -> ShowS)
-> Show FederationStrategy
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FederationStrategy -> ShowS
showsPrec :: Int -> FederationStrategy -> ShowS
$cshow :: FederationStrategy -> String
show :: FederationStrategy -> String
$cshowList :: [FederationStrategy] -> ShowS
showList :: [FederationStrategy] -> ShowS
Show, (forall x. FederationStrategy -> Rep FederationStrategy x)
-> (forall x. Rep FederationStrategy x -> FederationStrategy)
-> Generic FederationStrategy
forall x. Rep FederationStrategy x -> FederationStrategy
forall x. FederationStrategy -> Rep FederationStrategy x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FederationStrategy -> Rep FederationStrategy x
from :: forall x. FederationStrategy -> Rep FederationStrategy x
$cto :: forall x. Rep FederationStrategy x -> FederationStrategy
to :: forall x. Rep FederationStrategy x -> FederationStrategy
Generic)
  deriving ([FederationStrategy] -> Value
[FederationStrategy] -> Encoding
FederationStrategy -> Value
FederationStrategy -> Encoding
(FederationStrategy -> Value)
-> (FederationStrategy -> Encoding)
-> ([FederationStrategy] -> Value)
-> ([FederationStrategy] -> Encoding)
-> ToJSON FederationStrategy
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: FederationStrategy -> Value
toJSON :: FederationStrategy -> Value
$ctoEncoding :: FederationStrategy -> Encoding
toEncoding :: FederationStrategy -> Encoding
$ctoJSONList :: [FederationStrategy] -> Value
toJSONList :: [FederationStrategy] -> Value
$ctoEncodingList :: [FederationStrategy] -> Encoding
toEncodingList :: [FederationStrategy] -> Encoding
ToJSON, Value -> Parser [FederationStrategy]
Value -> Parser FederationStrategy
(Value -> Parser FederationStrategy)
-> (Value -> Parser [FederationStrategy])
-> FromJSON FederationStrategy
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser FederationStrategy
parseJSON :: Value -> Parser FederationStrategy
$cparseJSONList :: Value -> Parser [FederationStrategy]
parseJSONList :: Value -> Parser [FederationStrategy]
FromJSON, Typeable FederationStrategy
Typeable FederationStrategy =>
(Proxy FederationStrategy
 -> Declare (Definitions Schema) NamedSchema)
-> ToSchema FederationStrategy
Proxy FederationStrategy
-> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy FederationStrategy
-> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy FederationStrategy
-> Declare (Definitions Schema) NamedSchema
S.ToSchema) via Schema FederationStrategy
  deriving (Gen FederationStrategy
Gen FederationStrategy
-> (FederationStrategy -> [FederationStrategy])
-> Arbitrary FederationStrategy
FederationStrategy -> [FederationStrategy]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen FederationStrategy
arbitrary :: Gen FederationStrategy
$cshrink :: FederationStrategy -> [FederationStrategy]
shrink :: FederationStrategy -> [FederationStrategy]
Arbitrary) via (GenericUniform FederationStrategy)

instance ToSchema FederationStrategy where
  schema :: SchemaP
  NamedSwaggerDoc Value Value FederationStrategy FederationStrategy
schema =
    forall v doc a b.
(With v, HasEnum v doc) =>
Text
-> SchemaP [Value] v (Alt Maybe v) a b
-> SchemaP doc Value Value a b
enum @Text Text
"FederationStrategy" (SchemaP
   [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
 -> SchemaP
      NamedSwaggerDoc Value Value FederationStrategy FederationStrategy)
-> SchemaP
     [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
-> SchemaP
     NamedSwaggerDoc Value Value FederationStrategy FederationStrategy
forall a b. (a -> b) -> a -> b
$
      [SchemaP
   [Value]
   Text
   (Alt Maybe Text)
   FederationStrategy
   FederationStrategy]
-> SchemaP
     [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
forall a. Monoid a => [a] -> a
mconcat
        [ Text
-> FederationStrategy
-> SchemaP
     [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"allowNone" FederationStrategy
AllowNone,
          Text
-> FederationStrategy
-> SchemaP
     [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"allowAll" FederationStrategy
AllowAll,
          Text
-> FederationStrategy
-> SchemaP
     [Value] Text (Alt Maybe Text) FederationStrategy FederationStrategy
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"allowDynamic" FederationStrategy
AllowDynamic
        ]

newtype FederationRemoteTeam = FederationRemoteTeam
  { FederationRemoteTeam -> TeamId
teamId :: TeamId
  }
  deriving (FederationRemoteTeam -> FederationRemoteTeam -> Bool
(FederationRemoteTeam -> FederationRemoteTeam -> Bool)
-> (FederationRemoteTeam -> FederationRemoteTeam -> Bool)
-> Eq FederationRemoteTeam
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FederationRemoteTeam -> FederationRemoteTeam -> Bool
== :: FederationRemoteTeam -> FederationRemoteTeam -> Bool
$c/= :: FederationRemoteTeam -> FederationRemoteTeam -> Bool
/= :: FederationRemoteTeam -> FederationRemoteTeam -> Bool
Eq, Int -> FederationRemoteTeam -> ShowS
[FederationRemoteTeam] -> ShowS
FederationRemoteTeam -> String
(Int -> FederationRemoteTeam -> ShowS)
-> (FederationRemoteTeam -> String)
-> ([FederationRemoteTeam] -> ShowS)
-> Show FederationRemoteTeam
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FederationRemoteTeam -> ShowS
showsPrec :: Int -> FederationRemoteTeam -> ShowS
$cshow :: FederationRemoteTeam -> String
show :: FederationRemoteTeam -> String
$cshowList :: [FederationRemoteTeam] -> ShowS
showList :: [FederationRemoteTeam] -> ShowS
Show, (forall x. FederationRemoteTeam -> Rep FederationRemoteTeam x)
-> (forall x. Rep FederationRemoteTeam x -> FederationRemoteTeam)
-> Generic FederationRemoteTeam
forall x. Rep FederationRemoteTeam x -> FederationRemoteTeam
forall x. FederationRemoteTeam -> Rep FederationRemoteTeam x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FederationRemoteTeam -> Rep FederationRemoteTeam x
from :: forall x. FederationRemoteTeam -> Rep FederationRemoteTeam x
$cto :: forall x. Rep FederationRemoteTeam x -> FederationRemoteTeam
to :: forall x. Rep FederationRemoteTeam x -> FederationRemoteTeam
Generic)
  deriving ([FederationRemoteTeam] -> Value
[FederationRemoteTeam] -> Encoding
FederationRemoteTeam -> Value
FederationRemoteTeam -> Encoding
(FederationRemoteTeam -> Value)
-> (FederationRemoteTeam -> Encoding)
-> ([FederationRemoteTeam] -> Value)
-> ([FederationRemoteTeam] -> Encoding)
-> ToJSON FederationRemoteTeam
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: FederationRemoteTeam -> Value
toJSON :: FederationRemoteTeam -> Value
$ctoEncoding :: FederationRemoteTeam -> Encoding
toEncoding :: FederationRemoteTeam -> Encoding
$ctoJSONList :: [FederationRemoteTeam] -> Value
toJSONList :: [FederationRemoteTeam] -> Value
$ctoEncodingList :: [FederationRemoteTeam] -> Encoding
toEncodingList :: [FederationRemoteTeam] -> Encoding
ToJSON, Value -> Parser [FederationRemoteTeam]
Value -> Parser FederationRemoteTeam
(Value -> Parser FederationRemoteTeam)
-> (Value -> Parser [FederationRemoteTeam])
-> FromJSON FederationRemoteTeam
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser FederationRemoteTeam
parseJSON :: Value -> Parser FederationRemoteTeam
$cparseJSONList :: Value -> Parser [FederationRemoteTeam]
parseJSONList :: Value -> Parser [FederationRemoteTeam]
FromJSON, Typeable FederationRemoteTeam
Typeable FederationRemoteTeam =>
(Proxy FederationRemoteTeam
 -> Declare (Definitions Schema) NamedSchema)
-> ToSchema FederationRemoteTeam
Proxy FederationRemoteTeam
-> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy FederationRemoteTeam
-> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy FederationRemoteTeam
-> Declare (Definitions Schema) NamedSchema
S.ToSchema) via Schema FederationRemoteTeam
  deriving (Gen FederationRemoteTeam
Gen FederationRemoteTeam
-> (FederationRemoteTeam -> [FederationRemoteTeam])
-> Arbitrary FederationRemoteTeam
FederationRemoteTeam -> [FederationRemoteTeam]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen FederationRemoteTeam
arbitrary :: Gen FederationRemoteTeam
$cshrink :: FederationRemoteTeam -> [FederationRemoteTeam]
shrink :: FederationRemoteTeam -> [FederationRemoteTeam]
Arbitrary) via (GenericUniform FederationRemoteTeam)

instance ToSchema FederationRemoteTeam where
  schema :: ValueSchema NamedSwaggerDoc FederationRemoteTeam
schema =
    Text
-> SchemaP
     SwaggerDoc Object [Pair] FederationRemoteTeam FederationRemoteTeam
-> ValueSchema NamedSwaggerDoc FederationRemoteTeam
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
object Text
"FederationRemoteTeam" (SchemaP
   SwaggerDoc Object [Pair] FederationRemoteTeam FederationRemoteTeam
 -> ValueSchema NamedSwaggerDoc FederationRemoteTeam)
-> SchemaP
     SwaggerDoc Object [Pair] FederationRemoteTeam FederationRemoteTeam
-> ValueSchema NamedSwaggerDoc FederationRemoteTeam
forall a b. (a -> b) -> a -> b
$
      TeamId -> FederationRemoteTeam
FederationRemoteTeam
        (TeamId -> FederationRemoteTeam)
-> SchemaP SwaggerDoc Object [Pair] FederationRemoteTeam TeamId
-> SchemaP
     SwaggerDoc Object [Pair] FederationRemoteTeam FederationRemoteTeam
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FederationRemoteTeam -> TeamId
teamId (FederationRemoteTeam -> TeamId)
-> SchemaP SwaggerDoc Object [Pair] TeamId TeamId
-> SchemaP SwaggerDoc Object [Pair] FederationRemoteTeam TeamId
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> ValueSchema NamedSwaggerDoc TeamId
-> SchemaP SwaggerDoc Object [Pair] TeamId TeamId
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
field Text
"team_id" ValueSchema NamedSwaggerDoc TeamId
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema