{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.AmplifyUiBuilder.RefreshToken
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Refreshes a previously issued access token that might have expired.
module Amazonka.AmplifyUiBuilder.RefreshToken
  ( -- * Creating a Request
    RefreshToken (..),
    newRefreshToken,

    -- * Request Lenses
    refreshToken_provider,
    refreshToken_refreshTokenBody,

    -- * Destructuring the Response
    RefreshTokenResponse (..),
    newRefreshTokenResponse,

    -- * Response Lenses
    refreshTokenResponse_httpStatus,
    refreshTokenResponse_accessToken,
    refreshTokenResponse_expiresIn,
  )
where

import Amazonka.AmplifyUiBuilder.Types
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newRefreshToken' smart constructor.
data RefreshToken = RefreshToken'
  { -- | The third-party provider for the token. The only valid value is @figma@.
    RefreshToken -> TokenProviders
provider :: TokenProviders,
    -- | Information about the refresh token request.
    RefreshToken -> RefreshTokenRequestBody
refreshTokenBody :: RefreshTokenRequestBody
  }
  deriving (RefreshToken -> RefreshToken -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RefreshToken -> RefreshToken -> Bool
$c/= :: RefreshToken -> RefreshToken -> Bool
== :: RefreshToken -> RefreshToken -> Bool
$c== :: RefreshToken -> RefreshToken -> Bool
Prelude.Eq, Int -> RefreshToken -> ShowS
[RefreshToken] -> ShowS
RefreshToken -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RefreshToken] -> ShowS
$cshowList :: [RefreshToken] -> ShowS
show :: RefreshToken -> String
$cshow :: RefreshToken -> String
showsPrec :: Int -> RefreshToken -> ShowS
$cshowsPrec :: Int -> RefreshToken -> ShowS
Prelude.Show, forall x. Rep RefreshToken x -> RefreshToken
forall x. RefreshToken -> Rep RefreshToken x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RefreshToken x -> RefreshToken
$cfrom :: forall x. RefreshToken -> Rep RefreshToken x
Prelude.Generic)

-- |
-- Create a value of 'RefreshToken' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'provider', 'refreshToken_provider' - The third-party provider for the token. The only valid value is @figma@.
--
-- 'refreshTokenBody', 'refreshToken_refreshTokenBody' - Information about the refresh token request.
newRefreshToken ::
  -- | 'provider'
  TokenProviders ->
  -- | 'refreshTokenBody'
  RefreshTokenRequestBody ->
  RefreshToken
newRefreshToken :: TokenProviders -> RefreshTokenRequestBody -> RefreshToken
newRefreshToken TokenProviders
pProvider_ RefreshTokenRequestBody
pRefreshTokenBody_ =
  RefreshToken'
    { $sel:provider:RefreshToken' :: TokenProviders
provider = TokenProviders
pProvider_,
      $sel:refreshTokenBody:RefreshToken' :: RefreshTokenRequestBody
refreshTokenBody = RefreshTokenRequestBody
pRefreshTokenBody_
    }

-- | The third-party provider for the token. The only valid value is @figma@.
refreshToken_provider :: Lens.Lens' RefreshToken TokenProviders
refreshToken_provider :: Lens' RefreshToken TokenProviders
refreshToken_provider = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RefreshToken' {TokenProviders
provider :: TokenProviders
$sel:provider:RefreshToken' :: RefreshToken -> TokenProviders
provider} -> TokenProviders
provider) (\s :: RefreshToken
s@RefreshToken' {} TokenProviders
a -> RefreshToken
s {$sel:provider:RefreshToken' :: TokenProviders
provider = TokenProviders
a} :: RefreshToken)

-- | Information about the refresh token request.
refreshToken_refreshTokenBody :: Lens.Lens' RefreshToken RefreshTokenRequestBody
refreshToken_refreshTokenBody :: Lens' RefreshToken RefreshTokenRequestBody
refreshToken_refreshTokenBody = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RefreshToken' {RefreshTokenRequestBody
refreshTokenBody :: RefreshTokenRequestBody
$sel:refreshTokenBody:RefreshToken' :: RefreshToken -> RefreshTokenRequestBody
refreshTokenBody} -> RefreshTokenRequestBody
refreshTokenBody) (\s :: RefreshToken
s@RefreshToken' {} RefreshTokenRequestBody
a -> RefreshToken
s {$sel:refreshTokenBody:RefreshToken' :: RefreshTokenRequestBody
refreshTokenBody = RefreshTokenRequestBody
a} :: RefreshToken)

instance Core.AWSRequest RefreshToken where
  type AWSResponse RefreshToken = RefreshTokenResponse
  request :: (Service -> Service) -> RefreshToken -> Request RefreshToken
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy RefreshToken
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse RefreshToken)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Int -> Sensitive Text -> Int -> RefreshTokenResponse
RefreshTokenResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"accessToken")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"expiresIn")
      )

instance Prelude.Hashable RefreshToken where
  hashWithSalt :: Int -> RefreshToken -> Int
hashWithSalt Int
_salt RefreshToken' {RefreshTokenRequestBody
TokenProviders
refreshTokenBody :: RefreshTokenRequestBody
provider :: TokenProviders
$sel:refreshTokenBody:RefreshToken' :: RefreshToken -> RefreshTokenRequestBody
$sel:provider:RefreshToken' :: RefreshToken -> TokenProviders
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` TokenProviders
provider
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` RefreshTokenRequestBody
refreshTokenBody

instance Prelude.NFData RefreshToken where
  rnf :: RefreshToken -> ()
rnf RefreshToken' {RefreshTokenRequestBody
TokenProviders
refreshTokenBody :: RefreshTokenRequestBody
provider :: TokenProviders
$sel:refreshTokenBody:RefreshToken' :: RefreshToken -> RefreshTokenRequestBody
$sel:provider:RefreshToken' :: RefreshToken -> TokenProviders
..} =
    forall a. NFData a => a -> ()
Prelude.rnf TokenProviders
provider
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf RefreshTokenRequestBody
refreshTokenBody

instance Data.ToHeaders RefreshToken where
  toHeaders :: RefreshToken -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON RefreshToken where
  toJSON :: RefreshToken -> Value
toJSON RefreshToken' {RefreshTokenRequestBody
TokenProviders
refreshTokenBody :: RefreshTokenRequestBody
provider :: TokenProviders
$sel:refreshTokenBody:RefreshToken' :: RefreshToken -> RefreshTokenRequestBody
$sel:provider:RefreshToken' :: RefreshToken -> TokenProviders
..} =
    forall a. ToJSON a => a -> Value
Data.toJSON RefreshTokenRequestBody
refreshTokenBody

instance Data.ToPath RefreshToken where
  toPath :: RefreshToken -> ByteString
toPath RefreshToken' {RefreshTokenRequestBody
TokenProviders
refreshTokenBody :: RefreshTokenRequestBody
provider :: TokenProviders
$sel:refreshTokenBody:RefreshToken' :: RefreshToken -> RefreshTokenRequestBody
$sel:provider:RefreshToken' :: RefreshToken -> TokenProviders
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/tokens/", forall a. ToByteString a => a -> ByteString
Data.toBS TokenProviders
provider, ByteString
"/refresh"]

instance Data.ToQuery RefreshToken where
  toQuery :: RefreshToken -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newRefreshTokenResponse' smart constructor.
data RefreshTokenResponse = RefreshTokenResponse'
  { -- | The response's http status code.
    RefreshTokenResponse -> Int
httpStatus :: Prelude.Int,
    -- | The access token.
    RefreshTokenResponse -> Sensitive Text
accessToken :: Data.Sensitive Prelude.Text,
    -- | The date and time when the new access token expires.
    RefreshTokenResponse -> Int
expiresIn :: Prelude.Int
  }
  deriving (RefreshTokenResponse -> RefreshTokenResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RefreshTokenResponse -> RefreshTokenResponse -> Bool
$c/= :: RefreshTokenResponse -> RefreshTokenResponse -> Bool
== :: RefreshTokenResponse -> RefreshTokenResponse -> Bool
$c== :: RefreshTokenResponse -> RefreshTokenResponse -> Bool
Prelude.Eq, Int -> RefreshTokenResponse -> ShowS
[RefreshTokenResponse] -> ShowS
RefreshTokenResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RefreshTokenResponse] -> ShowS
$cshowList :: [RefreshTokenResponse] -> ShowS
show :: RefreshTokenResponse -> String
$cshow :: RefreshTokenResponse -> String
showsPrec :: Int -> RefreshTokenResponse -> ShowS
$cshowsPrec :: Int -> RefreshTokenResponse -> ShowS
Prelude.Show, forall x. Rep RefreshTokenResponse x -> RefreshTokenResponse
forall x. RefreshTokenResponse -> Rep RefreshTokenResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RefreshTokenResponse x -> RefreshTokenResponse
$cfrom :: forall x. RefreshTokenResponse -> Rep RefreshTokenResponse x
Prelude.Generic)

-- |
-- Create a value of 'RefreshTokenResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'httpStatus', 'refreshTokenResponse_httpStatus' - The response's http status code.
--
-- 'accessToken', 'refreshTokenResponse_accessToken' - The access token.
--
-- 'expiresIn', 'refreshTokenResponse_expiresIn' - The date and time when the new access token expires.
newRefreshTokenResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'accessToken'
  Prelude.Text ->
  -- | 'expiresIn'
  Prelude.Int ->
  RefreshTokenResponse
newRefreshTokenResponse :: Int -> Text -> Int -> RefreshTokenResponse
newRefreshTokenResponse
  Int
pHttpStatus_
  Text
pAccessToken_
  Int
pExpiresIn_ =
    RefreshTokenResponse'
      { $sel:httpStatus:RefreshTokenResponse' :: Int
httpStatus = Int
pHttpStatus_,
        $sel:accessToken:RefreshTokenResponse' :: Sensitive Text
accessToken = forall a. Iso' (Sensitive a) a
Data._Sensitive forall t b. AReview t b -> b -> t
Lens.# Text
pAccessToken_,
        $sel:expiresIn:RefreshTokenResponse' :: Int
expiresIn = Int
pExpiresIn_
      }

-- | The response's http status code.
refreshTokenResponse_httpStatus :: Lens.Lens' RefreshTokenResponse Prelude.Int
refreshTokenResponse_httpStatus :: Lens' RefreshTokenResponse Int
refreshTokenResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RefreshTokenResponse' {Int
httpStatus :: Int
$sel:httpStatus:RefreshTokenResponse' :: RefreshTokenResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: RefreshTokenResponse
s@RefreshTokenResponse' {} Int
a -> RefreshTokenResponse
s {$sel:httpStatus:RefreshTokenResponse' :: Int
httpStatus = Int
a} :: RefreshTokenResponse)

-- | The access token.
refreshTokenResponse_accessToken :: Lens.Lens' RefreshTokenResponse Prelude.Text
refreshTokenResponse_accessToken :: Lens' RefreshTokenResponse Text
refreshTokenResponse_accessToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RefreshTokenResponse' {Sensitive Text
accessToken :: Sensitive Text
$sel:accessToken:RefreshTokenResponse' :: RefreshTokenResponse -> Sensitive Text
accessToken} -> Sensitive Text
accessToken) (\s :: RefreshTokenResponse
s@RefreshTokenResponse' {} Sensitive Text
a -> RefreshTokenResponse
s {$sel:accessToken:RefreshTokenResponse' :: Sensitive Text
accessToken = Sensitive Text
a} :: RefreshTokenResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. Iso' (Sensitive a) a
Data._Sensitive

-- | The date and time when the new access token expires.
refreshTokenResponse_expiresIn :: Lens.Lens' RefreshTokenResponse Prelude.Int
refreshTokenResponse_expiresIn :: Lens' RefreshTokenResponse Int
refreshTokenResponse_expiresIn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RefreshTokenResponse' {Int
expiresIn :: Int
$sel:expiresIn:RefreshTokenResponse' :: RefreshTokenResponse -> Int
expiresIn} -> Int
expiresIn) (\s :: RefreshTokenResponse
s@RefreshTokenResponse' {} Int
a -> RefreshTokenResponse
s {$sel:expiresIn:RefreshTokenResponse' :: Int
expiresIn = Int
a} :: RefreshTokenResponse)

instance Prelude.NFData RefreshTokenResponse where
  rnf :: RefreshTokenResponse -> ()
rnf RefreshTokenResponse' {Int
Sensitive Text
expiresIn :: Int
accessToken :: Sensitive Text
httpStatus :: Int
$sel:expiresIn:RefreshTokenResponse' :: RefreshTokenResponse -> Int
$sel:accessToken:RefreshTokenResponse' :: RefreshTokenResponse -> Sensitive Text
$sel:httpStatus:RefreshTokenResponse' :: RefreshTokenResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Sensitive Text
accessToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
expiresIn