{-# 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.Personalize.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 recommendation filter. For more information, see
-- <https://docs.aws.amazon.com/personalize/latest/dg/filter.html Filtering recommendations and user segments>.
module Amazonka.Personalize.CreateFilter
  ( -- * Creating a Request
    CreateFilter (..),
    newCreateFilter,

    -- * Request Lenses
    createFilter_tags,
    createFilter_name,
    createFilter_datasetGroupArn,
    createFilter_filterExpression,

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

    -- * Response Lenses
    createFilterResponse_filterArn,
    createFilterResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.Personalize.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'
  { -- | A list of
    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
    -- to apply to the filter.
    CreateFilter -> Maybe [Tag]
tags :: Prelude.Maybe [Tag],
    -- | The name of the filter to create.
    CreateFilter -> Text
name :: Prelude.Text,
    -- | The ARN of the dataset group that the filter will belong to.
    CreateFilter -> Text
datasetGroupArn :: Prelude.Text,
    -- | The filter expression defines which items are included or excluded from
    -- recommendations. Filter expression must follow specific format rules.
    -- For information about filter expression structure and syntax, see
    -- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
    CreateFilter -> Sensitive Text
filterExpression :: Data.Sensitive Prelude.Text
  }
  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, 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:
--
-- 'tags', 'createFilter_tags' - A list of
-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
-- to apply to the filter.
--
-- 'name', 'createFilter_name' - The name of the filter to create.
--
-- 'datasetGroupArn', 'createFilter_datasetGroupArn' - The ARN of the dataset group that the filter will belong to.
--
-- 'filterExpression', 'createFilter_filterExpression' - The filter expression defines which items are included or excluded from
-- recommendations. Filter expression must follow specific format rules.
-- For information about filter expression structure and syntax, see
-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
newCreateFilter ::
  -- | 'name'
  Prelude.Text ->
  -- | 'datasetGroupArn'
  Prelude.Text ->
  -- | 'filterExpression'
  Prelude.Text ->
  CreateFilter
newCreateFilter :: Text -> Text -> Text -> CreateFilter
newCreateFilter
  Text
pName_
  Text
pDatasetGroupArn_
  Text
pFilterExpression_ =
    CreateFilter'
      { $sel:tags:CreateFilter' :: Maybe [Tag]
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:name:CreateFilter' :: Text
name = Text
pName_,
        $sel:datasetGroupArn:CreateFilter' :: Text
datasetGroupArn = Text
pDatasetGroupArn_,
        $sel:filterExpression:CreateFilter' :: Sensitive Text
filterExpression =
          forall a. Iso' (Sensitive a) a
Data._Sensitive forall t b. AReview t b -> b -> t
Lens.# Text
pFilterExpression_
      }

-- | A list of
-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
-- to apply to the filter.
createFilter_tags :: Lens.Lens' CreateFilter (Prelude.Maybe [Tag])
createFilter_tags :: Lens' CreateFilter (Maybe [Tag])
createFilter_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Maybe [Tag]
tags :: Maybe [Tag]
$sel:tags:CreateFilter' :: CreateFilter -> Maybe [Tag]
tags} -> Maybe [Tag]
tags) (\s :: CreateFilter
s@CreateFilter' {} Maybe [Tag]
a -> CreateFilter
s {$sel:tags:CreateFilter' :: Maybe [Tag]
tags = Maybe [Tag]
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 name of the filter to create.
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)

-- | The ARN of the dataset group that the filter will belong to.
createFilter_datasetGroupArn :: Lens.Lens' CreateFilter Prelude.Text
createFilter_datasetGroupArn :: Lens' CreateFilter Text
createFilter_datasetGroupArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Text
datasetGroupArn :: Text
$sel:datasetGroupArn:CreateFilter' :: CreateFilter -> Text
datasetGroupArn} -> Text
datasetGroupArn) (\s :: CreateFilter
s@CreateFilter' {} Text
a -> CreateFilter
s {$sel:datasetGroupArn:CreateFilter' :: Text
datasetGroupArn = Text
a} :: CreateFilter)

-- | The filter expression defines which items are included or excluded from
-- recommendations. Filter expression must follow specific format rules.
-- For information about filter expression structure and syntax, see
-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
createFilter_filterExpression :: Lens.Lens' CreateFilter Prelude.Text
createFilter_filterExpression :: Lens' CreateFilter Text
createFilter_filterExpression = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilter' {Sensitive Text
filterExpression :: Sensitive Text
$sel:filterExpression:CreateFilter' :: CreateFilter -> Sensitive Text
filterExpression} -> Sensitive Text
filterExpression) (\s :: CreateFilter
s@CreateFilter' {} Sensitive Text
a -> CreateFilter
s {$sel:filterExpression:CreateFilter' :: Sensitive Text
filterExpression = Sensitive Text
a} :: CreateFilter) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. Iso' (Sensitive a) a
Data._Sensitive

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 ->
          Maybe Text -> Int -> CreateFilterResponse
CreateFilterResponse'
            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
"filterArn")
            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 CreateFilter where
  hashWithSalt :: Int -> CreateFilter -> Int
hashWithSalt Int
_salt CreateFilter' {Maybe [Tag]
Text
Sensitive Text
filterExpression :: Sensitive Text
datasetGroupArn :: Text
name :: Text
tags :: Maybe [Tag]
$sel:filterExpression:CreateFilter' :: CreateFilter -> Sensitive Text
$sel:datasetGroupArn:CreateFilter' :: CreateFilter -> Text
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe [Tag]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Tag]
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
datasetGroupArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Sensitive Text
filterExpression

instance Prelude.NFData CreateFilter where
  rnf :: CreateFilter -> ()
rnf CreateFilter' {Maybe [Tag]
Text
Sensitive Text
filterExpression :: Sensitive Text
datasetGroupArn :: Text
name :: Text
tags :: Maybe [Tag]
$sel:filterExpression:CreateFilter' :: CreateFilter -> Sensitive Text
$sel:datasetGroupArn:CreateFilter' :: CreateFilter -> Text
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe [Tag]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Tag]
tags
      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 Text
datasetGroupArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Sensitive Text
filterExpression

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
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"AmazonPersonalize.CreateFilter" ::
                          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 CreateFilter where
  toJSON :: CreateFilter -> Value
toJSON CreateFilter' {Maybe [Tag]
Text
Sensitive Text
filterExpression :: Sensitive Text
datasetGroupArn :: Text
name :: Text
tags :: Maybe [Tag]
$sel:filterExpression:CreateFilter' :: CreateFilter -> Sensitive Text
$sel:datasetGroupArn:CreateFilter' :: CreateFilter -> Text
$sel:name:CreateFilter' :: CreateFilter -> Text
$sel:tags:CreateFilter' :: CreateFilter -> Maybe [Tag]
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (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 [Tag]
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
"datasetGroupArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
datasetGroupArn),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"filterExpression" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Sensitive Text
filterExpression)
          ]
      )

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

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 ARN of the new filter.
    CreateFilterResponse -> Maybe Text
filterArn :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateFilterResponse -> Int
httpStatus :: Prelude.Int
  }
  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:
--
-- 'filterArn', 'createFilterResponse_filterArn' - The ARN of the new filter.
--
-- 'httpStatus', 'createFilterResponse_httpStatus' - The response's http status code.
newCreateFilterResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateFilterResponse
newCreateFilterResponse :: Int -> CreateFilterResponse
newCreateFilterResponse Int
pHttpStatus_ =
  CreateFilterResponse'
    { $sel:filterArn:CreateFilterResponse' :: Maybe Text
filterArn = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateFilterResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The ARN of the new filter.
createFilterResponse_filterArn :: Lens.Lens' CreateFilterResponse (Prelude.Maybe Prelude.Text)
createFilterResponse_filterArn :: Lens' CreateFilterResponse (Maybe Text)
createFilterResponse_filterArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFilterResponse' {Maybe Text
filterArn :: Maybe Text
$sel:filterArn:CreateFilterResponse' :: CreateFilterResponse -> Maybe Text
filterArn} -> Maybe Text
filterArn) (\s :: CreateFilterResponse
s@CreateFilterResponse' {} Maybe Text
a -> CreateFilterResponse
s {$sel:filterArn:CreateFilterResponse' :: Maybe Text
filterArn = Maybe Text
a} :: CreateFilterResponse)

-- | 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)

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