{-# 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.SSMSAP.PutResourcePermission
-- 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 permissions to the target database.
module Amazonka.SSMSAP.PutResourcePermission
  ( -- * Creating a Request
    PutResourcePermission (..),
    newPutResourcePermission,

    -- * Request Lenses
    putResourcePermission_actionType,
    putResourcePermission_sourceResourceArn,
    putResourcePermission_resourceArn,

    -- * Destructuring the Response
    PutResourcePermissionResponse (..),
    newPutResourcePermissionResponse,

    -- * Response Lenses
    putResourcePermissionResponse_policy,
    putResourcePermissionResponse_httpStatus,
  )
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.SSMSAP.Types

-- | /See:/ 'newPutResourcePermission' smart constructor.
data PutResourcePermission = PutResourcePermission'
  { PutResourcePermission -> PermissionActionType
actionType :: PermissionActionType,
    PutResourcePermission -> Text
sourceResourceArn :: Prelude.Text,
    PutResourcePermission -> Text
resourceArn :: Prelude.Text
  }
  deriving (PutResourcePermission -> PutResourcePermission -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PutResourcePermission -> PutResourcePermission -> Bool
$c/= :: PutResourcePermission -> PutResourcePermission -> Bool
== :: PutResourcePermission -> PutResourcePermission -> Bool
$c== :: PutResourcePermission -> PutResourcePermission -> Bool
Prelude.Eq, ReadPrec [PutResourcePermission]
ReadPrec PutResourcePermission
Int -> ReadS PutResourcePermission
ReadS [PutResourcePermission]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PutResourcePermission]
$creadListPrec :: ReadPrec [PutResourcePermission]
readPrec :: ReadPrec PutResourcePermission
$creadPrec :: ReadPrec PutResourcePermission
readList :: ReadS [PutResourcePermission]
$creadList :: ReadS [PutResourcePermission]
readsPrec :: Int -> ReadS PutResourcePermission
$creadsPrec :: Int -> ReadS PutResourcePermission
Prelude.Read, Int -> PutResourcePermission -> ShowS
[PutResourcePermission] -> ShowS
PutResourcePermission -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutResourcePermission] -> ShowS
$cshowList :: [PutResourcePermission] -> ShowS
show :: PutResourcePermission -> String
$cshow :: PutResourcePermission -> String
showsPrec :: Int -> PutResourcePermission -> ShowS
$cshowsPrec :: Int -> PutResourcePermission -> ShowS
Prelude.Show, forall x. Rep PutResourcePermission x -> PutResourcePermission
forall x. PutResourcePermission -> Rep PutResourcePermission x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PutResourcePermission x -> PutResourcePermission
$cfrom :: forall x. PutResourcePermission -> Rep PutResourcePermission x
Prelude.Generic)

-- |
-- Create a value of 'PutResourcePermission' 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:
--
-- 'actionType', 'putResourcePermission_actionType' -
--
-- 'sourceResourceArn', 'putResourcePermission_sourceResourceArn' -
--
-- 'resourceArn', 'putResourcePermission_resourceArn' -
newPutResourcePermission ::
  -- | 'actionType'
  PermissionActionType ->
  -- | 'sourceResourceArn'
  Prelude.Text ->
  -- | 'resourceArn'
  Prelude.Text ->
  PutResourcePermission
newPutResourcePermission :: PermissionActionType -> Text -> Text -> PutResourcePermission
newPutResourcePermission
  PermissionActionType
pActionType_
  Text
pSourceResourceArn_
  Text
pResourceArn_ =
    PutResourcePermission'
      { $sel:actionType:PutResourcePermission' :: PermissionActionType
actionType = PermissionActionType
pActionType_,
        $sel:sourceResourceArn:PutResourcePermission' :: Text
sourceResourceArn = Text
pSourceResourceArn_,
        $sel:resourceArn:PutResourcePermission' :: Text
resourceArn = Text
pResourceArn_
      }

putResourcePermission_actionType :: Lens.Lens' PutResourcePermission PermissionActionType
putResourcePermission_actionType :: Lens' PutResourcePermission PermissionActionType
putResourcePermission_actionType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutResourcePermission' {PermissionActionType
actionType :: PermissionActionType
$sel:actionType:PutResourcePermission' :: PutResourcePermission -> PermissionActionType
actionType} -> PermissionActionType
actionType) (\s :: PutResourcePermission
s@PutResourcePermission' {} PermissionActionType
a -> PutResourcePermission
s {$sel:actionType:PutResourcePermission' :: PermissionActionType
actionType = PermissionActionType
a} :: PutResourcePermission)

putResourcePermission_sourceResourceArn :: Lens.Lens' PutResourcePermission Prelude.Text
putResourcePermission_sourceResourceArn :: Lens' PutResourcePermission Text
putResourcePermission_sourceResourceArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutResourcePermission' {Text
sourceResourceArn :: Text
$sel:sourceResourceArn:PutResourcePermission' :: PutResourcePermission -> Text
sourceResourceArn} -> Text
sourceResourceArn) (\s :: PutResourcePermission
s@PutResourcePermission' {} Text
a -> PutResourcePermission
s {$sel:sourceResourceArn:PutResourcePermission' :: Text
sourceResourceArn = Text
a} :: PutResourcePermission)

putResourcePermission_resourceArn :: Lens.Lens' PutResourcePermission Prelude.Text
putResourcePermission_resourceArn :: Lens' PutResourcePermission Text
putResourcePermission_resourceArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutResourcePermission' {Text
resourceArn :: Text
$sel:resourceArn:PutResourcePermission' :: PutResourcePermission -> Text
resourceArn} -> Text
resourceArn) (\s :: PutResourcePermission
s@PutResourcePermission' {} Text
a -> PutResourcePermission
s {$sel:resourceArn:PutResourcePermission' :: Text
resourceArn = Text
a} :: PutResourcePermission)

instance Core.AWSRequest PutResourcePermission where
  type
    AWSResponse PutResourcePermission =
      PutResourcePermissionResponse
  request :: (Service -> Service)
-> PutResourcePermission -> Request PutResourcePermission
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 PutResourcePermission
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse PutResourcePermission)))
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 ->
          Maybe Text -> Int -> PutResourcePermissionResponse
PutResourcePermissionResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"Policy")
            forall (f :: * -> *) a b. Applicative f => 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))
      )

instance Prelude.Hashable PutResourcePermission where
  hashWithSalt :: Int -> PutResourcePermission -> Int
hashWithSalt Int
_salt PutResourcePermission' {Text
PermissionActionType
resourceArn :: Text
sourceResourceArn :: Text
actionType :: PermissionActionType
$sel:resourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:sourceResourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:actionType:PutResourcePermission' :: PutResourcePermission -> PermissionActionType
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` PermissionActionType
actionType
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
sourceResourceArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceArn

instance Prelude.NFData PutResourcePermission where
  rnf :: PutResourcePermission -> ()
rnf PutResourcePermission' {Text
PermissionActionType
resourceArn :: Text
sourceResourceArn :: Text
actionType :: PermissionActionType
$sel:resourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:sourceResourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:actionType:PutResourcePermission' :: PutResourcePermission -> PermissionActionType
..} =
    forall a. NFData a => a -> ()
Prelude.rnf PermissionActionType
actionType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
sourceResourceArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
resourceArn

instance Data.ToHeaders PutResourcePermission where
  toHeaders :: PutResourcePermission -> 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 PutResourcePermission where
  toJSON :: PutResourcePermission -> Value
toJSON PutResourcePermission' {Text
PermissionActionType
resourceArn :: Text
sourceResourceArn :: Text
actionType :: PermissionActionType
$sel:resourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:sourceResourceArn:PutResourcePermission' :: PutResourcePermission -> Text
$sel:actionType:PutResourcePermission' :: PutResourcePermission -> PermissionActionType
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"ActionType" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= PermissionActionType
actionType),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"SourceResourceArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
sourceResourceArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"ResourceArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
resourceArn)
          ]
      )

instance Data.ToPath PutResourcePermission where
  toPath :: PutResourcePermission -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/put-resource-permission"

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

-- | /See:/ 'newPutResourcePermissionResponse' smart constructor.
data PutResourcePermissionResponse = PutResourcePermissionResponse'
  { PutResourcePermissionResponse -> Maybe Text
policy :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    PutResourcePermissionResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (PutResourcePermissionResponse
-> PutResourcePermissionResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PutResourcePermissionResponse
-> PutResourcePermissionResponse -> Bool
$c/= :: PutResourcePermissionResponse
-> PutResourcePermissionResponse -> Bool
== :: PutResourcePermissionResponse
-> PutResourcePermissionResponse -> Bool
$c== :: PutResourcePermissionResponse
-> PutResourcePermissionResponse -> Bool
Prelude.Eq, ReadPrec [PutResourcePermissionResponse]
ReadPrec PutResourcePermissionResponse
Int -> ReadS PutResourcePermissionResponse
ReadS [PutResourcePermissionResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PutResourcePermissionResponse]
$creadListPrec :: ReadPrec [PutResourcePermissionResponse]
readPrec :: ReadPrec PutResourcePermissionResponse
$creadPrec :: ReadPrec PutResourcePermissionResponse
readList :: ReadS [PutResourcePermissionResponse]
$creadList :: ReadS [PutResourcePermissionResponse]
readsPrec :: Int -> ReadS PutResourcePermissionResponse
$creadsPrec :: Int -> ReadS PutResourcePermissionResponse
Prelude.Read, Int -> PutResourcePermissionResponse -> ShowS
[PutResourcePermissionResponse] -> ShowS
PutResourcePermissionResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutResourcePermissionResponse] -> ShowS
$cshowList :: [PutResourcePermissionResponse] -> ShowS
show :: PutResourcePermissionResponse -> String
$cshow :: PutResourcePermissionResponse -> String
showsPrec :: Int -> PutResourcePermissionResponse -> ShowS
$cshowsPrec :: Int -> PutResourcePermissionResponse -> ShowS
Prelude.Show, forall x.
Rep PutResourcePermissionResponse x
-> PutResourcePermissionResponse
forall x.
PutResourcePermissionResponse
-> Rep PutResourcePermissionResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep PutResourcePermissionResponse x
-> PutResourcePermissionResponse
$cfrom :: forall x.
PutResourcePermissionResponse
-> Rep PutResourcePermissionResponse x
Prelude.Generic)

-- |
-- Create a value of 'PutResourcePermissionResponse' 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:
--
-- 'policy', 'putResourcePermissionResponse_policy' -
--
-- 'httpStatus', 'putResourcePermissionResponse_httpStatus' - The response's http status code.
newPutResourcePermissionResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  PutResourcePermissionResponse
newPutResourcePermissionResponse :: Int -> PutResourcePermissionResponse
newPutResourcePermissionResponse Int
pHttpStatus_ =
  PutResourcePermissionResponse'
    { $sel:policy:PutResourcePermissionResponse' :: Maybe Text
policy =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:PutResourcePermissionResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

putResourcePermissionResponse_policy :: Lens.Lens' PutResourcePermissionResponse (Prelude.Maybe Prelude.Text)
putResourcePermissionResponse_policy :: Lens' PutResourcePermissionResponse (Maybe Text)
putResourcePermissionResponse_policy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutResourcePermissionResponse' {Maybe Text
policy :: Maybe Text
$sel:policy:PutResourcePermissionResponse' :: PutResourcePermissionResponse -> Maybe Text
policy} -> Maybe Text
policy) (\s :: PutResourcePermissionResponse
s@PutResourcePermissionResponse' {} Maybe Text
a -> PutResourcePermissionResponse
s {$sel:policy:PutResourcePermissionResponse' :: Maybe Text
policy = Maybe Text
a} :: PutResourcePermissionResponse)

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

instance Prelude.NFData PutResourcePermissionResponse where
  rnf :: PutResourcePermissionResponse -> ()
rnf PutResourcePermissionResponse' {Int
Maybe Text
httpStatus :: Int
policy :: Maybe Text
$sel:httpStatus:PutResourcePermissionResponse' :: PutResourcePermissionResponse -> Int
$sel:policy:PutResourcePermissionResponse' :: PutResourcePermissionResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
policy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus