{-# 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.Cloud9.CreateEnvironmentMembership
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Adds an environment member to an Cloud9 development environment.
module Amazonka.Cloud9.CreateEnvironmentMembership
  ( -- * Creating a Request
    CreateEnvironmentMembership (..),
    newCreateEnvironmentMembership,

    -- * Request Lenses
    createEnvironmentMembership_environmentId,
    createEnvironmentMembership_userArn,
    createEnvironmentMembership_permissions,

    -- * Destructuring the Response
    CreateEnvironmentMembershipResponse (..),
    newCreateEnvironmentMembershipResponse,

    -- * Response Lenses
    createEnvironmentMembershipResponse_httpStatus,
    createEnvironmentMembershipResponse_membership,
  )
where

import Amazonka.Cloud9.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:/ 'newCreateEnvironmentMembership' smart constructor.
data CreateEnvironmentMembership = CreateEnvironmentMembership'
  { -- | The ID of the environment that contains the environment member you want
    -- to add.
    CreateEnvironmentMembership -> Text
environmentId :: Prelude.Text,
    -- | The Amazon Resource Name (ARN) of the environment member you want to
    -- add.
    CreateEnvironmentMembership -> Text
userArn :: Prelude.Text,
    -- | The type of environment member permissions you want to associate with
    -- this environment member. Available values include:
    --
    -- -   @read-only@: Has read-only access to the environment.
    --
    -- -   @read-write@: Has read-write access to the environment.
    CreateEnvironmentMembership -> MemberPermissions
permissions :: MemberPermissions
  }
  deriving (CreateEnvironmentMembership -> CreateEnvironmentMembership -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateEnvironmentMembership -> CreateEnvironmentMembership -> Bool
$c/= :: CreateEnvironmentMembership -> CreateEnvironmentMembership -> Bool
== :: CreateEnvironmentMembership -> CreateEnvironmentMembership -> Bool
$c== :: CreateEnvironmentMembership -> CreateEnvironmentMembership -> Bool
Prelude.Eq, ReadPrec [CreateEnvironmentMembership]
ReadPrec CreateEnvironmentMembership
Int -> ReadS CreateEnvironmentMembership
ReadS [CreateEnvironmentMembership]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateEnvironmentMembership]
$creadListPrec :: ReadPrec [CreateEnvironmentMembership]
readPrec :: ReadPrec CreateEnvironmentMembership
$creadPrec :: ReadPrec CreateEnvironmentMembership
readList :: ReadS [CreateEnvironmentMembership]
$creadList :: ReadS [CreateEnvironmentMembership]
readsPrec :: Int -> ReadS CreateEnvironmentMembership
$creadsPrec :: Int -> ReadS CreateEnvironmentMembership
Prelude.Read, Int -> CreateEnvironmentMembership -> ShowS
[CreateEnvironmentMembership] -> ShowS
CreateEnvironmentMembership -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateEnvironmentMembership] -> ShowS
$cshowList :: [CreateEnvironmentMembership] -> ShowS
show :: CreateEnvironmentMembership -> String
$cshow :: CreateEnvironmentMembership -> String
showsPrec :: Int -> CreateEnvironmentMembership -> ShowS
$cshowsPrec :: Int -> CreateEnvironmentMembership -> ShowS
Prelude.Show, forall x.
Rep CreateEnvironmentMembership x -> CreateEnvironmentMembership
forall x.
CreateEnvironmentMembership -> Rep CreateEnvironmentMembership x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateEnvironmentMembership x -> CreateEnvironmentMembership
$cfrom :: forall x.
CreateEnvironmentMembership -> Rep CreateEnvironmentMembership x
Prelude.Generic)

-- |
-- Create a value of 'CreateEnvironmentMembership' 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:
--
-- 'environmentId', 'createEnvironmentMembership_environmentId' - The ID of the environment that contains the environment member you want
-- to add.
--
-- 'userArn', 'createEnvironmentMembership_userArn' - The Amazon Resource Name (ARN) of the environment member you want to
-- add.
--
-- 'permissions', 'createEnvironmentMembership_permissions' - The type of environment member permissions you want to associate with
-- this environment member. Available values include:
--
-- -   @read-only@: Has read-only access to the environment.
--
-- -   @read-write@: Has read-write access to the environment.
newCreateEnvironmentMembership ::
  -- | 'environmentId'
  Prelude.Text ->
  -- | 'userArn'
  Prelude.Text ->
  -- | 'permissions'
  MemberPermissions ->
  CreateEnvironmentMembership
newCreateEnvironmentMembership :: Text -> Text -> MemberPermissions -> CreateEnvironmentMembership
newCreateEnvironmentMembership
  Text
pEnvironmentId_
  Text
pUserArn_
  MemberPermissions
pPermissions_ =
    CreateEnvironmentMembership'
      { $sel:environmentId:CreateEnvironmentMembership' :: Text
environmentId =
          Text
pEnvironmentId_,
        $sel:userArn:CreateEnvironmentMembership' :: Text
userArn = Text
pUserArn_,
        $sel:permissions:CreateEnvironmentMembership' :: MemberPermissions
permissions = MemberPermissions
pPermissions_
      }

-- | The ID of the environment that contains the environment member you want
-- to add.
createEnvironmentMembership_environmentId :: Lens.Lens' CreateEnvironmentMembership Prelude.Text
createEnvironmentMembership_environmentId :: Lens' CreateEnvironmentMembership Text
createEnvironmentMembership_environmentId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateEnvironmentMembership' {Text
environmentId :: Text
$sel:environmentId:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
environmentId} -> Text
environmentId) (\s :: CreateEnvironmentMembership
s@CreateEnvironmentMembership' {} Text
a -> CreateEnvironmentMembership
s {$sel:environmentId:CreateEnvironmentMembership' :: Text
environmentId = Text
a} :: CreateEnvironmentMembership)

-- | The Amazon Resource Name (ARN) of the environment member you want to
-- add.
createEnvironmentMembership_userArn :: Lens.Lens' CreateEnvironmentMembership Prelude.Text
createEnvironmentMembership_userArn :: Lens' CreateEnvironmentMembership Text
createEnvironmentMembership_userArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateEnvironmentMembership' {Text
userArn :: Text
$sel:userArn:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
userArn} -> Text
userArn) (\s :: CreateEnvironmentMembership
s@CreateEnvironmentMembership' {} Text
a -> CreateEnvironmentMembership
s {$sel:userArn:CreateEnvironmentMembership' :: Text
userArn = Text
a} :: CreateEnvironmentMembership)

-- | The type of environment member permissions you want to associate with
-- this environment member. Available values include:
--
-- -   @read-only@: Has read-only access to the environment.
--
-- -   @read-write@: Has read-write access to the environment.
createEnvironmentMembership_permissions :: Lens.Lens' CreateEnvironmentMembership MemberPermissions
createEnvironmentMembership_permissions :: Lens' CreateEnvironmentMembership MemberPermissions
createEnvironmentMembership_permissions = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateEnvironmentMembership' {MemberPermissions
permissions :: MemberPermissions
$sel:permissions:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> MemberPermissions
permissions} -> MemberPermissions
permissions) (\s :: CreateEnvironmentMembership
s@CreateEnvironmentMembership' {} MemberPermissions
a -> CreateEnvironmentMembership
s {$sel:permissions:CreateEnvironmentMembership' :: MemberPermissions
permissions = MemberPermissions
a} :: CreateEnvironmentMembership)

instance Core.AWSRequest CreateEnvironmentMembership where
  type
    AWSResponse CreateEnvironmentMembership =
      CreateEnvironmentMembershipResponse
  request :: (Service -> Service)
-> CreateEnvironmentMembership
-> Request CreateEnvironmentMembership
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 CreateEnvironmentMembership
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateEnvironmentMembership)))
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 -> EnvironmentMember -> CreateEnvironmentMembershipResponse
CreateEnvironmentMembershipResponse'
            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
"membership")
      )

instance Prelude.Hashable CreateEnvironmentMembership where
  hashWithSalt :: Int -> CreateEnvironmentMembership -> Int
hashWithSalt Int
_salt CreateEnvironmentMembership' {Text
MemberPermissions
permissions :: MemberPermissions
userArn :: Text
environmentId :: Text
$sel:permissions:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> MemberPermissions
$sel:userArn:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
$sel:environmentId:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
environmentId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
userArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` MemberPermissions
permissions

instance Prelude.NFData CreateEnvironmentMembership where
  rnf :: CreateEnvironmentMembership -> ()
rnf CreateEnvironmentMembership' {Text
MemberPermissions
permissions :: MemberPermissions
userArn :: Text
environmentId :: Text
$sel:permissions:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> MemberPermissions
$sel:userArn:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
$sel:environmentId:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
environmentId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
userArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf MemberPermissions
permissions

instance Data.ToHeaders CreateEnvironmentMembership where
  toHeaders :: CreateEnvironmentMembership -> 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
"AWSCloud9WorkspaceManagementService.CreateEnvironmentMembership" ::
                          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 CreateEnvironmentMembership where
  toJSON :: CreateEnvironmentMembership -> Value
toJSON CreateEnvironmentMembership' {Text
MemberPermissions
permissions :: MemberPermissions
userArn :: Text
environmentId :: Text
$sel:permissions:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> MemberPermissions
$sel:userArn:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
$sel:environmentId:CreateEnvironmentMembership' :: CreateEnvironmentMembership -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just
              (Key
"environmentId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
environmentId),
            forall a. a -> Maybe a
Prelude.Just (Key
"userArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
userArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"permissions" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= MemberPermissions
permissions)
          ]
      )

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

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

-- | /See:/ 'newCreateEnvironmentMembershipResponse' smart constructor.
data CreateEnvironmentMembershipResponse = CreateEnvironmentMembershipResponse'
  { -- | The response's http status code.
    CreateEnvironmentMembershipResponse -> Int
httpStatus :: Prelude.Int,
    -- | Information about the environment member that was added.
    CreateEnvironmentMembershipResponse -> EnvironmentMember
membership :: EnvironmentMember
  }
  deriving (CreateEnvironmentMembershipResponse
-> CreateEnvironmentMembershipResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateEnvironmentMembershipResponse
-> CreateEnvironmentMembershipResponse -> Bool
$c/= :: CreateEnvironmentMembershipResponse
-> CreateEnvironmentMembershipResponse -> Bool
== :: CreateEnvironmentMembershipResponse
-> CreateEnvironmentMembershipResponse -> Bool
$c== :: CreateEnvironmentMembershipResponse
-> CreateEnvironmentMembershipResponse -> Bool
Prelude.Eq, ReadPrec [CreateEnvironmentMembershipResponse]
ReadPrec CreateEnvironmentMembershipResponse
Int -> ReadS CreateEnvironmentMembershipResponse
ReadS [CreateEnvironmentMembershipResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateEnvironmentMembershipResponse]
$creadListPrec :: ReadPrec [CreateEnvironmentMembershipResponse]
readPrec :: ReadPrec CreateEnvironmentMembershipResponse
$creadPrec :: ReadPrec CreateEnvironmentMembershipResponse
readList :: ReadS [CreateEnvironmentMembershipResponse]
$creadList :: ReadS [CreateEnvironmentMembershipResponse]
readsPrec :: Int -> ReadS CreateEnvironmentMembershipResponse
$creadsPrec :: Int -> ReadS CreateEnvironmentMembershipResponse
Prelude.Read, Int -> CreateEnvironmentMembershipResponse -> ShowS
[CreateEnvironmentMembershipResponse] -> ShowS
CreateEnvironmentMembershipResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateEnvironmentMembershipResponse] -> ShowS
$cshowList :: [CreateEnvironmentMembershipResponse] -> ShowS
show :: CreateEnvironmentMembershipResponse -> String
$cshow :: CreateEnvironmentMembershipResponse -> String
showsPrec :: Int -> CreateEnvironmentMembershipResponse -> ShowS
$cshowsPrec :: Int -> CreateEnvironmentMembershipResponse -> ShowS
Prelude.Show, forall x.
Rep CreateEnvironmentMembershipResponse x
-> CreateEnvironmentMembershipResponse
forall x.
CreateEnvironmentMembershipResponse
-> Rep CreateEnvironmentMembershipResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateEnvironmentMembershipResponse x
-> CreateEnvironmentMembershipResponse
$cfrom :: forall x.
CreateEnvironmentMembershipResponse
-> Rep CreateEnvironmentMembershipResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateEnvironmentMembershipResponse' 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', 'createEnvironmentMembershipResponse_httpStatus' - The response's http status code.
--
-- 'membership', 'createEnvironmentMembershipResponse_membership' - Information about the environment member that was added.
newCreateEnvironmentMembershipResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'membership'
  EnvironmentMember ->
  CreateEnvironmentMembershipResponse
newCreateEnvironmentMembershipResponse :: Int -> EnvironmentMember -> CreateEnvironmentMembershipResponse
newCreateEnvironmentMembershipResponse
  Int
pHttpStatus_
  EnvironmentMember
pMembership_ =
    CreateEnvironmentMembershipResponse'
      { $sel:httpStatus:CreateEnvironmentMembershipResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:membership:CreateEnvironmentMembershipResponse' :: EnvironmentMember
membership = EnvironmentMember
pMembership_
      }

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

-- | Information about the environment member that was added.
createEnvironmentMembershipResponse_membership :: Lens.Lens' CreateEnvironmentMembershipResponse EnvironmentMember
createEnvironmentMembershipResponse_membership :: Lens' CreateEnvironmentMembershipResponse EnvironmentMember
createEnvironmentMembershipResponse_membership = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateEnvironmentMembershipResponse' {EnvironmentMember
membership :: EnvironmentMember
$sel:membership:CreateEnvironmentMembershipResponse' :: CreateEnvironmentMembershipResponse -> EnvironmentMember
membership} -> EnvironmentMember
membership) (\s :: CreateEnvironmentMembershipResponse
s@CreateEnvironmentMembershipResponse' {} EnvironmentMember
a -> CreateEnvironmentMembershipResponse
s {$sel:membership:CreateEnvironmentMembershipResponse' :: EnvironmentMember
membership = EnvironmentMember
a} :: CreateEnvironmentMembershipResponse)

instance
  Prelude.NFData
    CreateEnvironmentMembershipResponse
  where
  rnf :: CreateEnvironmentMembershipResponse -> ()
rnf CreateEnvironmentMembershipResponse' {Int
EnvironmentMember
membership :: EnvironmentMember
httpStatus :: Int
$sel:membership:CreateEnvironmentMembershipResponse' :: CreateEnvironmentMembershipResponse -> EnvironmentMember
$sel:httpStatus:CreateEnvironmentMembershipResponse' :: CreateEnvironmentMembershipResponse -> 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 EnvironmentMember
membership