{-# 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.FMS.GetViolationDetails
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Retrieves violations for a resource based on the specified Firewall
-- Manager policy and Amazon Web Services account.
module Amazonka.FMS.GetViolationDetails
  ( -- * Creating a Request
    GetViolationDetails (..),
    newGetViolationDetails,

    -- * Request Lenses
    getViolationDetails_policyId,
    getViolationDetails_memberAccount,
    getViolationDetails_resourceId,
    getViolationDetails_resourceType,

    -- * Destructuring the Response
    GetViolationDetailsResponse (..),
    newGetViolationDetailsResponse,

    -- * Response Lenses
    getViolationDetailsResponse_violationDetail,
    getViolationDetailsResponse_httpStatus,
  )
where

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

-- | /See:/ 'newGetViolationDetails' smart constructor.
data GetViolationDetails = GetViolationDetails'
  { -- | The ID of the Firewall Manager policy that you want the details for.
    -- This currently only supports security group content audit policies.
    GetViolationDetails -> Text
policyId :: Prelude.Text,
    -- | The Amazon Web Services account ID that you want the details for.
    GetViolationDetails -> Text
memberAccount :: Prelude.Text,
    -- | The ID of the resource that has violations.
    GetViolationDetails -> Text
resourceId :: Prelude.Text,
    -- | The resource type. This is in the format shown in the
    -- <https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html Amazon Web Services Resource Types Reference>.
    -- Supported resource types are: @AWS::EC2::Instance@,
    -- @AWS::EC2::NetworkInterface@, @AWS::EC2::SecurityGroup@,
    -- @AWS::NetworkFirewall::FirewallPolicy@, and @AWS::EC2::Subnet@.
    GetViolationDetails -> Text
resourceType :: Prelude.Text
  }
  deriving (GetViolationDetails -> GetViolationDetails -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetViolationDetails -> GetViolationDetails -> Bool
$c/= :: GetViolationDetails -> GetViolationDetails -> Bool
== :: GetViolationDetails -> GetViolationDetails -> Bool
$c== :: GetViolationDetails -> GetViolationDetails -> Bool
Prelude.Eq, ReadPrec [GetViolationDetails]
ReadPrec GetViolationDetails
Int -> ReadS GetViolationDetails
ReadS [GetViolationDetails]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetViolationDetails]
$creadListPrec :: ReadPrec [GetViolationDetails]
readPrec :: ReadPrec GetViolationDetails
$creadPrec :: ReadPrec GetViolationDetails
readList :: ReadS [GetViolationDetails]
$creadList :: ReadS [GetViolationDetails]
readsPrec :: Int -> ReadS GetViolationDetails
$creadsPrec :: Int -> ReadS GetViolationDetails
Prelude.Read, Int -> GetViolationDetails -> ShowS
[GetViolationDetails] -> ShowS
GetViolationDetails -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetViolationDetails] -> ShowS
$cshowList :: [GetViolationDetails] -> ShowS
show :: GetViolationDetails -> String
$cshow :: GetViolationDetails -> String
showsPrec :: Int -> GetViolationDetails -> ShowS
$cshowsPrec :: Int -> GetViolationDetails -> ShowS
Prelude.Show, forall x. Rep GetViolationDetails x -> GetViolationDetails
forall x. GetViolationDetails -> Rep GetViolationDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetViolationDetails x -> GetViolationDetails
$cfrom :: forall x. GetViolationDetails -> Rep GetViolationDetails x
Prelude.Generic)

-- |
-- Create a value of 'GetViolationDetails' 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:
--
-- 'policyId', 'getViolationDetails_policyId' - The ID of the Firewall Manager policy that you want the details for.
-- This currently only supports security group content audit policies.
--
-- 'memberAccount', 'getViolationDetails_memberAccount' - The Amazon Web Services account ID that you want the details for.
--
-- 'resourceId', 'getViolationDetails_resourceId' - The ID of the resource that has violations.
--
-- 'resourceType', 'getViolationDetails_resourceType' - The resource type. This is in the format shown in the
-- <https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html Amazon Web Services Resource Types Reference>.
-- Supported resource types are: @AWS::EC2::Instance@,
-- @AWS::EC2::NetworkInterface@, @AWS::EC2::SecurityGroup@,
-- @AWS::NetworkFirewall::FirewallPolicy@, and @AWS::EC2::Subnet@.
newGetViolationDetails ::
  -- | 'policyId'
  Prelude.Text ->
  -- | 'memberAccount'
  Prelude.Text ->
  -- | 'resourceId'
  Prelude.Text ->
  -- | 'resourceType'
  Prelude.Text ->
  GetViolationDetails
newGetViolationDetails :: Text -> Text -> Text -> Text -> GetViolationDetails
newGetViolationDetails
  Text
pPolicyId_
  Text
pMemberAccount_
  Text
pResourceId_
  Text
pResourceType_ =
    GetViolationDetails'
      { $sel:policyId:GetViolationDetails' :: Text
policyId = Text
pPolicyId_,
        $sel:memberAccount:GetViolationDetails' :: Text
memberAccount = Text
pMemberAccount_,
        $sel:resourceId:GetViolationDetails' :: Text
resourceId = Text
pResourceId_,
        $sel:resourceType:GetViolationDetails' :: Text
resourceType = Text
pResourceType_
      }

-- | The ID of the Firewall Manager policy that you want the details for.
-- This currently only supports security group content audit policies.
getViolationDetails_policyId :: Lens.Lens' GetViolationDetails Prelude.Text
getViolationDetails_policyId :: Lens' GetViolationDetails Text
getViolationDetails_policyId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetViolationDetails' {Text
policyId :: Text
$sel:policyId:GetViolationDetails' :: GetViolationDetails -> Text
policyId} -> Text
policyId) (\s :: GetViolationDetails
s@GetViolationDetails' {} Text
a -> GetViolationDetails
s {$sel:policyId:GetViolationDetails' :: Text
policyId = Text
a} :: GetViolationDetails)

-- | The Amazon Web Services account ID that you want the details for.
getViolationDetails_memberAccount :: Lens.Lens' GetViolationDetails Prelude.Text
getViolationDetails_memberAccount :: Lens' GetViolationDetails Text
getViolationDetails_memberAccount = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetViolationDetails' {Text
memberAccount :: Text
$sel:memberAccount:GetViolationDetails' :: GetViolationDetails -> Text
memberAccount} -> Text
memberAccount) (\s :: GetViolationDetails
s@GetViolationDetails' {} Text
a -> GetViolationDetails
s {$sel:memberAccount:GetViolationDetails' :: Text
memberAccount = Text
a} :: GetViolationDetails)

-- | The ID of the resource that has violations.
getViolationDetails_resourceId :: Lens.Lens' GetViolationDetails Prelude.Text
getViolationDetails_resourceId :: Lens' GetViolationDetails Text
getViolationDetails_resourceId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetViolationDetails' {Text
resourceId :: Text
$sel:resourceId:GetViolationDetails' :: GetViolationDetails -> Text
resourceId} -> Text
resourceId) (\s :: GetViolationDetails
s@GetViolationDetails' {} Text
a -> GetViolationDetails
s {$sel:resourceId:GetViolationDetails' :: Text
resourceId = Text
a} :: GetViolationDetails)

-- | The resource type. This is in the format shown in the
-- <https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html Amazon Web Services Resource Types Reference>.
-- Supported resource types are: @AWS::EC2::Instance@,
-- @AWS::EC2::NetworkInterface@, @AWS::EC2::SecurityGroup@,
-- @AWS::NetworkFirewall::FirewallPolicy@, and @AWS::EC2::Subnet@.
getViolationDetails_resourceType :: Lens.Lens' GetViolationDetails Prelude.Text
getViolationDetails_resourceType :: Lens' GetViolationDetails Text
getViolationDetails_resourceType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetViolationDetails' {Text
resourceType :: Text
$sel:resourceType:GetViolationDetails' :: GetViolationDetails -> Text
resourceType} -> Text
resourceType) (\s :: GetViolationDetails
s@GetViolationDetails' {} Text
a -> GetViolationDetails
s {$sel:resourceType:GetViolationDetails' :: Text
resourceType = Text
a} :: GetViolationDetails)

instance Core.AWSRequest GetViolationDetails where
  type
    AWSResponse GetViolationDetails =
      GetViolationDetailsResponse
  request :: (Service -> Service)
-> GetViolationDetails -> Request GetViolationDetails
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 GetViolationDetails
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GetViolationDetails)))
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 ViolationDetail -> Int -> GetViolationDetailsResponse
GetViolationDetailsResponse'
            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
"ViolationDetail")
            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 GetViolationDetails where
  hashWithSalt :: Int -> GetViolationDetails -> Int
hashWithSalt Int
_salt GetViolationDetails' {Text
resourceType :: Text
resourceId :: Text
memberAccount :: Text
policyId :: Text
$sel:resourceType:GetViolationDetails' :: GetViolationDetails -> Text
$sel:resourceId:GetViolationDetails' :: GetViolationDetails -> Text
$sel:memberAccount:GetViolationDetails' :: GetViolationDetails -> Text
$sel:policyId:GetViolationDetails' :: GetViolationDetails -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
policyId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
memberAccount
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceType

instance Prelude.NFData GetViolationDetails where
  rnf :: GetViolationDetails -> ()
rnf GetViolationDetails' {Text
resourceType :: Text
resourceId :: Text
memberAccount :: Text
policyId :: Text
$sel:resourceType:GetViolationDetails' :: GetViolationDetails -> Text
$sel:resourceId:GetViolationDetails' :: GetViolationDetails -> Text
$sel:memberAccount:GetViolationDetails' :: GetViolationDetails -> Text
$sel:policyId:GetViolationDetails' :: GetViolationDetails -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
policyId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
memberAccount
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
resourceId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
resourceType

instance Data.ToHeaders GetViolationDetails where
  toHeaders :: GetViolationDetails -> 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
"AWSFMS_20180101.GetViolationDetails" ::
                          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 GetViolationDetails where
  toJSON :: GetViolationDetails -> Value
toJSON GetViolationDetails' {Text
resourceType :: Text
resourceId :: Text
memberAccount :: Text
policyId :: Text
$sel:resourceType:GetViolationDetails' :: GetViolationDetails -> Text
$sel:resourceId:GetViolationDetails' :: GetViolationDetails -> Text
$sel:memberAccount:GetViolationDetails' :: GetViolationDetails -> Text
$sel:policyId:GetViolationDetails' :: GetViolationDetails -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"PolicyId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
policyId),
            forall a. a -> Maybe a
Prelude.Just (Key
"MemberAccount" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
memberAccount),
            forall a. a -> Maybe a
Prelude.Just (Key
"ResourceId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
resourceId),
            forall a. a -> Maybe a
Prelude.Just (Key
"ResourceType" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
resourceType)
          ]
      )

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

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

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

-- |
-- Create a value of 'GetViolationDetailsResponse' 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:
--
-- 'violationDetail', 'getViolationDetailsResponse_violationDetail' - Violation detail for a resource.
--
-- 'httpStatus', 'getViolationDetailsResponse_httpStatus' - The response's http status code.
newGetViolationDetailsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetViolationDetailsResponse
newGetViolationDetailsResponse :: Int -> GetViolationDetailsResponse
newGetViolationDetailsResponse Int
pHttpStatus_ =
  GetViolationDetailsResponse'
    { $sel:violationDetail:GetViolationDetailsResponse' :: Maybe ViolationDetail
violationDetail =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetViolationDetailsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Violation detail for a resource.
getViolationDetailsResponse_violationDetail :: Lens.Lens' GetViolationDetailsResponse (Prelude.Maybe ViolationDetail)
getViolationDetailsResponse_violationDetail :: Lens' GetViolationDetailsResponse (Maybe ViolationDetail)
getViolationDetailsResponse_violationDetail = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetViolationDetailsResponse' {Maybe ViolationDetail
violationDetail :: Maybe ViolationDetail
$sel:violationDetail:GetViolationDetailsResponse' :: GetViolationDetailsResponse -> Maybe ViolationDetail
violationDetail} -> Maybe ViolationDetail
violationDetail) (\s :: GetViolationDetailsResponse
s@GetViolationDetailsResponse' {} Maybe ViolationDetail
a -> GetViolationDetailsResponse
s {$sel:violationDetail:GetViolationDetailsResponse' :: Maybe ViolationDetail
violationDetail = Maybe ViolationDetail
a} :: GetViolationDetailsResponse)

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

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