{-# 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.IoT.UpdateMitigationAction
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Updates the definition for the specified mitigation action.
--
-- Requires permission to access the
-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions UpdateMitigationAction>
-- action.
module Amazonka.IoT.UpdateMitigationAction
  ( -- * Creating a Request
    UpdateMitigationAction (..),
    newUpdateMitigationAction,

    -- * Request Lenses
    updateMitigationAction_actionParams,
    updateMitigationAction_roleArn,
    updateMitigationAction_actionName,

    -- * Destructuring the Response
    UpdateMitigationActionResponse (..),
    newUpdateMitigationActionResponse,

    -- * Response Lenses
    updateMitigationActionResponse_actionArn,
    updateMitigationActionResponse_actionId,
    updateMitigationActionResponse_httpStatus,
  )
where

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

-- | /See:/ 'newUpdateMitigationAction' smart constructor.
data UpdateMitigationAction = UpdateMitigationAction'
  { -- | Defines the type of action and the parameters for that action.
    UpdateMitigationAction -> Maybe MitigationActionParams
actionParams :: Prelude.Maybe MitigationActionParams,
    -- | The ARN of the IAM role that is used to apply the mitigation action.
    UpdateMitigationAction -> Maybe Text
roleArn :: Prelude.Maybe Prelude.Text,
    -- | The friendly name for the mitigation action. You cannot change the name
    -- by using @UpdateMitigationAction@. Instead, you must delete and recreate
    -- the mitigation action with the new name.
    UpdateMitigationAction -> Text
actionName :: Prelude.Text
  }
  deriving (UpdateMitigationAction -> UpdateMitigationAction -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateMitigationAction -> UpdateMitigationAction -> Bool
$c/= :: UpdateMitigationAction -> UpdateMitigationAction -> Bool
== :: UpdateMitigationAction -> UpdateMitigationAction -> Bool
$c== :: UpdateMitigationAction -> UpdateMitigationAction -> Bool
Prelude.Eq, ReadPrec [UpdateMitigationAction]
ReadPrec UpdateMitigationAction
Int -> ReadS UpdateMitigationAction
ReadS [UpdateMitigationAction]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateMitigationAction]
$creadListPrec :: ReadPrec [UpdateMitigationAction]
readPrec :: ReadPrec UpdateMitigationAction
$creadPrec :: ReadPrec UpdateMitigationAction
readList :: ReadS [UpdateMitigationAction]
$creadList :: ReadS [UpdateMitigationAction]
readsPrec :: Int -> ReadS UpdateMitigationAction
$creadsPrec :: Int -> ReadS UpdateMitigationAction
Prelude.Read, Int -> UpdateMitigationAction -> ShowS
[UpdateMitigationAction] -> ShowS
UpdateMitigationAction -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateMitigationAction] -> ShowS
$cshowList :: [UpdateMitigationAction] -> ShowS
show :: UpdateMitigationAction -> String
$cshow :: UpdateMitigationAction -> String
showsPrec :: Int -> UpdateMitigationAction -> ShowS
$cshowsPrec :: Int -> UpdateMitigationAction -> ShowS
Prelude.Show, forall x. Rep UpdateMitigationAction x -> UpdateMitigationAction
forall x. UpdateMitigationAction -> Rep UpdateMitigationAction x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UpdateMitigationAction x -> UpdateMitigationAction
$cfrom :: forall x. UpdateMitigationAction -> Rep UpdateMitigationAction x
Prelude.Generic)

-- |
-- Create a value of 'UpdateMitigationAction' 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:
--
-- 'actionParams', 'updateMitigationAction_actionParams' - Defines the type of action and the parameters for that action.
--
-- 'roleArn', 'updateMitigationAction_roleArn' - The ARN of the IAM role that is used to apply the mitigation action.
--
-- 'actionName', 'updateMitigationAction_actionName' - The friendly name for the mitigation action. You cannot change the name
-- by using @UpdateMitigationAction@. Instead, you must delete and recreate
-- the mitigation action with the new name.
newUpdateMitigationAction ::
  -- | 'actionName'
  Prelude.Text ->
  UpdateMitigationAction
newUpdateMitigationAction :: Text -> UpdateMitigationAction
newUpdateMitigationAction Text
pActionName_ =
  UpdateMitigationAction'
    { $sel:actionParams:UpdateMitigationAction' :: Maybe MitigationActionParams
actionParams =
        forall a. Maybe a
Prelude.Nothing,
      $sel:roleArn:UpdateMitigationAction' :: Maybe Text
roleArn = forall a. Maybe a
Prelude.Nothing,
      $sel:actionName:UpdateMitigationAction' :: Text
actionName = Text
pActionName_
    }

-- | Defines the type of action and the parameters for that action.
updateMitigationAction_actionParams :: Lens.Lens' UpdateMitigationAction (Prelude.Maybe MitigationActionParams)
updateMitigationAction_actionParams :: Lens' UpdateMitigationAction (Maybe MitigationActionParams)
updateMitigationAction_actionParams = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateMitigationAction' {Maybe MitigationActionParams
actionParams :: Maybe MitigationActionParams
$sel:actionParams:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe MitigationActionParams
actionParams} -> Maybe MitigationActionParams
actionParams) (\s :: UpdateMitigationAction
s@UpdateMitigationAction' {} Maybe MitigationActionParams
a -> UpdateMitigationAction
s {$sel:actionParams:UpdateMitigationAction' :: Maybe MitigationActionParams
actionParams = Maybe MitigationActionParams
a} :: UpdateMitigationAction)

-- | The ARN of the IAM role that is used to apply the mitigation action.
updateMitigationAction_roleArn :: Lens.Lens' UpdateMitigationAction (Prelude.Maybe Prelude.Text)
updateMitigationAction_roleArn :: Lens' UpdateMitigationAction (Maybe Text)
updateMitigationAction_roleArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateMitigationAction' {Maybe Text
roleArn :: Maybe Text
$sel:roleArn:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe Text
roleArn} -> Maybe Text
roleArn) (\s :: UpdateMitigationAction
s@UpdateMitigationAction' {} Maybe Text
a -> UpdateMitigationAction
s {$sel:roleArn:UpdateMitigationAction' :: Maybe Text
roleArn = Maybe Text
a} :: UpdateMitigationAction)

-- | The friendly name for the mitigation action. You cannot change the name
-- by using @UpdateMitigationAction@. Instead, you must delete and recreate
-- the mitigation action with the new name.
updateMitigationAction_actionName :: Lens.Lens' UpdateMitigationAction Prelude.Text
updateMitigationAction_actionName :: Lens' UpdateMitigationAction Text
updateMitigationAction_actionName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateMitigationAction' {Text
actionName :: Text
$sel:actionName:UpdateMitigationAction' :: UpdateMitigationAction -> Text
actionName} -> Text
actionName) (\s :: UpdateMitigationAction
s@UpdateMitigationAction' {} Text
a -> UpdateMitigationAction
s {$sel:actionName:UpdateMitigationAction' :: Text
actionName = Text
a} :: UpdateMitigationAction)

instance Core.AWSRequest UpdateMitigationAction where
  type
    AWSResponse UpdateMitigationAction =
      UpdateMitigationActionResponse
  request :: (Service -> Service)
-> UpdateMitigationAction -> Request UpdateMitigationAction
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.patchJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy UpdateMitigationAction
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse UpdateMitigationAction)))
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 -> Maybe Text -> Int -> UpdateMitigationActionResponse
UpdateMitigationActionResponse'
            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
"actionArn")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"actionId")
            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 UpdateMitigationAction where
  hashWithSalt :: Int -> UpdateMitigationAction -> Int
hashWithSalt Int
_salt UpdateMitigationAction' {Maybe Text
Maybe MitigationActionParams
Text
actionName :: Text
roleArn :: Maybe Text
actionParams :: Maybe MitigationActionParams
$sel:actionName:UpdateMitigationAction' :: UpdateMitigationAction -> Text
$sel:roleArn:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe Text
$sel:actionParams:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe MitigationActionParams
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe MitigationActionParams
actionParams
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
roleArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
actionName

instance Prelude.NFData UpdateMitigationAction where
  rnf :: UpdateMitigationAction -> ()
rnf UpdateMitigationAction' {Maybe Text
Maybe MitigationActionParams
Text
actionName :: Text
roleArn :: Maybe Text
actionParams :: Maybe MitigationActionParams
$sel:actionName:UpdateMitigationAction' :: UpdateMitigationAction -> Text
$sel:roleArn:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe Text
$sel:actionParams:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe MitigationActionParams
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe MitigationActionParams
actionParams
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
roleArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
actionName

instance Data.ToHeaders UpdateMitigationAction where
  toHeaders :: UpdateMitigationAction -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

instance Data.ToJSON UpdateMitigationAction where
  toJSON :: UpdateMitigationAction -> Value
toJSON UpdateMitigationAction' {Maybe Text
Maybe MitigationActionParams
Text
actionName :: Text
roleArn :: Maybe Text
actionParams :: Maybe MitigationActionParams
$sel:actionName:UpdateMitigationAction' :: UpdateMitigationAction -> Text
$sel:roleArn:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe Text
$sel:actionParams:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe MitigationActionParams
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"actionParams" 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 MitigationActionParams
actionParams,
            (Key
"roleArn" 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
roleArn
          ]
      )

instance Data.ToPath UpdateMitigationAction where
  toPath :: UpdateMitigationAction -> ByteString
toPath UpdateMitigationAction' {Maybe Text
Maybe MitigationActionParams
Text
actionName :: Text
roleArn :: Maybe Text
actionParams :: Maybe MitigationActionParams
$sel:actionName:UpdateMitigationAction' :: UpdateMitigationAction -> Text
$sel:roleArn:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe Text
$sel:actionParams:UpdateMitigationAction' :: UpdateMitigationAction -> Maybe MitigationActionParams
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/mitigationactions/actions/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
actionName]

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

-- | /See:/ 'newUpdateMitigationActionResponse' smart constructor.
data UpdateMitigationActionResponse = UpdateMitigationActionResponse'
  { -- | The ARN for the new mitigation action.
    UpdateMitigationActionResponse -> Maybe Text
actionArn :: Prelude.Maybe Prelude.Text,
    -- | A unique identifier for the mitigation action.
    UpdateMitigationActionResponse -> Maybe Text
actionId :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    UpdateMitigationActionResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (UpdateMitigationActionResponse
-> UpdateMitigationActionResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateMitigationActionResponse
-> UpdateMitigationActionResponse -> Bool
$c/= :: UpdateMitigationActionResponse
-> UpdateMitigationActionResponse -> Bool
== :: UpdateMitigationActionResponse
-> UpdateMitigationActionResponse -> Bool
$c== :: UpdateMitigationActionResponse
-> UpdateMitigationActionResponse -> Bool
Prelude.Eq, ReadPrec [UpdateMitigationActionResponse]
ReadPrec UpdateMitigationActionResponse
Int -> ReadS UpdateMitigationActionResponse
ReadS [UpdateMitigationActionResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateMitigationActionResponse]
$creadListPrec :: ReadPrec [UpdateMitigationActionResponse]
readPrec :: ReadPrec UpdateMitigationActionResponse
$creadPrec :: ReadPrec UpdateMitigationActionResponse
readList :: ReadS [UpdateMitigationActionResponse]
$creadList :: ReadS [UpdateMitigationActionResponse]
readsPrec :: Int -> ReadS UpdateMitigationActionResponse
$creadsPrec :: Int -> ReadS UpdateMitigationActionResponse
Prelude.Read, Int -> UpdateMitigationActionResponse -> ShowS
[UpdateMitigationActionResponse] -> ShowS
UpdateMitigationActionResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateMitigationActionResponse] -> ShowS
$cshowList :: [UpdateMitigationActionResponse] -> ShowS
show :: UpdateMitigationActionResponse -> String
$cshow :: UpdateMitigationActionResponse -> String
showsPrec :: Int -> UpdateMitigationActionResponse -> ShowS
$cshowsPrec :: Int -> UpdateMitigationActionResponse -> ShowS
Prelude.Show, forall x.
Rep UpdateMitigationActionResponse x
-> UpdateMitigationActionResponse
forall x.
UpdateMitigationActionResponse
-> Rep UpdateMitigationActionResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateMitigationActionResponse x
-> UpdateMitigationActionResponse
$cfrom :: forall x.
UpdateMitigationActionResponse
-> Rep UpdateMitigationActionResponse x
Prelude.Generic)

-- |
-- Create a value of 'UpdateMitigationActionResponse' 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:
--
-- 'actionArn', 'updateMitigationActionResponse_actionArn' - The ARN for the new mitigation action.
--
-- 'actionId', 'updateMitigationActionResponse_actionId' - A unique identifier for the mitigation action.
--
-- 'httpStatus', 'updateMitigationActionResponse_httpStatus' - The response's http status code.
newUpdateMitigationActionResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  UpdateMitigationActionResponse
newUpdateMitigationActionResponse :: Int -> UpdateMitigationActionResponse
newUpdateMitigationActionResponse Int
pHttpStatus_ =
  UpdateMitigationActionResponse'
    { $sel:actionArn:UpdateMitigationActionResponse' :: Maybe Text
actionArn =
        forall a. Maybe a
Prelude.Nothing,
      $sel:actionId:UpdateMitigationActionResponse' :: Maybe Text
actionId = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:UpdateMitigationActionResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The ARN for the new mitigation action.
updateMitigationActionResponse_actionArn :: Lens.Lens' UpdateMitigationActionResponse (Prelude.Maybe Prelude.Text)
updateMitigationActionResponse_actionArn :: Lens' UpdateMitigationActionResponse (Maybe Text)
updateMitigationActionResponse_actionArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateMitigationActionResponse' {Maybe Text
actionArn :: Maybe Text
$sel:actionArn:UpdateMitigationActionResponse' :: UpdateMitigationActionResponse -> Maybe Text
actionArn} -> Maybe Text
actionArn) (\s :: UpdateMitigationActionResponse
s@UpdateMitigationActionResponse' {} Maybe Text
a -> UpdateMitigationActionResponse
s {$sel:actionArn:UpdateMitigationActionResponse' :: Maybe Text
actionArn = Maybe Text
a} :: UpdateMitigationActionResponse)

-- | A unique identifier for the mitigation action.
updateMitigationActionResponse_actionId :: Lens.Lens' UpdateMitigationActionResponse (Prelude.Maybe Prelude.Text)
updateMitigationActionResponse_actionId :: Lens' UpdateMitigationActionResponse (Maybe Text)
updateMitigationActionResponse_actionId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateMitigationActionResponse' {Maybe Text
actionId :: Maybe Text
$sel:actionId:UpdateMitigationActionResponse' :: UpdateMitigationActionResponse -> Maybe Text
actionId} -> Maybe Text
actionId) (\s :: UpdateMitigationActionResponse
s@UpdateMitigationActionResponse' {} Maybe Text
a -> UpdateMitigationActionResponse
s {$sel:actionId:UpdateMitigationActionResponse' :: Maybe Text
actionId = Maybe Text
a} :: UpdateMitigationActionResponse)

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

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