{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StrictData #-}
{-# 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.Push.V2.Token
  ( -- * PushToken
    PushTokenList (..),
    PushToken,
    pushToken,
    tokenTransport,
    tokenApp,
    tokenClient,
    token,

    -- * PushToken fields
    Transport (..),
    Token (..),
    AppName (..),

    -- * API types
    AddTokenError (..),
    AddTokenSuccess (..),
    AddTokenResponses,
    DeleteTokenResponses,
  )
where

import Control.Lens (makeLenses, (?~), (^.))
import Data.Aeson qualified as A
import Data.Attoparsec.ByteString (takeByteString)
import Data.ByteString.Conversion
import Data.Id
import Data.OpenApi (ToParamSchema)
import Data.OpenApi qualified as S
import Data.SOP
import Data.Schema
import Generics.SOP qualified as GSOP
import Imports
import Servant
import Wire.API.Error
import Wire.API.Error.Gundeck qualified as E
import Wire.API.Routes.MultiVerb
import Wire.Arbitrary (Arbitrary, GenericUniform (..))

--------------------------------------------------------------------------------
-- PushToken

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

instance ToSchema PushTokenList where
  schema :: ValueSchema NamedSwaggerDoc PushTokenList
schema =
    Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> ObjectSchema SwaggerDoc PushTokenList
-> ValueSchema NamedSwaggerDoc PushTokenList
forall doc doc' a.
HasObject doc doc' =>
Text -> (doc' -> doc') -> ObjectSchema doc a -> ValueSchema doc' a
objectWithDocModifier Text
"PushTokenList" ((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
"List of Native Push Tokens") (ObjectSchema SwaggerDoc PushTokenList
 -> ValueSchema NamedSwaggerDoc PushTokenList)
-> ObjectSchema SwaggerDoc PushTokenList
-> ValueSchema NamedSwaggerDoc PushTokenList
forall a b. (a -> b) -> a -> b
$
      [PushToken] -> PushTokenList
PushTokenList
        ([PushToken] -> PushTokenList)
-> SchemaP SwaggerDoc Object [Pair] PushTokenList [PushToken]
-> ObjectSchema SwaggerDoc PushTokenList
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PushTokenList -> [PushToken]
pushTokens
          (PushTokenList -> [PushToken])
-> SchemaP SwaggerDoc Object [Pair] [PushToken] [PushToken]
-> SchemaP SwaggerDoc Object [Pair] PushTokenList [PushToken]
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> (SwaggerDoc -> SwaggerDoc)
-> SchemaP SwaggerDoc Value Value [PushToken] [PushToken]
-> SchemaP SwaggerDoc Object [Pair] [PushToken] [PushToken]
forall doc' doc a b.
HasField doc' doc =>
Text
-> (doc' -> doc')
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a b
fieldWithDocModifier Text
"tokens" ((Maybe Text -> Identity (Maybe Text))
-> SwaggerDoc -> Identity SwaggerDoc
forall s a. HasDescription s a => Lens' s a
Lens' SwaggerDoc (Maybe Text)
description ((Maybe Text -> Identity (Maybe Text))
 -> SwaggerDoc -> Identity SwaggerDoc)
-> Text -> SwaggerDoc -> SwaggerDoc
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Text
"Push tokens") (ValueSchema NamedSwaggerDoc PushToken
-> SchemaP SwaggerDoc Value Value [PushToken] [PushToken]
forall ndoc doc a.
(HasArray ndoc doc, HasName ndoc) =>
ValueSchema ndoc a -> ValueSchema doc [a]
array ValueSchema NamedSwaggerDoc PushToken
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema)

data PushToken = PushToken
  { PushToken -> Transport
_tokenTransport :: Transport,
    PushToken -> AppName
_tokenApp :: AppName,
    PushToken -> Token
_token :: Token,
    PushToken -> ClientId
_tokenClient :: ClientId
  }
  deriving stock (PushToken -> PushToken -> Bool
(PushToken -> PushToken -> Bool)
-> (PushToken -> PushToken -> Bool) -> Eq PushToken
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PushToken -> PushToken -> Bool
== :: PushToken -> PushToken -> Bool
$c/= :: PushToken -> PushToken -> Bool
/= :: PushToken -> PushToken -> Bool
Eq, Eq PushToken
Eq PushToken =>
(PushToken -> PushToken -> Ordering)
-> (PushToken -> PushToken -> Bool)
-> (PushToken -> PushToken -> Bool)
-> (PushToken -> PushToken -> Bool)
-> (PushToken -> PushToken -> Bool)
-> (PushToken -> PushToken -> PushToken)
-> (PushToken -> PushToken -> PushToken)
-> Ord PushToken
PushToken -> PushToken -> Bool
PushToken -> PushToken -> Ordering
PushToken -> PushToken -> PushToken
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 :: PushToken -> PushToken -> Ordering
compare :: PushToken -> PushToken -> Ordering
$c< :: PushToken -> PushToken -> Bool
< :: PushToken -> PushToken -> Bool
$c<= :: PushToken -> PushToken -> Bool
<= :: PushToken -> PushToken -> Bool
$c> :: PushToken -> PushToken -> Bool
> :: PushToken -> PushToken -> Bool
$c>= :: PushToken -> PushToken -> Bool
>= :: PushToken -> PushToken -> Bool
$cmax :: PushToken -> PushToken -> PushToken
max :: PushToken -> PushToken -> PushToken
$cmin :: PushToken -> PushToken -> PushToken
min :: PushToken -> PushToken -> PushToken
Ord, Int -> PushToken -> ShowS
[PushToken] -> ShowS
PushToken -> String
(Int -> PushToken -> ShowS)
-> (PushToken -> String)
-> ([PushToken] -> ShowS)
-> Show PushToken
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PushToken -> ShowS
showsPrec :: Int -> PushToken -> ShowS
$cshow :: PushToken -> String
show :: PushToken -> String
$cshowList :: [PushToken] -> ShowS
showList :: [PushToken] -> ShowS
Show, (forall x. PushToken -> Rep PushToken x)
-> (forall x. Rep PushToken x -> PushToken) -> Generic PushToken
forall x. Rep PushToken x -> PushToken
forall x. PushToken -> Rep PushToken x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PushToken -> Rep PushToken x
from :: forall x. PushToken -> Rep PushToken x
$cto :: forall x. Rep PushToken x -> PushToken
to :: forall x. Rep PushToken x -> PushToken
Generic)
  deriving (Gen PushToken
Gen PushToken -> (PushToken -> [PushToken]) -> Arbitrary PushToken
PushToken -> [PushToken]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen PushToken
arbitrary :: Gen PushToken
$cshrink :: PushToken -> [PushToken]
shrink :: PushToken -> [PushToken]
Arbitrary) via (GenericUniform PushToken)
  deriving ([PushToken] -> Value
[PushToken] -> Encoding
PushToken -> Value
PushToken -> Encoding
(PushToken -> Value)
-> (PushToken -> Encoding)
-> ([PushToken] -> Value)
-> ([PushToken] -> Encoding)
-> ToJSON PushToken
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: PushToken -> Value
toJSON :: PushToken -> Value
$ctoEncoding :: PushToken -> Encoding
toEncoding :: PushToken -> Encoding
$ctoJSONList :: [PushToken] -> Value
toJSONList :: [PushToken] -> Value
$ctoEncodingList :: [PushToken] -> Encoding
toEncodingList :: [PushToken] -> Encoding
A.ToJSON, Value -> Parser [PushToken]
Value -> Parser PushToken
(Value -> Parser PushToken)
-> (Value -> Parser [PushToken]) -> FromJSON PushToken
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser PushToken
parseJSON :: Value -> Parser PushToken
$cparseJSONList :: Value -> Parser [PushToken]
parseJSONList :: Value -> Parser [PushToken]
A.FromJSON, Typeable PushToken
Typeable PushToken =>
(Proxy PushToken -> Declare (Definitions Schema) NamedSchema)
-> ToSchema PushToken
Proxy PushToken -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy PushToken -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy PushToken -> Declare (Definitions Schema) NamedSchema
S.ToSchema) via (Schema PushToken)

pushToken :: Transport -> AppName -> Token -> ClientId -> PushToken
pushToken :: Transport -> AppName -> Token -> ClientId -> PushToken
pushToken = Transport -> AppName -> Token -> ClientId -> PushToken
PushToken

instance ToSchema PushToken where
  schema :: ValueSchema NamedSwaggerDoc PushToken
schema =
    Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> ObjectSchema SwaggerDoc PushToken
-> ValueSchema NamedSwaggerDoc PushToken
forall doc doc' a.
HasObject doc doc' =>
Text -> (doc' -> doc') -> ObjectSchema doc a -> ValueSchema doc' a
objectWithDocModifier Text
"PushToken" NamedSwaggerDoc -> NamedSwaggerDoc
desc (ObjectSchema SwaggerDoc PushToken
 -> ValueSchema NamedSwaggerDoc PushToken)
-> ObjectSchema SwaggerDoc PushToken
-> ValueSchema NamedSwaggerDoc PushToken
forall a b. (a -> b) -> a -> b
$
      Transport -> AppName -> Token -> ClientId -> PushToken
PushToken
        (Transport -> AppName -> Token -> ClientId -> PushToken)
-> SchemaP SwaggerDoc Object [Pair] PushToken Transport
-> SchemaP
     SwaggerDoc
     Object
     [Pair]
     PushToken
     (AppName -> Token -> ClientId -> PushToken)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PushToken -> Transport
_tokenTransport
          (PushToken -> Transport)
-> SchemaP SwaggerDoc Object [Pair] Transport Transport
-> SchemaP SwaggerDoc Object [Pair] PushToken Transport
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> SchemaP NamedSwaggerDoc Value Value Transport Transport
-> SchemaP SwaggerDoc Object [Pair] Transport Transport
forall doc' doc a b.
HasField doc' doc =>
Text
-> (doc' -> doc')
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a b
fieldWithDocModifier Text
"transport" NamedSwaggerDoc -> NamedSwaggerDoc
transDesc SchemaP NamedSwaggerDoc Value Value Transport Transport
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc
  Object
  [Pair]
  PushToken
  (AppName -> Token -> ClientId -> PushToken)
-> SchemaP SwaggerDoc Object [Pair] PushToken AppName
-> SchemaP
     SwaggerDoc Object [Pair] PushToken (Token -> ClientId -> PushToken)
forall a b.
SchemaP SwaggerDoc Object [Pair] PushToken (a -> b)
-> SchemaP SwaggerDoc Object [Pair] PushToken a
-> SchemaP SwaggerDoc Object [Pair] PushToken b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> PushToken -> AppName
_tokenApp
          (PushToken -> AppName)
-> SchemaP SwaggerDoc Object [Pair] AppName AppName
-> SchemaP SwaggerDoc Object [Pair] PushToken AppName
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> SchemaP NamedSwaggerDoc Value Value AppName AppName
-> SchemaP SwaggerDoc Object [Pair] AppName AppName
forall doc' doc a b.
HasField doc' doc =>
Text
-> (doc' -> doc')
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a b
fieldWithDocModifier Text
"app" NamedSwaggerDoc -> NamedSwaggerDoc
appDesc SchemaP NamedSwaggerDoc Value Value AppName AppName
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP
  SwaggerDoc Object [Pair] PushToken (Token -> ClientId -> PushToken)
-> SchemaP SwaggerDoc Object [Pair] PushToken Token
-> SchemaP
     SwaggerDoc Object [Pair] PushToken (ClientId -> PushToken)
forall a b.
SchemaP SwaggerDoc Object [Pair] PushToken (a -> b)
-> SchemaP SwaggerDoc Object [Pair] PushToken a
-> SchemaP SwaggerDoc Object [Pair] PushToken b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> PushToken -> Token
_token
          (PushToken -> Token)
-> SchemaP SwaggerDoc Object [Pair] Token Token
-> SchemaP SwaggerDoc Object [Pair] PushToken Token
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> SchemaP NamedSwaggerDoc Value Value Token Token
-> SchemaP SwaggerDoc Object [Pair] Token Token
forall doc' doc a b.
HasField doc' doc =>
Text
-> (doc' -> doc')
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a b
fieldWithDocModifier Text
"token" NamedSwaggerDoc -> NamedSwaggerDoc
tokenDesc SchemaP NamedSwaggerDoc Value Value Token Token
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
        SchemaP SwaggerDoc Object [Pair] PushToken (ClientId -> PushToken)
-> SchemaP SwaggerDoc Object [Pair] PushToken ClientId
-> ObjectSchema SwaggerDoc PushToken
forall a b.
SchemaP SwaggerDoc Object [Pair] PushToken (a -> b)
-> SchemaP SwaggerDoc Object [Pair] PushToken a
-> SchemaP SwaggerDoc Object [Pair] PushToken b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> PushToken -> ClientId
_tokenClient
          (PushToken -> ClientId)
-> SchemaP SwaggerDoc Object [Pair] ClientId ClientId
-> SchemaP SwaggerDoc Object [Pair] PushToken ClientId
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= Text
-> (NamedSwaggerDoc -> NamedSwaggerDoc)
-> SchemaP NamedSwaggerDoc Value Value ClientId ClientId
-> SchemaP SwaggerDoc Object [Pair] ClientId ClientId
forall doc' doc a b.
HasField doc' doc =>
Text
-> (doc' -> doc')
-> SchemaP doc' Value Value a b
-> SchemaP doc Object [Pair] a b
fieldWithDocModifier Text
"client" NamedSwaggerDoc -> NamedSwaggerDoc
clientIdDesc SchemaP NamedSwaggerDoc Value Value ClientId ClientId
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema
    where
      desc :: NamedSwaggerDoc -> NamedSwaggerDoc
desc = (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
"Native Push Token"
      transDesc :: NamedSwaggerDoc -> NamedSwaggerDoc
transDesc = (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
"Transport"
      appDesc :: NamedSwaggerDoc -> NamedSwaggerDoc
appDesc = (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
"Application"
      tokenDesc :: NamedSwaggerDoc -> NamedSwaggerDoc
tokenDesc = (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
"Access Token"
      clientIdDesc :: NamedSwaggerDoc -> NamedSwaggerDoc
clientIdDesc = (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
"Client ID"

--------------------------------------------------------------------------------
-- Transport

data Transport
  = GCM
  | APNS
  | APNSSandbox
  | APNSVoIP
  | APNSVoIPSandbox
  deriving stock (Transport -> Transport -> Bool
(Transport -> Transport -> Bool)
-> (Transport -> Transport -> Bool) -> Eq Transport
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Transport -> Transport -> Bool
== :: Transport -> Transport -> Bool
$c/= :: Transport -> Transport -> Bool
/= :: Transport -> Transport -> Bool
Eq, Eq Transport
Eq Transport =>
(Transport -> Transport -> Ordering)
-> (Transport -> Transport -> Bool)
-> (Transport -> Transport -> Bool)
-> (Transport -> Transport -> Bool)
-> (Transport -> Transport -> Bool)
-> (Transport -> Transport -> Transport)
-> (Transport -> Transport -> Transport)
-> Ord Transport
Transport -> Transport -> Bool
Transport -> Transport -> Ordering
Transport -> Transport -> Transport
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 :: Transport -> Transport -> Ordering
compare :: Transport -> Transport -> Ordering
$c< :: Transport -> Transport -> Bool
< :: Transport -> Transport -> Bool
$c<= :: Transport -> Transport -> Bool
<= :: Transport -> Transport -> Bool
$c> :: Transport -> Transport -> Bool
> :: Transport -> Transport -> Bool
$c>= :: Transport -> Transport -> Bool
>= :: Transport -> Transport -> Bool
$cmax :: Transport -> Transport -> Transport
max :: Transport -> Transport -> Transport
$cmin :: Transport -> Transport -> Transport
min :: Transport -> Transport -> Transport
Ord, Int -> Transport -> ShowS
[Transport] -> ShowS
Transport -> String
(Int -> Transport -> ShowS)
-> (Transport -> String)
-> ([Transport] -> ShowS)
-> Show Transport
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Transport -> ShowS
showsPrec :: Int -> Transport -> ShowS
$cshow :: Transport -> String
show :: Transport -> String
$cshowList :: [Transport] -> ShowS
showList :: [Transport] -> ShowS
Show, Transport
Transport -> Transport -> Bounded Transport
forall a. a -> a -> Bounded a
$cminBound :: Transport
minBound :: Transport
$cmaxBound :: Transport
maxBound :: Transport
Bounded, Int -> Transport
Transport -> Int
Transport -> [Transport]
Transport -> Transport
Transport -> Transport -> [Transport]
Transport -> Transport -> Transport -> [Transport]
(Transport -> Transport)
-> (Transport -> Transport)
-> (Int -> Transport)
-> (Transport -> Int)
-> (Transport -> [Transport])
-> (Transport -> Transport -> [Transport])
-> (Transport -> Transport -> [Transport])
-> (Transport -> Transport -> Transport -> [Transport])
-> Enum Transport
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 :: Transport -> Transport
succ :: Transport -> Transport
$cpred :: Transport -> Transport
pred :: Transport -> Transport
$ctoEnum :: Int -> Transport
toEnum :: Int -> Transport
$cfromEnum :: Transport -> Int
fromEnum :: Transport -> Int
$cenumFrom :: Transport -> [Transport]
enumFrom :: Transport -> [Transport]
$cenumFromThen :: Transport -> Transport -> [Transport]
enumFromThen :: Transport -> Transport -> [Transport]
$cenumFromTo :: Transport -> Transport -> [Transport]
enumFromTo :: Transport -> Transport -> [Transport]
$cenumFromThenTo :: Transport -> Transport -> Transport -> [Transport]
enumFromThenTo :: Transport -> Transport -> Transport -> [Transport]
Enum, (forall x. Transport -> Rep Transport x)
-> (forall x. Rep Transport x -> Transport) -> Generic Transport
forall x. Rep Transport x -> Transport
forall x. Transport -> Rep Transport x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Transport -> Rep Transport x
from :: forall x. Transport -> Rep Transport x
$cto :: forall x. Rep Transport x -> Transport
to :: forall x. Rep Transport x -> Transport
Generic)
  deriving (Gen Transport
Gen Transport -> (Transport -> [Transport]) -> Arbitrary Transport
Transport -> [Transport]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen Transport
arbitrary :: Gen Transport
$cshrink :: Transport -> [Transport]
shrink :: Transport -> [Transport]
Arbitrary) via (GenericUniform Transport)
  deriving ([Transport] -> Value
[Transport] -> Encoding
Transport -> Value
Transport -> Encoding
(Transport -> Value)
-> (Transport -> Encoding)
-> ([Transport] -> Value)
-> ([Transport] -> Encoding)
-> ToJSON Transport
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: Transport -> Value
toJSON :: Transport -> Value
$ctoEncoding :: Transport -> Encoding
toEncoding :: Transport -> Encoding
$ctoJSONList :: [Transport] -> Value
toJSONList :: [Transport] -> Value
$ctoEncodingList :: [Transport] -> Encoding
toEncodingList :: [Transport] -> Encoding
A.ToJSON, Value -> Parser [Transport]
Value -> Parser Transport
(Value -> Parser Transport)
-> (Value -> Parser [Transport]) -> FromJSON Transport
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser Transport
parseJSON :: Value -> Parser Transport
$cparseJSONList :: Value -> Parser [Transport]
parseJSONList :: Value -> Parser [Transport]
A.FromJSON, Typeable Transport
Typeable Transport =>
(Proxy Transport -> Declare (Definitions Schema) NamedSchema)
-> ToSchema Transport
Proxy Transport -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy Transport -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy Transport -> Declare (Definitions Schema) NamedSchema
S.ToSchema) via (Schema Transport)

instance ToSchema Transport where
  schema :: SchemaP NamedSwaggerDoc Value Value Transport Transport
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
"Transport" (SchemaP [Value] Text (Alt Maybe Text) Transport Transport
 -> SchemaP NamedSwaggerDoc Value Value Transport Transport)
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
-> SchemaP NamedSwaggerDoc Value Value Transport Transport
forall a b. (a -> b) -> a -> b
$
      [SchemaP [Value] Text (Alt Maybe Text) Transport Transport]
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a. Monoid a => [a] -> a
mconcat
        [ Text
-> Transport
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"GCM" Transport
GCM,
          Text
-> Transport
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"APNS" Transport
APNS,
          Text
-> Transport
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"APNS_SANDBOX" Transport
APNSSandbox,
          Text
-> Transport
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"APNS_VOIP" Transport
APNSVoIP,
          Text
-> Transport
-> SchemaP [Value] Text (Alt Maybe Text) Transport Transport
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"APNS_VOIP_SANDBOX" Transport
APNSVoIPSandbox
        ]

instance FromByteString Transport where
  parser :: Parser Transport
parser =
    Parser ByteString
takeByteString Parser ByteString
-> (ByteString -> Parser Transport) -> Parser Transport
forall a b.
Parser ByteString a
-> (a -> Parser ByteString b) -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      ByteString
"GCM" -> Transport -> Parser Transport
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Transport
GCM
      ByteString
"APNS" -> Transport -> Parser Transport
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Transport
APNS
      ByteString
"APNS_SANDBOX" -> Transport -> Parser Transport
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Transport
APNSSandbox
      ByteString
"APNS_VOIP" -> Transport -> Parser Transport
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Transport
APNSVoIP
      ByteString
"APNS_VOIP_SANDBOX" -> Transport -> Parser Transport
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Transport
APNSVoIPSandbox
      ByteString
x -> String -> Parser Transport
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Transport) -> String -> Parser Transport
forall a b. (a -> b) -> a -> b
$ String
"Invalid push transport: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ByteString -> String
forall a. Show a => a -> String
show ByteString
x

newtype Token = Token
  { Token -> Text
tokenText :: Text
  }
  deriving stock (Token -> Token -> Bool
(Token -> Token -> Bool) -> (Token -> Token -> Bool) -> Eq Token
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Token -> Token -> Bool
== :: Token -> Token -> Bool
$c/= :: Token -> Token -> Bool
/= :: Token -> Token -> Bool
Eq, Eq Token
Eq Token =>
(Token -> Token -> Ordering)
-> (Token -> Token -> Bool)
-> (Token -> Token -> Bool)
-> (Token -> Token -> Bool)
-> (Token -> Token -> Bool)
-> (Token -> Token -> Token)
-> (Token -> Token -> Token)
-> Ord Token
Token -> Token -> Bool
Token -> Token -> Ordering
Token -> Token -> Token
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 :: Token -> Token -> Ordering
compare :: Token -> Token -> Ordering
$c< :: Token -> Token -> Bool
< :: Token -> Token -> Bool
$c<= :: Token -> Token -> Bool
<= :: Token -> Token -> Bool
$c> :: Token -> Token -> Bool
> :: Token -> Token -> Bool
$c>= :: Token -> Token -> Bool
>= :: Token -> Token -> Bool
$cmax :: Token -> Token -> Token
max :: Token -> Token -> Token
$cmin :: Token -> Token -> Token
min :: Token -> Token -> Token
Ord, Int -> Token -> ShowS
[Token] -> ShowS
Token -> String
(Int -> Token -> ShowS)
-> (Token -> String) -> ([Token] -> ShowS) -> Show Token
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Token -> ShowS
showsPrec :: Int -> Token -> ShowS
$cshow :: Token -> String
show :: Token -> String
$cshowList :: [Token] -> ShowS
showList :: [Token] -> ShowS
Show)
  deriving newtype (Text -> Either Text Token
ByteString -> Either Text Token
(Text -> Either Text Token)
-> (ByteString -> Either Text Token)
-> (Text -> Either Text Token)
-> FromHttpApiData Token
forall a.
(Text -> Either Text a)
-> (ByteString -> Either Text a)
-> (Text -> Either Text a)
-> FromHttpApiData a
$cparseUrlPiece :: Text -> Either Text Token
parseUrlPiece :: Text -> Either Text Token
$cparseHeader :: ByteString -> Either Text Token
parseHeader :: ByteString -> Either Text Token
$cparseQueryParam :: Text -> Either Text Token
parseQueryParam :: Text -> Either Text Token
FromHttpApiData, Token -> Text
Token -> ByteString
Token -> Builder
(Token -> Text)
-> (Token -> Builder)
-> (Token -> ByteString)
-> (Token -> Text)
-> (Token -> Builder)
-> ToHttpApiData Token
forall a.
(a -> Text)
-> (a -> Builder)
-> (a -> ByteString)
-> (a -> Text)
-> (a -> Builder)
-> ToHttpApiData a
$ctoUrlPiece :: Token -> Text
toUrlPiece :: Token -> Text
$ctoEncodedUrlPiece :: Token -> Builder
toEncodedUrlPiece :: Token -> Builder
$ctoHeader :: Token -> ByteString
toHeader :: Token -> ByteString
$ctoQueryParam :: Token -> Text
toQueryParam :: Token -> Text
$ctoEncodedQueryParam :: Token -> Builder
toEncodedQueryParam :: Token -> Builder
ToHttpApiData, Parser Token
Parser Token -> FromByteString Token
forall a. Parser a -> FromByteString a
$cparser :: Parser Token
parser :: Parser Token
FromByteString, Token -> Builder
(Token -> Builder) -> ToByteString Token
forall a. (a -> Builder) -> ToByteString a
$cbuilder :: Token -> Builder
builder :: Token -> Builder
ToByteString, Gen Token
Gen Token -> (Token -> [Token]) -> Arbitrary Token
Token -> [Token]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen Token
arbitrary :: Gen Token
$cshrink :: Token -> [Token]
shrink :: Token -> [Token]
Arbitrary)
  deriving ([Token] -> Value
[Token] -> Encoding
Token -> Value
Token -> Encoding
(Token -> Value)
-> (Token -> Encoding)
-> ([Token] -> Value)
-> ([Token] -> Encoding)
-> ToJSON Token
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: Token -> Value
toJSON :: Token -> Value
$ctoEncoding :: Token -> Encoding
toEncoding :: Token -> Encoding
$ctoJSONList :: [Token] -> Value
toJSONList :: [Token] -> Value
$ctoEncodingList :: [Token] -> Encoding
toEncodingList :: [Token] -> Encoding
A.ToJSON, Value -> Parser [Token]
Value -> Parser Token
(Value -> Parser Token)
-> (Value -> Parser [Token]) -> FromJSON Token
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser Token
parseJSON :: Value -> Parser Token
$cparseJSONList :: Value -> Parser [Token]
parseJSONList :: Value -> Parser [Token]
A.FromJSON, Typeable Token
Typeable Token =>
(Proxy Token -> Declare (Definitions Schema) NamedSchema)
-> ToSchema Token
Proxy Token -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy Token -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy Token -> Declare (Definitions Schema) NamedSchema
S.ToSchema) via (Schema Token)

instance ToParamSchema Token where
  toParamSchema :: Proxy Token -> Schema
toParamSchema Proxy Token
_ = Proxy Text -> Schema
forall a. ToParamSchema a => Proxy a -> Schema
S.toParamSchema (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @Text)

instance ToSchema Token where
  schema :: SchemaP NamedSwaggerDoc Value Value Token Token
schema = Text -> Token
Token (Text -> Token)
-> SchemaP NamedSwaggerDoc Value Value Token Text
-> SchemaP NamedSwaggerDoc Value Value Token Token
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> Text
tokenText (Token -> Text)
-> SchemaP NamedSwaggerDoc Value Value Text Text
-> SchemaP NamedSwaggerDoc Value Value Token Text
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP NamedSwaggerDoc Value Value Text Text
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema

newtype AppName = AppName
  { AppName -> Text
appNameText :: Text
  }
  deriving stock (AppName -> AppName -> Bool
(AppName -> AppName -> Bool)
-> (AppName -> AppName -> Bool) -> Eq AppName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AppName -> AppName -> Bool
== :: AppName -> AppName -> Bool
$c/= :: AppName -> AppName -> Bool
/= :: AppName -> AppName -> Bool
Eq, Eq AppName
Eq AppName =>
(AppName -> AppName -> Ordering)
-> (AppName -> AppName -> Bool)
-> (AppName -> AppName -> Bool)
-> (AppName -> AppName -> Bool)
-> (AppName -> AppName -> Bool)
-> (AppName -> AppName -> AppName)
-> (AppName -> AppName -> AppName)
-> Ord AppName
AppName -> AppName -> Bool
AppName -> AppName -> Ordering
AppName -> AppName -> AppName
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 :: AppName -> AppName -> Ordering
compare :: AppName -> AppName -> Ordering
$c< :: AppName -> AppName -> Bool
< :: AppName -> AppName -> Bool
$c<= :: AppName -> AppName -> Bool
<= :: AppName -> AppName -> Bool
$c> :: AppName -> AppName -> Bool
> :: AppName -> AppName -> Bool
$c>= :: AppName -> AppName -> Bool
>= :: AppName -> AppName -> Bool
$cmax :: AppName -> AppName -> AppName
max :: AppName -> AppName -> AppName
$cmin :: AppName -> AppName -> AppName
min :: AppName -> AppName -> AppName
Ord, Int -> AppName -> ShowS
[AppName] -> ShowS
AppName -> String
(Int -> AppName -> ShowS)
-> (AppName -> String) -> ([AppName] -> ShowS) -> Show AppName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AppName -> ShowS
showsPrec :: Int -> AppName -> ShowS
$cshow :: AppName -> String
show :: AppName -> String
$cshowList :: [AppName] -> ShowS
showList :: [AppName] -> ShowS
Show)
  deriving newtype (String -> AppName
(String -> AppName) -> IsString AppName
forall a. (String -> a) -> IsString a
$cfromString :: String -> AppName
fromString :: String -> AppName
IsString, Gen AppName
Gen AppName -> (AppName -> [AppName]) -> Arbitrary AppName
AppName -> [AppName]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen AppName
arbitrary :: Gen AppName
$cshrink :: AppName -> [AppName]
shrink :: AppName -> [AppName]
Arbitrary)
  deriving ([AppName] -> Value
[AppName] -> Encoding
AppName -> Value
AppName -> Encoding
(AppName -> Value)
-> (AppName -> Encoding)
-> ([AppName] -> Value)
-> ([AppName] -> Encoding)
-> ToJSON AppName
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: AppName -> Value
toJSON :: AppName -> Value
$ctoEncoding :: AppName -> Encoding
toEncoding :: AppName -> Encoding
$ctoJSONList :: [AppName] -> Value
toJSONList :: [AppName] -> Value
$ctoEncodingList :: [AppName] -> Encoding
toEncodingList :: [AppName] -> Encoding
A.ToJSON, Value -> Parser [AppName]
Value -> Parser AppName
(Value -> Parser AppName)
-> (Value -> Parser [AppName]) -> FromJSON AppName
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser AppName
parseJSON :: Value -> Parser AppName
$cparseJSONList :: Value -> Parser [AppName]
parseJSONList :: Value -> Parser [AppName]
A.FromJSON, Typeable AppName
Typeable AppName =>
(Proxy AppName -> Declare (Definitions Schema) NamedSchema)
-> ToSchema AppName
Proxy AppName -> Declare (Definitions Schema) NamedSchema
forall a.
Typeable a =>
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
$cdeclareNamedSchema :: Proxy AppName -> Declare (Definitions Schema) NamedSchema
declareNamedSchema :: Proxy AppName -> Declare (Definitions Schema) NamedSchema
S.ToSchema) via (Schema AppName)

instance ToSchema AppName where
  schema :: SchemaP NamedSwaggerDoc Value Value AppName AppName
schema = Text -> AppName
AppName (Text -> AppName)
-> SchemaP NamedSwaggerDoc Value Value AppName Text
-> SchemaP NamedSwaggerDoc Value Value AppName AppName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AppName -> Text
appNameText (AppName -> Text)
-> SchemaP NamedSwaggerDoc Value Value Text Text
-> SchemaP NamedSwaggerDoc Value Value AppName Text
forall (p :: * -> * -> *) a a' b.
Profunctor p =>
(a -> a') -> p a' b -> p a b
.= SchemaP NamedSwaggerDoc Value Value Text Text
forall a. ToSchema a => ValueSchema NamedSwaggerDoc a
schema

makeLenses ''PushToken

--------------------------------------------------------------------------------
-- Add token types

type AddTokenErrorResponses =
  '[ ErrorResponse 'E.AddTokenErrorNoBudget,
     ErrorResponse 'E.AddTokenErrorNotFound,
     ErrorResponse 'E.AddTokenErrorInvalid,
     ErrorResponse 'E.AddTokenErrorTooLong,
     ErrorResponse 'E.AddTokenErrorMetadataTooLong,
     ErrorResponse 'E.AddTokenErrorApnsVoipNotSupported
   ]

type AddTokenSuccessResponses =
  WithHeaders
    '[ Header "Location" Token
     ]
    AddTokenSuccess
    (Respond 201 "Push token registered" PushToken)

type AddTokenResponses = AddTokenErrorResponses .++ '[AddTokenSuccessResponses]

data AddTokenError
  = AddTokenErrorNoBudget
  | AddTokenErrorNotFound
  | AddTokenErrorInvalid
  | AddTokenErrorTooLong
  | AddTokenErrorMetadataTooLong
  | AddTokenErrorApnsVoipNotSupported
  deriving (Int -> AddTokenError -> ShowS
[AddTokenError] -> ShowS
AddTokenError -> String
(Int -> AddTokenError -> ShowS)
-> (AddTokenError -> String)
-> ([AddTokenError] -> ShowS)
-> Show AddTokenError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AddTokenError -> ShowS
showsPrec :: Int -> AddTokenError -> ShowS
$cshow :: AddTokenError -> String
show :: AddTokenError -> String
$cshowList :: [AddTokenError] -> ShowS
showList :: [AddTokenError] -> ShowS
Show, (forall x. AddTokenError -> Rep AddTokenError x)
-> (forall x. Rep AddTokenError x -> AddTokenError)
-> Generic AddTokenError
forall x. Rep AddTokenError x -> AddTokenError
forall x. AddTokenError -> Rep AddTokenError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AddTokenError -> Rep AddTokenError x
from :: forall x. AddTokenError -> Rep AddTokenError x
$cto :: forall x. Rep AddTokenError x -> AddTokenError
to :: forall x. Rep AddTokenError x -> AddTokenError
Generic)
  deriving (AsUnion AddTokenErrorResponses) via GenericAsUnion AddTokenErrorResponses AddTokenError

instance GSOP.Generic AddTokenError

data AddTokenSuccess = AddTokenSuccess PushToken

instance AsHeaders '[Token] PushToken AddTokenSuccess where
  fromHeaders :: (NP I '[Token], PushToken) -> AddTokenSuccess
fromHeaders (I x
_ :* NP I xs
Nil, PushToken
t) = PushToken -> AddTokenSuccess
AddTokenSuccess PushToken
t
  toHeaders :: AddTokenSuccess -> (NP I '[Token], PushToken)
toHeaders (AddTokenSuccess PushToken
t) = (Token -> I Token
forall a. a -> I a
I (PushToken
t PushToken -> Getting Token PushToken Token -> Token
forall s a. s -> Getting a s a -> a
^. Getting Token PushToken Token
Lens' PushToken Token
token) I Token -> NP I '[] -> NP I '[Token]
forall {k} (a :: k -> *) (x :: k) (xs :: [k]).
a x -> NP a xs -> NP a (x : xs)
:* NP I '[]
forall {k} (a :: k -> *). NP a '[]
Nil, PushToken
t)

instance (res ~ AddTokenResponses) => AsUnion res (Either AddTokenError AddTokenSuccess) where
  toUnion :: Either AddTokenError AddTokenSuccess -> Union (ResponseTypes res)
toUnion = (AddTokenError
 -> Union
      '[DynError, DynError, DynError, DynError, DynError, DynError])
-> (AddTokenSuccess -> Union '[AddTokenSuccess])
-> Either AddTokenError AddTokenSuccess
-> Union
     ('[DynError, DynError, DynError, DynError, DynError, DynError]
      .++ '[AddTokenSuccess])
forall (as :: [*]) (bs :: [*]) a b.
(InjectAfter as bs, InjectBefore as bs) =>
(a -> Union as)
-> (b -> Union bs) -> Either a b -> Union (as .++ bs)
eitherToUnion (forall (as :: [*]) r. AsUnion as r => r -> Union (ResponseTypes as)
toUnion @AddTokenErrorResponses) (I AddTokenSuccess -> Union '[AddTokenSuccess]
forall {k} (a :: k -> *) (x :: k) (xs :: [k]). a x -> NS a (x : xs)
Z (I AddTokenSuccess -> Union '[AddTokenSuccess])
-> (AddTokenSuccess -> I AddTokenSuccess)
-> AddTokenSuccess
-> Union '[AddTokenSuccess]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AddTokenSuccess -> I AddTokenSuccess
forall a. a -> I a
I)
  fromUnion :: Union (ResponseTypes res) -> Either AddTokenError AddTokenSuccess
fromUnion = (Union
   '[DynError, DynError, DynError, DynError, DynError, DynError]
 -> AddTokenError)
-> (Union '[AddTokenSuccess] -> AddTokenSuccess)
-> Union
     ('[DynError, DynError, DynError, DynError, DynError, DynError]
      .++ '[AddTokenSuccess])
-> Either AddTokenError AddTokenSuccess
forall (as :: [*]) (bs :: [*]) a b.
EitherFromUnion as bs =>
(Union as -> a)
-> (Union bs -> b) -> Union (as .++ bs) -> Either a b
forall a b.
(Union
   '[DynError, DynError, DynError, DynError, DynError, DynError]
 -> a)
-> (Union '[AddTokenSuccess] -> b)
-> Union
     ('[DynError, DynError, DynError, DynError, DynError, DynError]
      .++ '[AddTokenSuccess])
-> Either a b
eitherFromUnion (forall (as :: [*]) r. AsUnion as r => Union (ResponseTypes as) -> r
fromUnion @AddTokenErrorResponses) (I AddTokenSuccess -> AddTokenSuccess
forall a. I a -> a
unI (I AddTokenSuccess -> AddTokenSuccess)
-> (Union '[AddTokenSuccess] -> I AddTokenSuccess)
-> Union '[AddTokenSuccess]
-> AddTokenSuccess
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Union '[AddTokenSuccess] -> I AddTokenSuccess
forall {k} (f :: k -> *) (x :: k). NS f '[x] -> f x
unZ)

--------------------------------------------------------------------------------
-- Delete token types

type DeleteTokenResponses =
  '[ ErrorResponse 'E.TokenNotFound,
     RespondEmpty 204 "Push token unregistered"
   ]