-- 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/>.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

module Wire.API.Routes.Internal.Galley.TeamsIntra
  ( TeamStatus (..),
    TeamData (..),
    TeamStatusUpdate (..),
    TeamName (..),
    GuardLegalholdPolicyConflicts (..),
  )
where

import Control.Lens ((?~))
import Data.Aeson
import Data.Currency qualified as Currency
import Data.Json.Util
import Data.OpenApi qualified as Swagger
import Data.Schema qualified as S
import Data.Time (UTCTime)
import Imports
import Test.QuickCheck.Arbitrary (Arbitrary)
import Wire.API.Message (UserClients)
import Wire.API.Team (Team)
import Wire.API.Team.LegalHold (LegalholdProtectee)
import Wire.Arbitrary (GenericUniform (..))

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

instance S.ToSchema TeamStatus where
  schema :: ValueSchema NamedSwaggerDoc TeamStatus
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
S.enum @Text Text
"Access" (SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
 -> ValueSchema NamedSwaggerDoc TeamStatus)
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
-> ValueSchema NamedSwaggerDoc TeamStatus
forall a b. (a -> b) -> a -> b
$
      [SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus]
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a. Monoid a => [a] -> a
mconcat
        [ Text
-> TeamStatus
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
S.element Text
"active" TeamStatus
Active,
          Text
-> TeamStatus
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
S.element Text
"pending_delete" TeamStatus
PendingDelete,
          Text
-> TeamStatus
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
S.element Text
"deleted" TeamStatus
Deleted,
          Text
-> TeamStatus
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
S.element Text
"suspended" TeamStatus
Suspended,
          Text
-> TeamStatus
-> SchemaP [Value] Text (Alt Maybe Text) TeamStatus TeamStatus
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
S.element Text
"pending_active" TeamStatus
PendingActive
        ]

data TeamData = TeamData
  { TeamData -> Team
tdTeam :: !Team,
    TeamData -> TeamStatus
tdStatus :: !TeamStatus,
    TeamData -> Maybe UTCTime
tdStatusTime :: !(Maybe UTCTime) -- This needs to be a Maybe due to backwards compatibility
  }
  deriving (TeamData -> TeamData -> Bool
(TeamData -> TeamData -> Bool)
-> (TeamData -> TeamData -> Bool) -> Eq TeamData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TeamData -> TeamData -> Bool
== :: TeamData -> TeamData -> Bool
$c/= :: TeamData -> TeamData -> Bool
/= :: TeamData -> TeamData -> Bool
Eq, Int -> TeamData -> ShowS
[TeamData] -> ShowS
TeamData -> String
(Int -> TeamData -> ShowS)
-> (TeamData -> String) -> ([TeamData] -> ShowS) -> Show TeamData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TeamData -> ShowS
showsPrec :: Int -> TeamData -> ShowS
$cshow :: TeamData -> String
show :: TeamData -> String
$cshowList :: [TeamData] -> ShowS
showList :: [TeamData] -> ShowS
Show, (forall x. TeamData -> Rep TeamData x)
-> (forall x. Rep TeamData x -> TeamData) -> Generic TeamData
forall x. Rep TeamData x -> TeamData
forall x. TeamData -> Rep TeamData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TeamData -> Rep TeamData x
from :: forall x. TeamData -> Rep TeamData x
$cto :: forall x. Rep TeamData x -> TeamData
to :: forall x. Rep TeamData x -> TeamData
Generic)
  deriving (Gen TeamData
Gen TeamData -> (TeamData -> [TeamData]) -> Arbitrary TeamData
TeamData -> [TeamData]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen TeamData
arbitrary :: Gen TeamData
$cshrink :: TeamData -> [TeamData]
shrink :: TeamData -> [TeamData]
Arbitrary) via GenericUniform TeamData
  deriving ([TeamData] -> Value
[TeamData] -> Encoding
TeamData -> Value
TeamData -> Encoding
(TeamData -> Value)
-> (TeamData -> Encoding)
-> ([TeamData] -> Value)
-> ([TeamData] -> Encoding)
-> ToJSON TeamData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: TeamData -> Value
toJSON :: TeamData -> Value
$ctoEncoding :: TeamData -> Encoding
toEncoding :: TeamData -> Encoding
$ctoJSONList :: [TeamData] -> Value
toJSONList :: [TeamData] -> Value
$ctoEncodingList :: [TeamData] -> Encoding
toEncodingList :: [TeamData] -> Encoding
ToJSON, Value -> Parser [TeamData]
Value -> Parser TeamData
(Value -> Parser TeamData)
-> (Value -> Parser [TeamData]) -> FromJSON TeamData
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser TeamData
parseJSON :: Value -> Parser TeamData
$cparseJSONList :: Value -> Parser [TeamData]
parseJSONList :: Value -> Parser [TeamData]
FromJSON, Typeable TeamData
Typeable TeamData =>
(Proxy TeamData -> Declare (Definitions Schema) NamedSchema)
-> ToSchema TeamData
Proxy TeamData -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy TeamData -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy TeamData -> Declare (Definitions Schema) NamedSchema
Swagger.ToSchema) via S.Schema TeamData

instance S.ToSchema TeamData where
  schema :: ValueSchema NamedSwaggerDoc TeamData
schema =
    Text
-> SchemaP SwaggerDoc Object [Pair] TeamData TeamData
-> ValueSchema NamedSwaggerDoc TeamData
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
S.object Text
"TeamData" (SchemaP SwaggerDoc Object [Pair] TeamData TeamData
 -> ValueSchema NamedSwaggerDoc TeamData)
-> SchemaP SwaggerDoc Object [Pair] TeamData TeamData
-> ValueSchema NamedSwaggerDoc TeamData
forall a b. (a -> b) -> a -> b
$
      Team -> TeamStatus -> Maybe UTCTime -> TeamData
TeamData
        (Team -> TeamStatus -> Maybe UTCTime -> TeamData)
-> SchemaP SwaggerDoc Object [Pair] TeamData Team
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamData
     (TeamStatus -> Maybe UTCTime -> TeamData)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TeamData -> Team
tdTeam (TeamData -> Team)
-> SchemaP SwaggerDoc Object [Pair] Team Team
-> SchemaP SwaggerDoc Object [Pair] TeamData Team
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= Text
-> SchemaP NamedSwaggerDoc Value Value Team Team
-> SchemaP SwaggerDoc Object [Pair] Team Team
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
S.field Text
"team" SchemaP NamedSwaggerDoc Value Value Team Team
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
S.schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamData
  (TeamStatus -> Maybe UTCTime -> TeamData)
-> SchemaP SwaggerDoc Object [Pair] TeamData TeamStatus
-> SchemaP
     SwaggerDoc Object [Pair] TeamData (Maybe UTCTime -> TeamData)
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamData (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamData a
-> SchemaP SwaggerDoc Object [Pair] TeamData b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamData -> TeamStatus
tdStatus (TeamData -> TeamStatus)
-> SchemaP SwaggerDoc Object [Pair] TeamStatus TeamStatus
-> SchemaP SwaggerDoc Object [Pair] TeamData TeamStatus
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= Text
-> ValueSchema NamedSwaggerDoc TeamStatus
-> SchemaP SwaggerDoc Object [Pair] TeamStatus TeamStatus
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
S.field Text
"status" ValueSchema NamedSwaggerDoc TeamStatus
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
S.schema
        SchemaP
  SwaggerDoc Object [Pair] TeamData (Maybe UTCTime -> TeamData)
-> SchemaP SwaggerDoc Object [Pair] TeamData (Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] TeamData TeamData
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamData (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamData a
-> SchemaP SwaggerDoc Object [Pair] TeamData b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamData -> Maybe UTCTime
tdStatusTime (TeamData -> Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] (Maybe UTCTime) (Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] TeamData (Maybe UTCTime)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= SchemaP SwaggerDoc Object [Pair] UTCTime (Maybe UTCTime)
-> SchemaP SwaggerDoc Object [Pair] (Maybe UTCTime) (Maybe UTCTime)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
S.maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value UTCTime UTCTime
-> SchemaP SwaggerDoc Object [Pair] UTCTime (Maybe UTCTime)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
S.optField Text
"status_time" SchemaP NamedSwaggerDoc Value Value UTCTime UTCTime
utcTimeSchema)

data TeamStatusUpdate = TeamStatusUpdate
  { TeamStatusUpdate -> TeamStatus
tuStatus :: !TeamStatus,
    TeamStatusUpdate -> Maybe Alpha
tuCurrency :: !(Maybe Currency.Alpha)
    -- TODO: Remove Currency selection once billing supports currency changes after team creation
  }
  deriving (TeamStatusUpdate -> TeamStatusUpdate -> Bool
(TeamStatusUpdate -> TeamStatusUpdate -> Bool)
-> (TeamStatusUpdate -> TeamStatusUpdate -> Bool)
-> Eq TeamStatusUpdate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TeamStatusUpdate -> TeamStatusUpdate -> Bool
== :: TeamStatusUpdate -> TeamStatusUpdate -> Bool
$c/= :: TeamStatusUpdate -> TeamStatusUpdate -> Bool
/= :: TeamStatusUpdate -> TeamStatusUpdate -> Bool
Eq, Int -> TeamStatusUpdate -> ShowS
[TeamStatusUpdate] -> ShowS
TeamStatusUpdate -> String
(Int -> TeamStatusUpdate -> ShowS)
-> (TeamStatusUpdate -> String)
-> ([TeamStatusUpdate] -> ShowS)
-> Show TeamStatusUpdate
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TeamStatusUpdate -> ShowS
showsPrec :: Int -> TeamStatusUpdate -> ShowS
$cshow :: TeamStatusUpdate -> String
show :: TeamStatusUpdate -> String
$cshowList :: [TeamStatusUpdate] -> ShowS
showList :: [TeamStatusUpdate] -> ShowS
Show, (forall x. TeamStatusUpdate -> Rep TeamStatusUpdate x)
-> (forall x. Rep TeamStatusUpdate x -> TeamStatusUpdate)
-> Generic TeamStatusUpdate
forall x. Rep TeamStatusUpdate x -> TeamStatusUpdate
forall x. TeamStatusUpdate -> Rep TeamStatusUpdate x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TeamStatusUpdate -> Rep TeamStatusUpdate x
from :: forall x. TeamStatusUpdate -> Rep TeamStatusUpdate x
$cto :: forall x. Rep TeamStatusUpdate x -> TeamStatusUpdate
to :: forall x. Rep TeamStatusUpdate x -> TeamStatusUpdate
Generic)
  deriving (Gen TeamStatusUpdate
Gen TeamStatusUpdate
-> (TeamStatusUpdate -> [TeamStatusUpdate])
-> Arbitrary TeamStatusUpdate
TeamStatusUpdate -> [TeamStatusUpdate]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen TeamStatusUpdate
arbitrary :: Gen TeamStatusUpdate
$cshrink :: TeamStatusUpdate -> [TeamStatusUpdate]
shrink :: TeamStatusUpdate -> [TeamStatusUpdate]
Arbitrary) via GenericUniform TeamStatusUpdate
  deriving ([TeamStatusUpdate] -> Value
[TeamStatusUpdate] -> Encoding
TeamStatusUpdate -> Value
TeamStatusUpdate -> Encoding
(TeamStatusUpdate -> Value)
-> (TeamStatusUpdate -> Encoding)
-> ([TeamStatusUpdate] -> Value)
-> ([TeamStatusUpdate] -> Encoding)
-> ToJSON TeamStatusUpdate
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: TeamStatusUpdate -> Value
toJSON :: TeamStatusUpdate -> Value
$ctoEncoding :: TeamStatusUpdate -> Encoding
toEncoding :: TeamStatusUpdate -> Encoding
$ctoJSONList :: [TeamStatusUpdate] -> Value
toJSONList :: [TeamStatusUpdate] -> Value
$ctoEncodingList :: [TeamStatusUpdate] -> Encoding
toEncodingList :: [TeamStatusUpdate] -> Encoding
ToJSON, Value -> Parser [TeamStatusUpdate]
Value -> Parser TeamStatusUpdate
(Value -> Parser TeamStatusUpdate)
-> (Value -> Parser [TeamStatusUpdate])
-> FromJSON TeamStatusUpdate
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser TeamStatusUpdate
parseJSON :: Value -> Parser TeamStatusUpdate
$cparseJSONList :: Value -> Parser [TeamStatusUpdate]
parseJSONList :: Value -> Parser [TeamStatusUpdate]
FromJSON, Typeable TeamStatusUpdate
Typeable TeamStatusUpdate =>
(Proxy TeamStatusUpdate
 -> Declare (Definitions Schema) NamedSchema)
-> ToSchema TeamStatusUpdate
Proxy TeamStatusUpdate -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy TeamStatusUpdate -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy TeamStatusUpdate -> Declare (Definitions Schema) NamedSchema
Swagger.ToSchema) via S.Schema TeamStatusUpdate

instance S.ToSchema TeamStatusUpdate where
  schema :: ValueSchema NamedSwaggerDoc TeamStatusUpdate
schema =
    Text
-> SchemaP
     SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatusUpdate
-> ValueSchema NamedSwaggerDoc TeamStatusUpdate
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
S.object Text
"TeamStatusUpdate" (SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatusUpdate
 -> ValueSchema NamedSwaggerDoc TeamStatusUpdate)
-> SchemaP
     SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatusUpdate
-> ValueSchema NamedSwaggerDoc TeamStatusUpdate
forall a b. (a -> b) -> a -> b
$
      TeamStatus -> Maybe Alpha -> TeamStatusUpdate
TeamStatusUpdate
        (TeamStatus -> Maybe Alpha -> TeamStatusUpdate)
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatus
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     TeamStatusUpdate
     (Maybe Alpha -> TeamStatusUpdate)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TeamStatusUpdate -> TeamStatus
tuStatus (TeamStatusUpdate -> TeamStatus)
-> SchemaP SwaggerDoc Object [Pair] TeamStatus TeamStatus
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatus
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= Text
-> ValueSchema NamedSwaggerDoc TeamStatus
-> SchemaP SwaggerDoc Object [Pair] TeamStatus TeamStatus
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
S.field Text
"status" ValueSchema NamedSwaggerDoc TeamStatus
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
S.schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  TeamStatusUpdate
  (Maybe Alpha -> TeamStatusUpdate)
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate (Maybe Alpha)
-> SchemaP
     SwaggerDoc Object [Pair] TeamStatusUpdate TeamStatusUpdate
forall a b.
SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate (a -> b)
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate a
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TeamStatusUpdate -> Maybe Alpha
tuCurrency (TeamStatusUpdate -> Maybe Alpha)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Alpha) (Maybe Alpha)
-> SchemaP SwaggerDoc Object [Pair] TeamStatusUpdate (Maybe Alpha)
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= SchemaP SwaggerDoc Object [Pair] Alpha (Maybe Alpha)
-> SchemaP SwaggerDoc Object [Pair] (Maybe Alpha) (Maybe Alpha)
forall w d v a b.
Monoid w =>
SchemaP d v w a b -> SchemaP d v w (Maybe a) b
S.maybe_ (Text
-> SchemaP NamedSwaggerDoc Value Value Alpha Alpha
-> SchemaP SwaggerDoc Object [Pair] Alpha (Maybe Alpha)
forall doc doc' a b.
(HasOpt doc, HasField doc' doc) =>
Text
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a (Maybe b)
S.optField Text
"currency" SchemaP NamedSwaggerDoc Value Value Alpha Alpha
currencyAlphaSchema)
    where
      currencyAlphaSchema :: S.ValueSchema S.NamedSwaggerDoc Currency.Alpha
      currencyAlphaSchema :: SchemaP NamedSwaggerDoc Value Value Alpha Alpha
currencyAlphaSchema = NamedSwaggerDoc
-> (Value -> Parser Alpha)
-> (Alpha -> Maybe Value)
-> SchemaP NamedSwaggerDoc Value Value Alpha Alpha
forall doc v b a w.
doc -> (v -> Parser b) -> (a -> Maybe w) -> SchemaP doc v w a b
S.mkSchema NamedSwaggerDoc
docs Value -> Parser Alpha
forall a. FromJSON a => Value -> Parser a
parseJSON (Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value) -> (Alpha -> Value) -> Alpha -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Alpha -> Value
forall a. ToJSON a => a -> Value
toJSON)
        where
          docs :: NamedSwaggerDoc
docs =
            forall a. ToSchema a => NamedSwaggerDoc
S.swaggerDoc @Text
              NamedSwaggerDoc
-> (NamedSwaggerDoc -> NamedSwaggerDoc) -> NamedSwaggerDoc
forall a b. a -> (a -> b) -> b
& (Schema -> Identity Schema)
-> NamedSwaggerDoc -> Identity NamedSwaggerDoc
forall s a. HasSchema s a => Lens' s a
Lens' NamedSwaggerDoc Schema
Swagger.schema ((Schema -> Identity Schema)
 -> NamedSwaggerDoc -> Identity NamedSwaggerDoc)
-> ((Maybe Text -> Identity (Maybe Text))
    -> Schema -> Identity Schema)
-> (Maybe Text -> Identity (Maybe Text))
-> NamedSwaggerDoc
-> Identity NamedSwaggerDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Text -> Identity (Maybe Text)) -> Schema -> Identity Schema
forall s a. HasDescription s a => Lens' s a
Lens' Schema (Maybe Text)
Swagger.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
"ISO 4217 alphabetic codes"
              NamedSwaggerDoc
-> (NamedSwaggerDoc -> NamedSwaggerDoc) -> NamedSwaggerDoc
forall a b. a -> (a -> b) -> b
& (Schema -> Identity Schema)
-> NamedSwaggerDoc -> Identity NamedSwaggerDoc
forall s a. HasSchema s a => Lens' s a
Lens' NamedSwaggerDoc Schema
Swagger.schema ((Schema -> Identity Schema)
 -> NamedSwaggerDoc -> Identity NamedSwaggerDoc)
-> ((Maybe Value -> Identity (Maybe Value))
    -> Schema -> Identity Schema)
-> (Maybe Value -> Identity (Maybe Value))
-> NamedSwaggerDoc
-> Identity NamedSwaggerDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Value -> Identity (Maybe Value))
-> Schema -> Identity Schema
forall s a. HasExample s a => Lens' s a
Lens' Schema (Maybe Value)
Swagger.example ((Maybe Value -> Identity (Maybe Value))
 -> NamedSwaggerDoc -> Identity NamedSwaggerDoc)
-> Value -> NamedSwaggerDoc -> NamedSwaggerDoc
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Value
"EUR"

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

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

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

instance S.ToSchema GuardLegalholdPolicyConflicts where
  schema :: ValueSchema NamedSwaggerDoc GuardLegalholdPolicyConflicts
schema =
    Text
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     GuardLegalholdPolicyConflicts
-> ValueSchema NamedSwaggerDoc GuardLegalholdPolicyConflicts
forall doc doc' a b.
HasObject doc doc' =>
Text
-> SchemaP doc Object [Pair] a b -> SchemaP doc' Value Value a b
S.object Text
"GuardLegalholdPolicyConflicts" (SchemaP
   SwaggerDoc
   Object
   [Pair]
   GuardLegalholdPolicyConflicts
   GuardLegalholdPolicyConflicts
 -> ValueSchema NamedSwaggerDoc GuardLegalholdPolicyConflicts)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     GuardLegalholdPolicyConflicts
-> ValueSchema NamedSwaggerDoc GuardLegalholdPolicyConflicts
forall a b. (a -> b) -> a -> b
$
      LegalholdProtectee -> UserClients -> GuardLegalholdPolicyConflicts
GuardLegalholdPolicyConflicts
        (LegalholdProtectee
 -> UserClients -> GuardLegalholdPolicyConflicts)
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     LegalholdProtectee
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     (UserClients -> GuardLegalholdPolicyConflicts)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuardLegalholdPolicyConflicts -> LegalholdProtectee
glhProtectee (GuardLegalholdPolicyConflicts -> LegalholdProtectee)
-> SchemaP
     SwaggerDoc Object [Pair] LegalholdProtectee LegalholdProtectee
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     LegalholdProtectee
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= Text
-> SchemaP
     NamedSwaggerDoc Value Value LegalholdProtectee LegalholdProtectee
-> SchemaP
     SwaggerDoc Object [Pair] LegalholdProtectee LegalholdProtectee
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
S.field Text
"glhProtectee" SchemaP
  NamedSwaggerDoc Value Value LegalholdProtectee LegalholdProtectee
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
S.schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  GuardLegalholdPolicyConflicts
  (UserClients -> GuardLegalholdPolicyConflicts)
-> SchemaP
     SwaggerDoc Object [Pair] GuardLegalholdPolicyConflicts UserClients
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     GuardLegalholdPolicyConflicts
     GuardLegalholdPolicyConflicts
forall a b.
SchemaP
  SwaggerDoc Object [Pair] GuardLegalholdPolicyConflicts (a -> b)
-> SchemaP SwaggerDoc Object [Pair] GuardLegalholdPolicyConflicts a
-> SchemaP SwaggerDoc Object [Pair] GuardLegalholdPolicyConflicts b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GuardLegalholdPolicyConflicts -> UserClients
glhUserClients (GuardLegalholdPolicyConflicts -> UserClients)
-> SchemaP SwaggerDoc Object [Pair] UserClients UserClients
-> SchemaP
     SwaggerDoc Object [Pair] GuardLegalholdPolicyConflicts UserClients
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
S..= Text
-> SchemaP NamedSwaggerDoc Value Value UserClients UserClients
-> SchemaP SwaggerDoc Object [Pair] UserClients UserClients
forall doc' doc a b.
HasField doc' doc =>
Text
-> SchemaP doc' Value Value a b -> SchemaP doc Object [Pair] a b
S.field Text
"glhUserClients" SchemaP NamedSwaggerDoc Value Value UserClients UserClients
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
S.schema