{-# 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.GuardDuty.CreateFilter
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a filter using the specified finding criteria.
module Amazonka.GuardDuty.CreateFilter
  ( -- * Creating a Request
    CreateFilter (..),
    newCreateFilter,

    -- * Request Lenses
    createFilter_action,
    createFilter_clientToken,
    createFilter_description,
    createFilter_rank,
    createFilter_tags,
    createFilter_detectorId,
    createFilter_name,
    createFilter_findingCriteria,

    -- * Destructuring the Response
    CreateFilterResponse (..),
    newCreateFilterResponse,

    -- * Response Lenses
    createFilterResponse_httpStatus,
    createFilterResponse_name,
  )
where

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

-- | /See:/ 'newCreateFilter' smart constructor.
data CreateFilter = CreateFilter'
  { -- | Specifies the action that is to be applied to the findings that match
    -- the filter.
    CreateFilter -> Maybe FilterAction
action :: Prelude.Maybe FilterAction,
    -- | The idempotency token for the create request.
    CreateFilter -> Maybe Text
clientToken :: Prelude.Maybe Prelude.Text,
    -- | The description of the filter. Valid special characters include period
    -- (.), underscore (_), dash (-), and whitespace. The new line character is
    -- considered to be an invalid input for description.
    CreateFilter -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | Specifies the position of the filter in the list of current filters.
    -- Also specifies the order in which this filter is applied to the
    -- findings.
    CreateFilter -> Maybe Natural
rank :: Prelude.Maybe Prelude.Natural,
    -- | The tags to be added to a new filter resource.
    CreateFilter -> Maybe (HashMap Text Text)
tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | The ID of the detector belonging to the GuardDuty account that you want
    -- to create a filter for.
    CreateFilter -> Text
detectorId :: Prelude.Text,
    -- | The name of the filter. Valid characters include period (.), underscore
    -- (_), dash (-), and alphanumeric characters. A whitespace is considered
    -- to be an invalid character.
    CreateFilter -> Text
name :: Prelude.Text,
    -- | Represents the criteria to be used in the filter for querying findings.
    --
    -- You can only use the following attributes to query findings:
    --
    -- -   accountId
    --
    -- -   region
    --
    -- -   confidence
    --
    -- -   id
    --
    -- -   resource.accessKeyDetails.accessKeyId
    --
    -- -   resource.accessKeyDetails.principalId
    --
    -- -   resource.accessKeyDetails.userName
    --
    -- -   resource.accessKeyDetails.userType
    --
    -- -   resource.instanceDetails.iamInstanceProfile.id
    --
    -- -   resource.instanceDetails.imageId
    --
    -- -   resource.instanceDetails.instanceId
    --
    -- -   resource.instanceDetails.outpostArn
    --
    -- -   resource.instanceDetails.networkInterfaces.ipv6Addresses
    --
    -- -   resource.instanceDetails.networkInterfaces.privateIpAddresses.privateIpAddress
    --
    -- -   resource.instanceDetails.networkInterfaces.publicDnsName
    --
    -- -   resource.instanceDetails.networkInterfaces.publicIp
    --
    -- -   resource.instanceDetails.networkInterfaces.securityGroups.groupId
    --
    -- -   resource.instanceDetails.networkInterfaces.securityGroups.groupName
    --
    -- -   resource.instanceDetails.networkInterfaces.subnetId
    --
    -- -   resource.instanceDetails.networkInterfaces.vpcId
    --
    -- -   resource.instanceDetails.tags.key
    --
    -- -   resource.instanceDetails.tags.value
    --
    -- -   resource.resourceType
    --
    -- -   service.action.actionType
    --
    -- -   service.action.awsApiCallAction.api
    --
    -- -   service.action.awsApiCallAction.callerType
    --
    -- -   service.action.awsApiCallAction.errorCode
    --
    -- -   service.action.awsApiCallAction.userAgent
    --
    -- -   service.action.awsApiCallAction.remoteIpDetails.city.cityName
    --
    -- -   service.action.awsApiCallAction.remoteIpDetails.country.countryName
    --
    -- -   service.action.awsApiCallAction.remoteIpDetails.ipAddressV4
    --
    -- -   service.action.awsApiCallAction.remoteIpDetails.organization.asn
    --
    -- -   service.action.awsApiCallAction.remoteIpDetails.organization.asnOrg
    --
    -- -   service.action.awsApiCallAction.serviceName
    --
    -- -   service.action.dnsRequestAction.domain
    --
    -- -   service.action.networkConnectionAction.blocked
    --
    -- -   service.action.networkConnectionAction.connectionDirection
    --
    -- -   service.action.networkConnectionAction.localPortDetails.port
    --
    -- -   service.action.networkConnectionAction.protocol
    --
    -- -   service.action.networkConnectionAction.localIpDetails.ipAddressV4
    --
    -- -   service.action.networkConnectionAction.remoteIpDetails.city.cityName
    --
    -- -   service.action.networkConnectionAction.remoteIpDetails.country.countryName
    --
    -- -   service.action.networkConnectionAction.remoteIpDetails.ipAddressV4
    --
    -- -   service.action.networkConnectionAction.remoteIpDetails.organization.asn
    --
    -- -   service.action.networkConnectionAction.remoteIpDetails.organization.asnOrg
    --
    -- -   service.action.networkConnectionAction.remotePortDetails.port
    --
    -- -   service.additionalInfo.threatListName
    --
    -- -   resource.s3BucketDetails.publicAccess.effectivePermissions
    --
    -- -   resource.s3BucketDetails.name
    --
    -- -   resource.s3BucketDetails.tags.key
    --
    -- -   resource.s3BucketDetails.tags.value
    --
    -- -   resource.s3BucketDetails.type
    --
    -- -   service.archived
    --
    --     When this attribute is set to TRUE, only archived findings are
    --     listed. When it\'s set to FALSE, only unarchived findings are
    --     listed. When this attribute is not set, all existing findings are
    --     listed.
    --
    -- -   service.resourceRole
    --
    -- -   severity
    --
    -- -   type
    --
    -- -   updatedAt
    --
    --     Type: ISO 8601 string format: YYYY-MM-DDTHH:MM:SS.SSSZ or
    --     YYYY-MM-DDTHH:MM:SSZ depending on whether the value contains
    --     milliseconds.
    CreateFilter -> FindingCriteria
findingCriteria :: FindingCriteria
  }
  deriving (CreateFilter -> CreateFilter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateFilter -> CreateFilter -> Bool
$c/= :: CreateFilter -> CreateFilter -> Bool
== :: CreateFilter -> CreateFilter -> Bool
$c== :: CreateFilter -> CreateFilter -> Bool
Prelude.Eq, ReadPrec [CreateFilter]
ReadPrec CreateFilter
Int -> ReadS CreateFilter
ReadS [CreateFilter]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateFilter]
$creadListPrec :: ReadPrec [CreateFilter]
readPrec :: ReadPrec CreateFilter
$creadPrec :: ReadPrec CreateFilter
readList :: ReadS [CreateFilter]
$creadList :: ReadS [CreateFilter]
readsPrec :: Int -> ReadS CreateFilter
$creadsPrec :: Int -> ReadS CreateFilter
Prelude.Read, Int -> CreateFilter -> ShowS
[CreateFilter] -> ShowS
CreateFilter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateFilter] -> ShowS
$cshowList :: [CreateFilter] -> ShowS
show :: CreateFilter -> String
$cshow :: CreateFilter -> String
showsPrec :: Int -> CreateFilter -> ShowS
$cshowsPrec :: Int -> CreateFilter -> ShowS
Prelude.Show, forall x. Rep CreateFilter x -> CreateFilter
forall x. CreateFilter -> Rep CreateFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateFilter x -> CreateFilter
$cfrom :: forall x. CreateFilter -> Rep CreateFilter x
Prelude.Generic)

-- |
-- Create a value of 'CreateFilter' 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:
--
-- 'action', 'createFilter_action' - Specifies the action that is to be applied to the findings that match
-- the filter.
--
-- 'clientToken', 'createFilter_clientToken' - The idempotency token for the create request.
--
-- 'description', 'createFilter_description' - The description of the filter. Valid special characters include period
-- (.), underscore (_), dash (-), and whitespace. The new line character is
-- considered to be an invalid input for description.
--
-- 'rank', 'createFilter_rank' - Specifies the position of the filter in the list of current filters.
-- Also specifies the order in which this filter is applied to the
-- findings.
--
-- 'tags', 'createFilter_tags' - The tags to be added to a new filter resource.
--
-- 'detectorId', 'createFilter_detectorId' - The ID of the detector belonging to the GuardDuty account that you want
-- to create a filter for.
--
-- 'name', 'createFilter_name' - The name of the filter. Valid characters include period (.), underscore
-- (_), dash (-), and alphanumeric characters. A whitespace is considered
-- to be an invalid character.
--
-- 'findingCriteria', 'createFilter_findingCriteria' - Represents the criteria to be used in the filter for querying findings.
--
-- You can only use the following attributes to query findings:
--
-- -   accountId
--
-- -   region
--
-- -   confidence
--
-- -   id
--
-- -   resource.accessKeyDetails.accessKeyId
--
-- -   resource.accessKeyDetails.principalId
--
-- -   resource.accessKeyDetails.userName
--
-- -   resource.accessKeyDetails.userType
--
-- -   resource.instanceDetails.iamInstanceProfile.id
--
-- -   resource.instanceDetails.imageId
--
-- -   resource.instanceDetails.instanceId
--
-- -   resource.instanceDetails.outpostArn
--
-- -   resource.instanceDetails.networkInterfaces.ipv6Addresses
--
-- -   resource.instanceDetails.networkInterfaces.privateIpAddresses.privateIpAddress
--
-- -   resource.instanceDetails.networkInterfaces.publicDnsName
--
-- -   resource.instanceDetails.networkInterfaces.publicIp
--
-- -   resource.instanceDetails.networkInterfaces.securityGroups.groupId
--
-- -   resource.instanceDetails.networkInterfaces.securityGroups.groupName
--
-- -   resource.instanceDetails.networkInterfaces.subnetId
--
-- -   resource.instanceDetails.networkInterfaces.vpcId
--
-- -   resource.instanceDetails.tags.key
--
-- -   resource.instanceDetails.tags.value
--
-- -   resource.resourceType
--
-- -   service.action.actionType
--
-- -   service.action.awsApiCallAction.api
--
-- -   service.action.awsApiCallAction.callerType
--
-- -   service.action.awsApiCallAction.errorCode
--
-- -   service.action.awsApiCallAction.userAgent
--
-- -   service.action.awsApiCallAction.remoteIpDetails.city.cityName
--
-- -   service.action.awsApiCallAction.remoteIpDetails.country.countryName
--
-- -   service.action.awsApiCallAction.remoteIpDetails.ipAddressV4
--
-- -   service.action.awsApiCallAction.remoteIpDetails.organization.asn
--
-- -   service.action.awsApiCallAction.remoteIpDetails.organization.asnOrg
--
-- -   service.action.awsApiCallAction.serviceName
--
-- -   service.action.dnsRequestAction.domain
--
-- -   service.action.networkConnectionAction.blocked
--
-- -   service.action.networkConnectionAction.connectionDirection
--
-- -   service.action.networkConnectionAction.localPortDetails.port
--
-- -   service.action.networkConnectionAction.protocol
--
-- -   service.action.networkConnectionAction.localIpDetails.ipAddressV4
--
-- -   service.action.networkConnectionAction.remoteIpDetails.city.cityName
--
-- -   service.action.networkConnectionAction.remoteIpDetails.country.countryName
--
-- -   service.action.networkConnectionAction.remoteIpDetails.ipAddressV4
--
-- -   service.action.networkConnectionAction.remoteIpDetails.organization.asn
--
-- -   service.action.networkConnectionAction.remoteIpDetails.organization.asnOrg
--
-- -   service.action.networkConnectionAction.remotePortDetails.port
--
-- -   service.additionalInfo.threatListName
--
-- -   resource.s3BucketDetails.publicAccess.effectivePermissions
--
-- -   resource.s3BucketDetails.name
--
-- -   resource.s3BucketDetails.tags.key
--
-- -   resource.s3BucketDetails.tags.value
--
-- -   resource.s3BucketDetails.type
--
-- -   service.archived
--
--     When this attribute is set to TRUE, only archived findings are
--     listed. When it\'s set to FALSE, only unarchived findings are
--     listed. When this attribute is not set, all existing findings are
--     listed.
--
-- -   service.resourceRole
--
-- -   severity
--
-- -   type
--
-- -   updatedAt
--
--     Type: ISO 8601 string format: YYYY-MM-DDTHH:MM:SS.SSSZ or
--     YYYY-MM-DDTHH:MM:SSZ depending on whether the value contains
--     milliseconds.
newCreateFilter ::
  -- | 'detectorId'
  Prelude.Text ->
  -- | 'name'
  Prelude.Text ->
  -- | 'findingCriteria'
  FindingCriteria ->
  CreateFilter
newCreateFilter :: Text -> Text -> FindingCriteria -> CreateFilter
newCreateFilter Text
pDetectorId_ Text
pName_ FindingCriteria
pFindingCriteria_ =
  CreateFilter'
    { $sel:action:CreateFilter' :: Maybe FilterAction
action = forall a. Maybe a
Prelude.Nothing,
      $sel:clientToken:CreateFilter' :: Maybe Text
clientToken = forall a. Maybe a
Prelude.Nothing,
      $sel:description:CreateFilter' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
      $sel:rank:CreateFilter' :: Maybe Natural
rank = forall a. Maybe a
Prelude.Nothing,
      $sel:tags:CreateFilter' :: Maybe (HashMap Text Text)
tags = forall a. Maybe a
Prelude.Nothing,
      $sel:detectorId:CreateFilter' :: Text
detectorId = Text
pDetectorId_,
      $sel:name:CreateFilter' :: Text
name = Text
pName_,
      $sel:findingCriteria:CreateFilter' :: FindingCriteria
findingCriteria = FindingCriteria
pFindingCriteria_
    }

-- | Specifies the action that is to be applied to the findings that match
-- the filter.
createFilter_action :: Lens.Lens' CreateFilter (Prelude.Maybe FilterAction)
createFilter_action :: Lens' CreateFilter (Maybe FilterAction)
createFilter_action = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe FilterAction
action :: Maybe FilterAction
$sel:action:CreateFilter' :: CreateFilter -> Maybe FilterAction
action} -> Maybe FilterAction
action) (\s :: CreateFilter
s@CreateFilter' {} Maybe FilterAction
a -> CreateFilter
s {$sel:action:CreateFilter' :: Maybe FilterAction
action = Maybe FilterAction
a} :: CreateFilter)

-- | The idempotency token for the create request.
createFilter_clientToken :: Lens.Lens' CreateFilter (Prelude.Maybe Prelude.Text)
createFilter_clientToken :: Lens' CreateFilter (Maybe Text)
createFilter_clientToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe Text
clientToken :: Maybe Text
$sel:clientToken:CreateFilter' :: CreateFilter -> Maybe Text
clientToken} -> Maybe Text
clientToken) (\s :: CreateFilter
s@CreateFilter' {} Maybe Text
a -> CreateFilter
s {$sel:clientToken:CreateFilter' :: Maybe Text
clientToken = Maybe Text
a} :: CreateFilter)

-- | The description of the filter. Valid special characters include period
-- (.), underscore (_), dash (-), and whitespace. The new line character is
-- considered to be an invalid input for description.
createFilter_description :: Lens.Lens' CreateFilter (Prelude.Maybe Prelude.Text)
createFilter_description :: Lens' CreateFilter (Maybe Text)
createFilter_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe Text
description :: Maybe Text
$sel:description:CreateFilter' :: CreateFilter -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateFilter
s@CreateFilter' {} Maybe Text
a -> CreateFilter
s {$sel:description:CreateFilter' :: Maybe Text
description = Maybe Text
a} :: CreateFilter)

-- | Specifies the position of the filter in the list of current filters.
-- Also specifies the order in which this filter is applied to the
-- findings.
createFilter_rank :: Lens.Lens' CreateFilter (Prelude.Maybe Prelude.Natural)
createFilter_rank :: Lens' CreateFilter (Maybe Natural)
createFilter_rank = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe Natural
rank :: Maybe Natural
$sel:rank:CreateFilter' :: CreateFilter -> Maybe Natural
rank} -> Maybe Natural
rank) (\s :: CreateFilter
s@CreateFilter' {} Maybe Natural
a -> CreateFilter
s {$sel:rank:CreateFilter' :: Maybe Natural
rank = Maybe Natural
a} :: CreateFilter)

-- | The tags to be added to a new filter resource.
createFilter_tags :: Lens.Lens' CreateFilter (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
createFilter_tags :: Lens' CreateFilter (Maybe (HashMap Text Text))
createFilter_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe (HashMap Text Text)
tags :: Maybe (HashMap Text Text)
$sel:tags:CreateFilter' :: CreateFilter -> Maybe (HashMap Text Text)
tags} -> Maybe (HashMap Text Text)
tags) (\s :: CreateFilter
s@CreateFilter' {} Maybe (HashMap Text Text)
a -> CreateFilter
s {$sel:tags:CreateFilter' :: Maybe (HashMap Text Text)
tags = Maybe (HashMap Text Text)
a} :: CreateFilter) 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 ID of the detector belonging to the GuardDuty account that you want
-- to create a filter for.
createFilter_detectorId :: Lens.Lens' CreateFilter Prelude.Text
createFilter_detectorId :: Lens' CreateFilter Text
createFilter_detectorId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Text
detectorId :: Text
$sel:detectorId:CreateFilter' :: CreateFilter -> Text
detectorId} -> Text
detectorId) (\s :: CreateFilter
s@CreateFilter' {} Text
a -> CreateFilter
s {$sel:detectorId:CreateFilter' :: Text
detectorId = Text
a} :: CreateFilter)

-- | The name of the filter. Valid characters include period (.), underscore
-- (_), dash (-), and alphanumeric characters. A whitespace is considered
-- to be an invalid character.
createFilter_name :: Lens.Lens' CreateFilter Prelude.Text
createFilter_name :: Lens' CreateFilter Text
createFilter_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Text
name :: Text
$sel:name:CreateFilter' :: CreateFilter -> Text
name} -> Text
name) (\s :: CreateFilter
s@CreateFilter' {} Text
a -> CreateFilter
s {$sel:name:CreateFilter' :: Text
name = Text
a} :: CreateFilter)

-- | Represents the criteria to be used in the filter for querying findings.
--
-- You can only use the following attributes to query findings:
--
-- -   accountId
--
-- -   region
--
-- -   confidence
--
-- -   id
--
-- -   resource.accessKeyDetails.accessKeyId
--
-- -   resource.accessKeyDetails.principalId
--
-- -   resource.accessKeyDetails.userName
--
-- -   resource.accessKeyDetails.userType
--
-- -   resource.instanceDetails.iamInstanceProfile.id
--
-- -   resource.instanceDetails.imageId
--
-- -   resource.instanceDetails.instanceId
--
-- -   resource.instanceDetails.outpostArn
--
-- -   resource.instanceDetails.networkInterfaces.ipv6Addresses
--
-- -   resource.instanceDetails.networkInterfaces.privateIpAddresses.privateIpAddress
--
-- -   resource.instanceDetails.networkInterfaces.publicDnsName
--
-- -   resource.instanceDetails.networkInterfaces.publicIp
--
-- -   resource.instanceDetails.networkInterfaces.securityGroups.groupId
--
-- -   resource.instanceDetails.networkInterfaces.securityGroups.groupName
--
-- -   resource.instanceDetails.networkInterfaces.subnetId
--
-- -   resource.instanceDetails.networkInterfaces.vpcId
--
-- -   resource.instanceDetails.tags.key
--
-- -   resource.instanceDetails.tags.value
--
-- -   resource.resourceType
--
-- -   service.action.actionType
--
-- -   service.action.awsApiCallAction.api
--
-- -   service.action.awsApiCallAction.callerType
--
-- -   service.action.awsApiCallAction.errorCode
--
-- -   service.action.awsApiCallAction.userAgent
--
-- -   service.action.awsApiCallAction.remoteIpDetails.city.cityName
--
-- -   service.action.awsApiCallAction.remoteIpDetails.country.countryName
--
-- -   service.action.awsApiCallAction.remoteIpDetails.ipAddressV4
--
-- -   service.action.awsApiCallAction.remoteIpDetails.organization.asn
--
-- -   service.action.awsApiCallAction.remoteIpDetails.organization.asnOrg
--
-- -   service.action.awsApiCallAction.serviceName
--
-- -   service.action.dnsRequestAction.domain
--
-- -   service.action.networkConnectionAction.blocked
--
-- -   service.action.networkConnectionAction.connectionDirection
--
-- -   service.action.networkConnectionAction.localPortDetails.port
--
-- -   service.action.networkConnectionAction.protocol
--
-- -   service.action.networkConnectionAction.localIpDetails.ipAddressV4
--
-- -   service.action.networkConnectionAction.remoteIpDetails.city.cityName
--
-- -   service.action.networkConnectionAction.remoteIpDetails.country.countryName
--
-- -   service.action.networkConnectionAction.remoteIpDetails.ipAddressV4
--
-- -   service.action.networkConnectionAction.remoteIpDetails.organization.asn
--
-- -   service.action.networkConnectionAction.remoteIpDetails.organization.asnOrg
--
-- -   service.action.networkConnectionAction.remotePortDetails.port
--
-- -   service.additionalInfo.threatListName
--
-- -   resource.s3BucketDetails.publicAccess.effectivePermissions
--
-- -   resource.s3BucketDetails.name
--
-- -   resource.s3BucketDetails.tags.key
--
-- -   resource.s3BucketDetails.tags.value
--
-- -   resource.s3BucketDetails.type
--
-- -   service.archived
--
--     When this attribute is set to TRUE, only archived findings are
--     listed. When it\'s set to FALSE, only unarchived findings are
--     listed. When this attribute is not set, all existing findings are
--     listed.
--
-- -   service.resourceRole
--
-- -   severity
--
-- -   type
--
-- -   updatedAt
--
--     Type: ISO 8601 string format: YYYY-MM-DDTHH:MM:SS.SSSZ or
--     YYYY-MM-DDTHH:MM:SSZ depending on whether the value contains
--     milliseconds.
createFilter_findingCriteria :: Lens.Lens' CreateFilter FindingCriteria
createFilter_findingCriteria :: Lens' CreateFilter FindingCriteria
createFilter_findingCriteria = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {FindingCriteria
findingCriteria :: FindingCriteria
$sel:findingCriteria:CreateFilter' :: CreateFilter -> FindingCriteria
findingCriteria} -> FindingCriteria
findingCriteria) (\s :: CreateFilter
s@CreateFilter' {} FindingCriteria
a -> CreateFilter
s {$sel:findingCriteria:CreateFilter' :: FindingCriteria
findingCriteria = FindingCriteria
a} :: CreateFilter)

instance Core.AWSRequest CreateFilter where
  type AWSResponse CreateFilter = CreateFilterResponse
  request :: (Service -> Service) -> CreateFilter -> Request CreateFilter
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 CreateFilter
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateFilter)))
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 -> Text -> CreateFilterResponse
CreateFilterResponse'
            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
"name")
      )

instance Prelude.Hashable CreateFilter where
  hashWithSalt :: Int -> CreateFilter -> Int
hashWithSalt Int
_salt CreateFilter' {Maybe Natural
Maybe Text
Maybe (HashMap Text Text)
Maybe FilterAction
Text
FindingCriteria
findingCriteria :: FindingCriteria
name :: Text
detectorId :: Text
tags :: Maybe (HashMap Text Text)
rank :: Maybe Natural
description :: Maybe Text
clientToken :: Maybe Text
action :: Maybe FilterAction
$sel:findingCriteria:CreateFilter' :: CreateFilter -> FindingCriteria
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:detectorId:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe (HashMap Text Text)
$sel:rank:CreateFilter' :: CreateFilter -> Maybe Natural
$sel:description:CreateFilter' :: CreateFilter -> Maybe Text
$sel:clientToken:CreateFilter' :: CreateFilter -> Maybe Text
$sel:action:CreateFilter' :: CreateFilter -> Maybe FilterAction
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe FilterAction
action
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
clientToken
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Natural
rank
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (HashMap Text Text)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
detectorId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` FindingCriteria
findingCriteria

instance Prelude.NFData CreateFilter where
  rnf :: CreateFilter -> ()
rnf CreateFilter' {Maybe Natural
Maybe Text
Maybe (HashMap Text Text)
Maybe FilterAction
Text
FindingCriteria
findingCriteria :: FindingCriteria
name :: Text
detectorId :: Text
tags :: Maybe (HashMap Text Text)
rank :: Maybe Natural
description :: Maybe Text
clientToken :: Maybe Text
action :: Maybe FilterAction
$sel:findingCriteria:CreateFilter' :: CreateFilter -> FindingCriteria
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:detectorId:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe (HashMap Text Text)
$sel:rank:CreateFilter' :: CreateFilter -> Maybe Natural
$sel:description:CreateFilter' :: CreateFilter -> Maybe Text
$sel:clientToken:CreateFilter' :: CreateFilter -> Maybe Text
$sel:action:CreateFilter' :: CreateFilter -> Maybe FilterAction
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe FilterAction
action
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
clientToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Natural
rank
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (HashMap Text Text)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
detectorId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf FindingCriteria
findingCriteria

instance Data.ToHeaders CreateFilter where
  toHeaders :: CreateFilter -> 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 CreateFilter where
  toJSON :: CreateFilter -> Value
toJSON CreateFilter' {Maybe Natural
Maybe Text
Maybe (HashMap Text Text)
Maybe FilterAction
Text
FindingCriteria
findingCriteria :: FindingCriteria
name :: Text
detectorId :: Text
tags :: Maybe (HashMap Text Text)
rank :: Maybe Natural
description :: Maybe Text
clientToken :: Maybe Text
action :: Maybe FilterAction
$sel:findingCriteria:CreateFilter' :: CreateFilter -> FindingCriteria
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:detectorId:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe (HashMap Text Text)
$sel:rank:CreateFilter' :: CreateFilter -> Maybe Natural
$sel:description:CreateFilter' :: CreateFilter -> Maybe Text
$sel:clientToken:CreateFilter' :: CreateFilter -> Maybe Text
$sel:action:CreateFilter' :: CreateFilter -> Maybe FilterAction
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"action" 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 FilterAction
action,
            (Key
"clientToken" 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
clientToken,
            (Key
"description" 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
description,
            (Key
"rank" 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 Natural
rank,
            (Key
"tags" 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 (HashMap Text Text)
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"name" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
name),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"findingCriteria" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= FindingCriteria
findingCriteria)
          ]
      )

instance Data.ToPath CreateFilter where
  toPath :: CreateFilter -> ByteString
toPath CreateFilter' {Maybe Natural
Maybe Text
Maybe (HashMap Text Text)
Maybe FilterAction
Text
FindingCriteria
findingCriteria :: FindingCriteria
name :: Text
detectorId :: Text
tags :: Maybe (HashMap Text Text)
rank :: Maybe Natural
description :: Maybe Text
clientToken :: Maybe Text
action :: Maybe FilterAction
$sel:findingCriteria:CreateFilter' :: CreateFilter -> FindingCriteria
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:detectorId:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe (HashMap Text Text)
$sel:rank:CreateFilter' :: CreateFilter -> Maybe Natural
$sel:description:CreateFilter' :: CreateFilter -> Maybe Text
$sel:clientToken:CreateFilter' :: CreateFilter -> Maybe Text
$sel:action:CreateFilter' :: CreateFilter -> Maybe FilterAction
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/detector/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
detectorId, ByteString
"/filter"]

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

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

-- |
-- Create a value of 'CreateFilterResponse' 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', 'createFilterResponse_httpStatus' - The response's http status code.
--
-- 'name', 'createFilterResponse_name' - The name of the successfully created filter.
newCreateFilterResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'name'
  Prelude.Text ->
  CreateFilterResponse
newCreateFilterResponse :: Int -> Text -> CreateFilterResponse
newCreateFilterResponse Int
pHttpStatus_ Text
pName_ =
  CreateFilterResponse'
    { $sel:httpStatus:CreateFilterResponse' :: Int
httpStatus = Int
pHttpStatus_,
      $sel:name:CreateFilterResponse' :: Text
name = Text
pName_
    }

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

-- | The name of the successfully created filter.
createFilterResponse_name :: Lens.Lens' CreateFilterResponse Prelude.Text
createFilterResponse_name :: Lens' CreateFilterResponse Text
createFilterResponse_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilterResponse' {Text
name :: Text
$sel:name:CreateFilterResponse' :: CreateFilterResponse -> Text
name} -> Text
name) (\s :: CreateFilterResponse
s@CreateFilterResponse' {} Text
a -> CreateFilterResponse
s {$sel:name:CreateFilterResponse' :: Text
name = Text
a} :: CreateFilterResponse)

instance Prelude.NFData CreateFilterResponse where
  rnf :: CreateFilterResponse -> ()
rnf CreateFilterResponse' {Int
Text
name :: Text
httpStatus :: Int
$sel:name:CreateFilterResponse' :: CreateFilterResponse -> Text
$sel:httpStatus:CreateFilterResponse' :: CreateFilterResponse -> 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 Text
name