{-# 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.OpsWorks.DescribePermissions
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Describes the permissions for a specified stack.
--
-- __Required Permissions__: To use this action, an IAM user must have a
-- Manage permissions level for the stack, or an attached policy that
-- explicitly grants permissions. For more information on user permissions,
-- see
-- <https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html Managing User Permissions>.
module Amazonka.OpsWorks.DescribePermissions
  ( -- * Creating a Request
    DescribePermissions (..),
    newDescribePermissions,

    -- * Request Lenses
    describePermissions_iamUserArn,
    describePermissions_stackId,

    -- * Destructuring the Response
    DescribePermissionsResponse (..),
    newDescribePermissionsResponse,

    -- * Response Lenses
    describePermissionsResponse_permissions,
    describePermissionsResponse_httpStatus,
  )
where

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

-- | /See:/ 'newDescribePermissions' smart constructor.
data DescribePermissions = DescribePermissions'
  { -- | The user\'s IAM ARN. This can also be a federated user\'s ARN. For more
    -- information about IAM ARNs, see
    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html Using Identifiers>.
    DescribePermissions -> Maybe Text
iamUserArn :: Prelude.Maybe Prelude.Text,
    -- | The stack ID.
    DescribePermissions -> Maybe Text
stackId :: Prelude.Maybe Prelude.Text
  }
  deriving (DescribePermissions -> DescribePermissions -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribePermissions -> DescribePermissions -> Bool
$c/= :: DescribePermissions -> DescribePermissions -> Bool
== :: DescribePermissions -> DescribePermissions -> Bool
$c== :: DescribePermissions -> DescribePermissions -> Bool
Prelude.Eq, ReadPrec [DescribePermissions]
ReadPrec DescribePermissions
Int -> ReadS DescribePermissions
ReadS [DescribePermissions]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribePermissions]
$creadListPrec :: ReadPrec [DescribePermissions]
readPrec :: ReadPrec DescribePermissions
$creadPrec :: ReadPrec DescribePermissions
readList :: ReadS [DescribePermissions]
$creadList :: ReadS [DescribePermissions]
readsPrec :: Int -> ReadS DescribePermissions
$creadsPrec :: Int -> ReadS DescribePermissions
Prelude.Read, Int -> DescribePermissions -> ShowS
[DescribePermissions] -> ShowS
DescribePermissions -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribePermissions] -> ShowS
$cshowList :: [DescribePermissions] -> ShowS
show :: DescribePermissions -> String
$cshow :: DescribePermissions -> String
showsPrec :: Int -> DescribePermissions -> ShowS
$cshowsPrec :: Int -> DescribePermissions -> ShowS
Prelude.Show, forall x. Rep DescribePermissions x -> DescribePermissions
forall x. DescribePermissions -> Rep DescribePermissions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribePermissions x -> DescribePermissions
$cfrom :: forall x. DescribePermissions -> Rep DescribePermissions x
Prelude.Generic)

-- |
-- Create a value of 'DescribePermissions' 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:
--
-- 'iamUserArn', 'describePermissions_iamUserArn' - The user\'s IAM ARN. This can also be a federated user\'s ARN. For more
-- information about IAM ARNs, see
-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html Using Identifiers>.
--
-- 'stackId', 'describePermissions_stackId' - The stack ID.
newDescribePermissions ::
  DescribePermissions
newDescribePermissions :: DescribePermissions
newDescribePermissions =
  DescribePermissions'
    { $sel:iamUserArn:DescribePermissions' :: Maybe Text
iamUserArn = forall a. Maybe a
Prelude.Nothing,
      $sel:stackId:DescribePermissions' :: Maybe Text
stackId = forall a. Maybe a
Prelude.Nothing
    }

-- | The user\'s IAM ARN. This can also be a federated user\'s ARN. For more
-- information about IAM ARNs, see
-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html Using Identifiers>.
describePermissions_iamUserArn :: Lens.Lens' DescribePermissions (Prelude.Maybe Prelude.Text)
describePermissions_iamUserArn :: Lens' DescribePermissions (Maybe Text)
describePermissions_iamUserArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribePermissions' {Maybe Text
iamUserArn :: Maybe Text
$sel:iamUserArn:DescribePermissions' :: DescribePermissions -> Maybe Text
iamUserArn} -> Maybe Text
iamUserArn) (\s :: DescribePermissions
s@DescribePermissions' {} Maybe Text
a -> DescribePermissions
s {$sel:iamUserArn:DescribePermissions' :: Maybe Text
iamUserArn = Maybe Text
a} :: DescribePermissions)

-- | The stack ID.
describePermissions_stackId :: Lens.Lens' DescribePermissions (Prelude.Maybe Prelude.Text)
describePermissions_stackId :: Lens' DescribePermissions (Maybe Text)
describePermissions_stackId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribePermissions' {Maybe Text
stackId :: Maybe Text
$sel:stackId:DescribePermissions' :: DescribePermissions -> Maybe Text
stackId} -> Maybe Text
stackId) (\s :: DescribePermissions
s@DescribePermissions' {} Maybe Text
a -> DescribePermissions
s {$sel:stackId:DescribePermissions' :: Maybe Text
stackId = Maybe Text
a} :: DescribePermissions)

instance Core.AWSRequest DescribePermissions where
  type
    AWSResponse DescribePermissions =
      DescribePermissionsResponse
  request :: (Service -> Service)
-> DescribePermissions -> Request DescribePermissions
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 DescribePermissions
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DescribePermissions)))
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 [Permission] -> Int -> DescribePermissionsResponse
DescribePermissionsResponse'
            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
"Permissions" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            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 DescribePermissions where
  hashWithSalt :: Int -> DescribePermissions -> Int
hashWithSalt Int
_salt DescribePermissions' {Maybe Text
stackId :: Maybe Text
iamUserArn :: Maybe Text
$sel:stackId:DescribePermissions' :: DescribePermissions -> Maybe Text
$sel:iamUserArn:DescribePermissions' :: DescribePermissions -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
iamUserArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
stackId

instance Prelude.NFData DescribePermissions where
  rnf :: DescribePermissions -> ()
rnf DescribePermissions' {Maybe Text
stackId :: Maybe Text
iamUserArn :: Maybe Text
$sel:stackId:DescribePermissions' :: DescribePermissions -> Maybe Text
$sel:iamUserArn:DescribePermissions' :: DescribePermissions -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
iamUserArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
stackId

instance Data.ToHeaders DescribePermissions where
  toHeaders :: DescribePermissions -> 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
"OpsWorks_20130218.DescribePermissions" ::
                          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 DescribePermissions where
  toJSON :: DescribePermissions -> Value
toJSON DescribePermissions' {Maybe Text
stackId :: Maybe Text
iamUserArn :: Maybe Text
$sel:stackId:DescribePermissions' :: DescribePermissions -> Maybe Text
$sel:iamUserArn:DescribePermissions' :: DescribePermissions -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"IamUserArn" 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
iamUserArn,
            (Key
"StackId" 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
stackId
          ]
      )

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

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

-- | Contains the response to a @DescribePermissions@ request.
--
-- /See:/ 'newDescribePermissionsResponse' smart constructor.
data DescribePermissionsResponse = DescribePermissionsResponse'
  { -- | An array of @Permission@ objects that describe the stack permissions.
    --
    -- -   If the request object contains only a stack ID, the array contains a
    --     @Permission@ object with permissions for each of the stack IAM ARNs.
    --
    -- -   If the request object contains only an IAM ARN, the array contains a
    --     @Permission@ object with permissions for each of the user\'s stack
    --     IDs.
    --
    -- -   If the request contains a stack ID and an IAM ARN, the array
    --     contains a single @Permission@ object with permissions for the
    --     specified stack and IAM ARN.
    DescribePermissionsResponse -> Maybe [Permission]
permissions :: Prelude.Maybe [Permission],
    -- | The response's http status code.
    DescribePermissionsResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DescribePermissionsResponse -> DescribePermissionsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribePermissionsResponse -> DescribePermissionsResponse -> Bool
$c/= :: DescribePermissionsResponse -> DescribePermissionsResponse -> Bool
== :: DescribePermissionsResponse -> DescribePermissionsResponse -> Bool
$c== :: DescribePermissionsResponse -> DescribePermissionsResponse -> Bool
Prelude.Eq, ReadPrec [DescribePermissionsResponse]
ReadPrec DescribePermissionsResponse
Int -> ReadS DescribePermissionsResponse
ReadS [DescribePermissionsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribePermissionsResponse]
$creadListPrec :: ReadPrec [DescribePermissionsResponse]
readPrec :: ReadPrec DescribePermissionsResponse
$creadPrec :: ReadPrec DescribePermissionsResponse
readList :: ReadS [DescribePermissionsResponse]
$creadList :: ReadS [DescribePermissionsResponse]
readsPrec :: Int -> ReadS DescribePermissionsResponse
$creadsPrec :: Int -> ReadS DescribePermissionsResponse
Prelude.Read, Int -> DescribePermissionsResponse -> ShowS
[DescribePermissionsResponse] -> ShowS
DescribePermissionsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribePermissionsResponse] -> ShowS
$cshowList :: [DescribePermissionsResponse] -> ShowS
show :: DescribePermissionsResponse -> String
$cshow :: DescribePermissionsResponse -> String
showsPrec :: Int -> DescribePermissionsResponse -> ShowS
$cshowsPrec :: Int -> DescribePermissionsResponse -> ShowS
Prelude.Show, forall x.
Rep DescribePermissionsResponse x -> DescribePermissionsResponse
forall x.
DescribePermissionsResponse -> Rep DescribePermissionsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DescribePermissionsResponse x -> DescribePermissionsResponse
$cfrom :: forall x.
DescribePermissionsResponse -> Rep DescribePermissionsResponse x
Prelude.Generic)

-- |
-- Create a value of 'DescribePermissionsResponse' 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:
--
-- 'permissions', 'describePermissionsResponse_permissions' - An array of @Permission@ objects that describe the stack permissions.
--
-- -   If the request object contains only a stack ID, the array contains a
--     @Permission@ object with permissions for each of the stack IAM ARNs.
--
-- -   If the request object contains only an IAM ARN, the array contains a
--     @Permission@ object with permissions for each of the user\'s stack
--     IDs.
--
-- -   If the request contains a stack ID and an IAM ARN, the array
--     contains a single @Permission@ object with permissions for the
--     specified stack and IAM ARN.
--
-- 'httpStatus', 'describePermissionsResponse_httpStatus' - The response's http status code.
newDescribePermissionsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DescribePermissionsResponse
newDescribePermissionsResponse :: Int -> DescribePermissionsResponse
newDescribePermissionsResponse Int
pHttpStatus_ =
  DescribePermissionsResponse'
    { $sel:permissions:DescribePermissionsResponse' :: Maybe [Permission]
permissions =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DescribePermissionsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An array of @Permission@ objects that describe the stack permissions.
--
-- -   If the request object contains only a stack ID, the array contains a
--     @Permission@ object with permissions for each of the stack IAM ARNs.
--
-- -   If the request object contains only an IAM ARN, the array contains a
--     @Permission@ object with permissions for each of the user\'s stack
--     IDs.
--
-- -   If the request contains a stack ID and an IAM ARN, the array
--     contains a single @Permission@ object with permissions for the
--     specified stack and IAM ARN.
describePermissionsResponse_permissions :: Lens.Lens' DescribePermissionsResponse (Prelude.Maybe [Permission])
describePermissionsResponse_permissions :: Lens' DescribePermissionsResponse (Maybe [Permission])
describePermissionsResponse_permissions = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribePermissionsResponse' {Maybe [Permission]
permissions :: Maybe [Permission]
$sel:permissions:DescribePermissionsResponse' :: DescribePermissionsResponse -> Maybe [Permission]
permissions} -> Maybe [Permission]
permissions) (\s :: DescribePermissionsResponse
s@DescribePermissionsResponse' {} Maybe [Permission]
a -> DescribePermissionsResponse
s {$sel:permissions:DescribePermissionsResponse' :: Maybe [Permission]
permissions = Maybe [Permission]
a} :: DescribePermissionsResponse) 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

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

instance Prelude.NFData DescribePermissionsResponse where
  rnf :: DescribePermissionsResponse -> ()
rnf DescribePermissionsResponse' {Int
Maybe [Permission]
httpStatus :: Int
permissions :: Maybe [Permission]
$sel:httpStatus:DescribePermissionsResponse' :: DescribePermissionsResponse -> Int
$sel:permissions:DescribePermissionsResponse' :: DescribePermissionsResponse -> Maybe [Permission]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Permission]
permissions
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus