{-# 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.Transfer.CreateAgreement
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates an agreement. An agreement is a bilateral trading partner
-- agreement, or partnership, between an Transfer Family server and an AS2
-- process. The agreement defines the file and message transfer
-- relationship between the server and the AS2 process. To define an
-- agreement, Transfer Family combines a server, local profile, partner
-- profile, certificate, and other attributes.
--
-- The partner is identified with the @PartnerProfileId@, and the AS2
-- process is identified with the @LocalProfileId@.
module Amazonka.Transfer.CreateAgreement
  ( -- * Creating a Request
    CreateAgreement (..),
    newCreateAgreement,

    -- * Request Lenses
    createAgreement_description,
    createAgreement_status,
    createAgreement_tags,
    createAgreement_serverId,
    createAgreement_localProfileId,
    createAgreement_partnerProfileId,
    createAgreement_baseDirectory,
    createAgreement_accessRole,

    -- * Destructuring the Response
    CreateAgreementResponse (..),
    newCreateAgreementResponse,

    -- * Response Lenses
    createAgreementResponse_httpStatus,
    createAgreementResponse_agreementId,
  )
where

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
import Amazonka.Transfer.Types

-- | /See:/ 'newCreateAgreement' smart constructor.
data CreateAgreement = CreateAgreement'
  { -- | A name or short description to identify the agreement.
    CreateAgreement -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | The status of the agreement. The agreement can be either @ACTIVE@ or
    -- @INACTIVE@.
    CreateAgreement -> Maybe AgreementStatusType
status :: Prelude.Maybe AgreementStatusType,
    -- | Key-value pairs that can be used to group and search for agreements.
    CreateAgreement -> Maybe (NonEmpty Tag)
tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
    -- | A system-assigned unique identifier for a server instance. This is the
    -- specific server that the agreement uses.
    CreateAgreement -> Text
serverId :: Prelude.Text,
    -- | A unique identifier for the AS2 local profile.
    CreateAgreement -> Text
localProfileId :: Prelude.Text,
    -- | A unique identifier for the partner profile used in the agreement.
    CreateAgreement -> Text
partnerProfileId :: Prelude.Text,
    -- | The landing directory (folder) for files transferred by using the AS2
    -- protocol.
    --
    -- A @BaseDirectory@ example is
    -- /DOC-EXAMPLE-BUCKET/\//home/\//mydirectory/.
    CreateAgreement -> Text
baseDirectory :: Prelude.Text,
    -- | With AS2, you can send files by calling @StartFileTransfer@ and
    -- specifying the file paths in the request parameter, @SendFilePaths@. We
    -- use the file’s parent directory (for example, for
    -- @--send-file-paths \/bucket\/dir\/file.txt@, parent directory is
    -- @\/bucket\/dir\/@) to temporarily store a processed AS2 message file,
    -- store the MDN when we receive them from the partner, and write a final
    -- JSON file containing relevant metadata of the transmission. So, the
    -- @AccessRole@ needs to provide read and write access to the parent
    -- directory of the file location used in the @StartFileTransfer@ request.
    -- Additionally, you need to provide read and write access to the parent
    -- directory of the files that you intend to send with @StartFileTransfer@.
    CreateAgreement -> Text
accessRole :: Prelude.Text
  }
  deriving (CreateAgreement -> CreateAgreement -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAgreement -> CreateAgreement -> Bool
$c/= :: CreateAgreement -> CreateAgreement -> Bool
== :: CreateAgreement -> CreateAgreement -> Bool
$c== :: CreateAgreement -> CreateAgreement -> Bool
Prelude.Eq, ReadPrec [CreateAgreement]
ReadPrec CreateAgreement
Int -> ReadS CreateAgreement
ReadS [CreateAgreement]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAgreement]
$creadListPrec :: ReadPrec [CreateAgreement]
readPrec :: ReadPrec CreateAgreement
$creadPrec :: ReadPrec CreateAgreement
readList :: ReadS [CreateAgreement]
$creadList :: ReadS [CreateAgreement]
readsPrec :: Int -> ReadS CreateAgreement
$creadsPrec :: Int -> ReadS CreateAgreement
Prelude.Read, Int -> CreateAgreement -> ShowS
[CreateAgreement] -> ShowS
CreateAgreement -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAgreement] -> ShowS
$cshowList :: [CreateAgreement] -> ShowS
show :: CreateAgreement -> String
$cshow :: CreateAgreement -> String
showsPrec :: Int -> CreateAgreement -> ShowS
$cshowsPrec :: Int -> CreateAgreement -> ShowS
Prelude.Show, forall x. Rep CreateAgreement x -> CreateAgreement
forall x. CreateAgreement -> Rep CreateAgreement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateAgreement x -> CreateAgreement
$cfrom :: forall x. CreateAgreement -> Rep CreateAgreement x
Prelude.Generic)

-- |
-- Create a value of 'CreateAgreement' 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:
--
-- 'description', 'createAgreement_description' - A name or short description to identify the agreement.
--
-- 'status', 'createAgreement_status' - The status of the agreement. The agreement can be either @ACTIVE@ or
-- @INACTIVE@.
--
-- 'tags', 'createAgreement_tags' - Key-value pairs that can be used to group and search for agreements.
--
-- 'serverId', 'createAgreement_serverId' - A system-assigned unique identifier for a server instance. This is the
-- specific server that the agreement uses.
--
-- 'localProfileId', 'createAgreement_localProfileId' - A unique identifier for the AS2 local profile.
--
-- 'partnerProfileId', 'createAgreement_partnerProfileId' - A unique identifier for the partner profile used in the agreement.
--
-- 'baseDirectory', 'createAgreement_baseDirectory' - The landing directory (folder) for files transferred by using the AS2
-- protocol.
--
-- A @BaseDirectory@ example is
-- /DOC-EXAMPLE-BUCKET/\//home/\//mydirectory/.
--
-- 'accessRole', 'createAgreement_accessRole' - With AS2, you can send files by calling @StartFileTransfer@ and
-- specifying the file paths in the request parameter, @SendFilePaths@. We
-- use the file’s parent directory (for example, for
-- @--send-file-paths \/bucket\/dir\/file.txt@, parent directory is
-- @\/bucket\/dir\/@) to temporarily store a processed AS2 message file,
-- store the MDN when we receive them from the partner, and write a final
-- JSON file containing relevant metadata of the transmission. So, the
-- @AccessRole@ needs to provide read and write access to the parent
-- directory of the file location used in the @StartFileTransfer@ request.
-- Additionally, you need to provide read and write access to the parent
-- directory of the files that you intend to send with @StartFileTransfer@.
newCreateAgreement ::
  -- | 'serverId'
  Prelude.Text ->
  -- | 'localProfileId'
  Prelude.Text ->
  -- | 'partnerProfileId'
  Prelude.Text ->
  -- | 'baseDirectory'
  Prelude.Text ->
  -- | 'accessRole'
  Prelude.Text ->
  CreateAgreement
newCreateAgreement :: Text -> Text -> Text -> Text -> Text -> CreateAgreement
newCreateAgreement
  Text
pServerId_
  Text
pLocalProfileId_
  Text
pPartnerProfileId_
  Text
pBaseDirectory_
  Text
pAccessRole_ =
    CreateAgreement'
      { $sel:description:CreateAgreement' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
        $sel:status:CreateAgreement' :: Maybe AgreementStatusType
status = forall a. Maybe a
Prelude.Nothing,
        $sel:tags:CreateAgreement' :: Maybe (NonEmpty Tag)
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:serverId:CreateAgreement' :: Text
serverId = Text
pServerId_,
        $sel:localProfileId:CreateAgreement' :: Text
localProfileId = Text
pLocalProfileId_,
        $sel:partnerProfileId:CreateAgreement' :: Text
partnerProfileId = Text
pPartnerProfileId_,
        $sel:baseDirectory:CreateAgreement' :: Text
baseDirectory = Text
pBaseDirectory_,
        $sel:accessRole:CreateAgreement' :: Text
accessRole = Text
pAccessRole_
      }

-- | A name or short description to identify the agreement.
createAgreement_description :: Lens.Lens' CreateAgreement (Prelude.Maybe Prelude.Text)
createAgreement_description :: Lens' CreateAgreement (Maybe Text)
createAgreement_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Maybe Text
description :: Maybe Text
$sel:description:CreateAgreement' :: CreateAgreement -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateAgreement
s@CreateAgreement' {} Maybe Text
a -> CreateAgreement
s {$sel:description:CreateAgreement' :: Maybe Text
description = Maybe Text
a} :: CreateAgreement)

-- | The status of the agreement. The agreement can be either @ACTIVE@ or
-- @INACTIVE@.
createAgreement_status :: Lens.Lens' CreateAgreement (Prelude.Maybe AgreementStatusType)
createAgreement_status :: Lens' CreateAgreement (Maybe AgreementStatusType)
createAgreement_status = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Maybe AgreementStatusType
status :: Maybe AgreementStatusType
$sel:status:CreateAgreement' :: CreateAgreement -> Maybe AgreementStatusType
status} -> Maybe AgreementStatusType
status) (\s :: CreateAgreement
s@CreateAgreement' {} Maybe AgreementStatusType
a -> CreateAgreement
s {$sel:status:CreateAgreement' :: Maybe AgreementStatusType
status = Maybe AgreementStatusType
a} :: CreateAgreement)

-- | Key-value pairs that can be used to group and search for agreements.
createAgreement_tags :: Lens.Lens' CreateAgreement (Prelude.Maybe (Prelude.NonEmpty Tag))
createAgreement_tags :: Lens' CreateAgreement (Maybe (NonEmpty Tag))
createAgreement_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Maybe (NonEmpty Tag)
tags :: Maybe (NonEmpty Tag)
$sel:tags:CreateAgreement' :: CreateAgreement -> Maybe (NonEmpty Tag)
tags} -> Maybe (NonEmpty Tag)
tags) (\s :: CreateAgreement
s@CreateAgreement' {} Maybe (NonEmpty Tag)
a -> CreateAgreement
s {$sel:tags:CreateAgreement' :: Maybe (NonEmpty Tag)
tags = Maybe (NonEmpty Tag)
a} :: CreateAgreement) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A system-assigned unique identifier for a server instance. This is the
-- specific server that the agreement uses.
createAgreement_serverId :: Lens.Lens' CreateAgreement Prelude.Text
createAgreement_serverId :: Lens' CreateAgreement Text
createAgreement_serverId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Text
serverId :: Text
$sel:serverId:CreateAgreement' :: CreateAgreement -> Text
serverId} -> Text
serverId) (\s :: CreateAgreement
s@CreateAgreement' {} Text
a -> CreateAgreement
s {$sel:serverId:CreateAgreement' :: Text
serverId = Text
a} :: CreateAgreement)

-- | A unique identifier for the AS2 local profile.
createAgreement_localProfileId :: Lens.Lens' CreateAgreement Prelude.Text
createAgreement_localProfileId :: Lens' CreateAgreement Text
createAgreement_localProfileId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Text
localProfileId :: Text
$sel:localProfileId:CreateAgreement' :: CreateAgreement -> Text
localProfileId} -> Text
localProfileId) (\s :: CreateAgreement
s@CreateAgreement' {} Text
a -> CreateAgreement
s {$sel:localProfileId:CreateAgreement' :: Text
localProfileId = Text
a} :: CreateAgreement)

-- | A unique identifier for the partner profile used in the agreement.
createAgreement_partnerProfileId :: Lens.Lens' CreateAgreement Prelude.Text
createAgreement_partnerProfileId :: Lens' CreateAgreement Text
createAgreement_partnerProfileId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Text
partnerProfileId :: Text
$sel:partnerProfileId:CreateAgreement' :: CreateAgreement -> Text
partnerProfileId} -> Text
partnerProfileId) (\s :: CreateAgreement
s@CreateAgreement' {} Text
a -> CreateAgreement
s {$sel:partnerProfileId:CreateAgreement' :: Text
partnerProfileId = Text
a} :: CreateAgreement)

-- | The landing directory (folder) for files transferred by using the AS2
-- protocol.
--
-- A @BaseDirectory@ example is
-- /DOC-EXAMPLE-BUCKET/\//home/\//mydirectory/.
createAgreement_baseDirectory :: Lens.Lens' CreateAgreement Prelude.Text
createAgreement_baseDirectory :: Lens' CreateAgreement Text
createAgreement_baseDirectory = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Text
baseDirectory :: Text
$sel:baseDirectory:CreateAgreement' :: CreateAgreement -> Text
baseDirectory} -> Text
baseDirectory) (\s :: CreateAgreement
s@CreateAgreement' {} Text
a -> CreateAgreement
s {$sel:baseDirectory:CreateAgreement' :: Text
baseDirectory = Text
a} :: CreateAgreement)

-- | With AS2, you can send files by calling @StartFileTransfer@ and
-- specifying the file paths in the request parameter, @SendFilePaths@. We
-- use the file’s parent directory (for example, for
-- @--send-file-paths \/bucket\/dir\/file.txt@, parent directory is
-- @\/bucket\/dir\/@) to temporarily store a processed AS2 message file,
-- store the MDN when we receive them from the partner, and write a final
-- JSON file containing relevant metadata of the transmission. So, the
-- @AccessRole@ needs to provide read and write access to the parent
-- directory of the file location used in the @StartFileTransfer@ request.
-- Additionally, you need to provide read and write access to the parent
-- directory of the files that you intend to send with @StartFileTransfer@.
createAgreement_accessRole :: Lens.Lens' CreateAgreement Prelude.Text
createAgreement_accessRole :: Lens' CreateAgreement Text
createAgreement_accessRole = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreement' {Text
accessRole :: Text
$sel:accessRole:CreateAgreement' :: CreateAgreement -> Text
accessRole} -> Text
accessRole) (\s :: CreateAgreement
s@CreateAgreement' {} Text
a -> CreateAgreement
s {$sel:accessRole:CreateAgreement' :: Text
accessRole = Text
a} :: CreateAgreement)

instance Core.AWSRequest CreateAgreement where
  type
    AWSResponse CreateAgreement =
      CreateAgreementResponse
  request :: (Service -> Service) -> CreateAgreement -> Request CreateAgreement
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 CreateAgreement
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateAgreement)))
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 -> Text -> CreateAgreementResponse
CreateAgreementResponse'
            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
"AgreementId")
      )

instance Prelude.Hashable CreateAgreement where
  hashWithSalt :: Int -> CreateAgreement -> Int
hashWithSalt Int
_salt CreateAgreement' {Maybe (NonEmpty Tag)
Maybe Text
Maybe AgreementStatusType
Text
accessRole :: Text
baseDirectory :: Text
partnerProfileId :: Text
localProfileId :: Text
serverId :: Text
tags :: Maybe (NonEmpty Tag)
status :: Maybe AgreementStatusType
description :: Maybe Text
$sel:accessRole:CreateAgreement' :: CreateAgreement -> Text
$sel:baseDirectory:CreateAgreement' :: CreateAgreement -> Text
$sel:partnerProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:localProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:serverId:CreateAgreement' :: CreateAgreement -> Text
$sel:tags:CreateAgreement' :: CreateAgreement -> Maybe (NonEmpty Tag)
$sel:status:CreateAgreement' :: CreateAgreement -> Maybe AgreementStatusType
$sel:description:CreateAgreement' :: CreateAgreement -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe AgreementStatusType
status
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Tag)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
serverId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
localProfileId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
partnerProfileId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
baseDirectory
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
accessRole

instance Prelude.NFData CreateAgreement where
  rnf :: CreateAgreement -> ()
rnf CreateAgreement' {Maybe (NonEmpty Tag)
Maybe Text
Maybe AgreementStatusType
Text
accessRole :: Text
baseDirectory :: Text
partnerProfileId :: Text
localProfileId :: Text
serverId :: Text
tags :: Maybe (NonEmpty Tag)
status :: Maybe AgreementStatusType
description :: Maybe Text
$sel:accessRole:CreateAgreement' :: CreateAgreement -> Text
$sel:baseDirectory:CreateAgreement' :: CreateAgreement -> Text
$sel:partnerProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:localProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:serverId:CreateAgreement' :: CreateAgreement -> Text
$sel:tags:CreateAgreement' :: CreateAgreement -> Maybe (NonEmpty Tag)
$sel:status:CreateAgreement' :: CreateAgreement -> Maybe AgreementStatusType
$sel:description:CreateAgreement' :: CreateAgreement -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe AgreementStatusType
status
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Tag)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
serverId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
localProfileId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
partnerProfileId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
baseDirectory
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
accessRole

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

instance Data.ToJSON CreateAgreement where
  toJSON :: CreateAgreement -> Value
toJSON CreateAgreement' {Maybe (NonEmpty Tag)
Maybe Text
Maybe AgreementStatusType
Text
accessRole :: Text
baseDirectory :: Text
partnerProfileId :: Text
localProfileId :: Text
serverId :: Text
tags :: Maybe (NonEmpty Tag)
status :: Maybe AgreementStatusType
description :: Maybe Text
$sel:accessRole:CreateAgreement' :: CreateAgreement -> Text
$sel:baseDirectory:CreateAgreement' :: CreateAgreement -> Text
$sel:partnerProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:localProfileId:CreateAgreement' :: CreateAgreement -> Text
$sel:serverId:CreateAgreement' :: CreateAgreement -> Text
$sel:tags:CreateAgreement' :: CreateAgreement -> Maybe (NonEmpty Tag)
$sel:status:CreateAgreement' :: CreateAgreement -> Maybe AgreementStatusType
$sel:description:CreateAgreement' :: CreateAgreement -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Description" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
description,
            (Key
"Status" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe AgreementStatusType
status,
            (Key
"Tags" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe (NonEmpty Tag)
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"ServerId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
serverId),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"LocalProfileId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
localProfileId),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"PartnerProfileId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
partnerProfileId),
            forall a. a -> Maybe a
Prelude.Just (Key
"BaseDirectory" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
baseDirectory),
            forall a. a -> Maybe a
Prelude.Just (Key
"AccessRole" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
accessRole)
          ]
      )

instance Data.ToPath CreateAgreement where
  toPath :: CreateAgreement -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

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

-- | /See:/ 'newCreateAgreementResponse' smart constructor.
data CreateAgreementResponse = CreateAgreementResponse'
  { -- | The response's http status code.
    CreateAgreementResponse -> Int
httpStatus :: Prelude.Int,
    -- | The unique identifier for the agreement. Use this ID for deleting, or
    -- updating an agreement, as well as in any other API calls that require
    -- that you specify the agreement ID.
    CreateAgreementResponse -> Text
agreementId :: Prelude.Text
  }
  deriving (CreateAgreementResponse -> CreateAgreementResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAgreementResponse -> CreateAgreementResponse -> Bool
$c/= :: CreateAgreementResponse -> CreateAgreementResponse -> Bool
== :: CreateAgreementResponse -> CreateAgreementResponse -> Bool
$c== :: CreateAgreementResponse -> CreateAgreementResponse -> Bool
Prelude.Eq, ReadPrec [CreateAgreementResponse]
ReadPrec CreateAgreementResponse
Int -> ReadS CreateAgreementResponse
ReadS [CreateAgreementResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAgreementResponse]
$creadListPrec :: ReadPrec [CreateAgreementResponse]
readPrec :: ReadPrec CreateAgreementResponse
$creadPrec :: ReadPrec CreateAgreementResponse
readList :: ReadS [CreateAgreementResponse]
$creadList :: ReadS [CreateAgreementResponse]
readsPrec :: Int -> ReadS CreateAgreementResponse
$creadsPrec :: Int -> ReadS CreateAgreementResponse
Prelude.Read, Int -> CreateAgreementResponse -> ShowS
[CreateAgreementResponse] -> ShowS
CreateAgreementResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAgreementResponse] -> ShowS
$cshowList :: [CreateAgreementResponse] -> ShowS
show :: CreateAgreementResponse -> String
$cshow :: CreateAgreementResponse -> String
showsPrec :: Int -> CreateAgreementResponse -> ShowS
$cshowsPrec :: Int -> CreateAgreementResponse -> ShowS
Prelude.Show, forall x. Rep CreateAgreementResponse x -> CreateAgreementResponse
forall x. CreateAgreementResponse -> Rep CreateAgreementResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateAgreementResponse x -> CreateAgreementResponse
$cfrom :: forall x. CreateAgreementResponse -> Rep CreateAgreementResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateAgreementResponse' 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', 'createAgreementResponse_httpStatus' - The response's http status code.
--
-- 'agreementId', 'createAgreementResponse_agreementId' - The unique identifier for the agreement. Use this ID for deleting, or
-- updating an agreement, as well as in any other API calls that require
-- that you specify the agreement ID.
newCreateAgreementResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'agreementId'
  Prelude.Text ->
  CreateAgreementResponse
newCreateAgreementResponse :: Int -> Text -> CreateAgreementResponse
newCreateAgreementResponse Int
pHttpStatus_ Text
pAgreementId_ =
  CreateAgreementResponse'
    { $sel:httpStatus:CreateAgreementResponse' :: Int
httpStatus = Int
pHttpStatus_,
      $sel:agreementId:CreateAgreementResponse' :: Text
agreementId = Text
pAgreementId_
    }

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

-- | The unique identifier for the agreement. Use this ID for deleting, or
-- updating an agreement, as well as in any other API calls that require
-- that you specify the agreement ID.
createAgreementResponse_agreementId :: Lens.Lens' CreateAgreementResponse Prelude.Text
createAgreementResponse_agreementId :: Lens' CreateAgreementResponse Text
createAgreementResponse_agreementId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAgreementResponse' {Text
agreementId :: Text
$sel:agreementId:CreateAgreementResponse' :: CreateAgreementResponse -> Text
agreementId} -> Text
agreementId) (\s :: CreateAgreementResponse
s@CreateAgreementResponse' {} Text
a -> CreateAgreementResponse
s {$sel:agreementId:CreateAgreementResponse' :: Text
agreementId = Text
a} :: CreateAgreementResponse)

instance Prelude.NFData CreateAgreementResponse where
  rnf :: CreateAgreementResponse -> ()
rnf CreateAgreementResponse' {Int
Text
agreementId :: Text
httpStatus :: Int
$sel:agreementId:CreateAgreementResponse' :: CreateAgreementResponse -> Text
$sel:httpStatus:CreateAgreementResponse' :: CreateAgreementResponse -> 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 Text
agreementId