{-# 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.Rekognition.UpdateDatasetEntries
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Adds or updates one or more entries (images) in a dataset. An entry is a
-- JSON Line which contains the information for a single image, including
-- the image location, assigned labels, and object location bounding boxes.
-- For more information, see Image-Level labels in manifest files and
-- Object localization in manifest files in the /Amazon Rekognition Custom
-- Labels Developer Guide/.
--
-- If the @source-ref@ field in the JSON line references an existing image,
-- the existing image in the dataset is updated. If @source-ref@ field
-- doesn\'t reference an existing image, the image is added as a new image
-- to the dataset.
--
-- You specify the changes that you want to make in the @Changes@ input
-- parameter. There isn\'t a limit to the number JSON Lines that you can
-- change, but the size of @Changes@ must be less than 5MB.
--
-- @UpdateDatasetEntries@ returns immediatly, but the dataset update might
-- take a while to complete. Use DescribeDataset to check the current
-- status. The dataset updated successfully if the value of @Status@ is
-- @UPDATE_COMPLETE@.
--
-- To check if any non-terminal errors occured, call ListDatasetEntries and
-- check for the presence of @errors@ lists in the JSON Lines.
--
-- Dataset update fails if a terminal error occurs (@Status@ =
-- @UPDATE_FAILED@). Currently, you can\'t access the terminal error
-- information from the Amazon Rekognition Custom Labels SDK.
--
-- This operation requires permissions to perform the
-- @rekognition:UpdateDatasetEntries@ action.
module Amazonka.Rekognition.UpdateDatasetEntries
  ( -- * Creating a Request
    UpdateDatasetEntries (..),
    newUpdateDatasetEntries,

    -- * Request Lenses
    updateDatasetEntries_datasetArn,
    updateDatasetEntries_changes,

    -- * Destructuring the Response
    UpdateDatasetEntriesResponse (..),
    newUpdateDatasetEntriesResponse,

    -- * Response Lenses
    updateDatasetEntriesResponse_httpStatus,
  )
where

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

-- | /See:/ 'newUpdateDatasetEntries' smart constructor.
data UpdateDatasetEntries = UpdateDatasetEntries'
  { -- | The Amazon Resource Name (ARN) of the dataset that you want to update.
    UpdateDatasetEntries -> Text
datasetArn :: Prelude.Text,
    -- | The changes that you want to make to the dataset.
    UpdateDatasetEntries -> DatasetChanges
changes :: DatasetChanges
  }
  deriving (UpdateDatasetEntries -> UpdateDatasetEntries -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateDatasetEntries -> UpdateDatasetEntries -> Bool
$c/= :: UpdateDatasetEntries -> UpdateDatasetEntries -> Bool
== :: UpdateDatasetEntries -> UpdateDatasetEntries -> Bool
$c== :: UpdateDatasetEntries -> UpdateDatasetEntries -> Bool
Prelude.Eq, ReadPrec [UpdateDatasetEntries]
ReadPrec UpdateDatasetEntries
Int -> ReadS UpdateDatasetEntries
ReadS [UpdateDatasetEntries]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateDatasetEntries]
$creadListPrec :: ReadPrec [UpdateDatasetEntries]
readPrec :: ReadPrec UpdateDatasetEntries
$creadPrec :: ReadPrec UpdateDatasetEntries
readList :: ReadS [UpdateDatasetEntries]
$creadList :: ReadS [UpdateDatasetEntries]
readsPrec :: Int -> ReadS UpdateDatasetEntries
$creadsPrec :: Int -> ReadS UpdateDatasetEntries
Prelude.Read, Int -> UpdateDatasetEntries -> ShowS
[UpdateDatasetEntries] -> ShowS
UpdateDatasetEntries -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateDatasetEntries] -> ShowS
$cshowList :: [UpdateDatasetEntries] -> ShowS
show :: UpdateDatasetEntries -> String
$cshow :: UpdateDatasetEntries -> String
showsPrec :: Int -> UpdateDatasetEntries -> ShowS
$cshowsPrec :: Int -> UpdateDatasetEntries -> ShowS
Prelude.Show, forall x. Rep UpdateDatasetEntries x -> UpdateDatasetEntries
forall x. UpdateDatasetEntries -> Rep UpdateDatasetEntries x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UpdateDatasetEntries x -> UpdateDatasetEntries
$cfrom :: forall x. UpdateDatasetEntries -> Rep UpdateDatasetEntries x
Prelude.Generic)

-- |
-- Create a value of 'UpdateDatasetEntries' 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:
--
-- 'datasetArn', 'updateDatasetEntries_datasetArn' - The Amazon Resource Name (ARN) of the dataset that you want to update.
--
-- 'changes', 'updateDatasetEntries_changes' - The changes that you want to make to the dataset.
newUpdateDatasetEntries ::
  -- | 'datasetArn'
  Prelude.Text ->
  -- | 'changes'
  DatasetChanges ->
  UpdateDatasetEntries
newUpdateDatasetEntries :: Text -> DatasetChanges -> UpdateDatasetEntries
newUpdateDatasetEntries Text
pDatasetArn_ DatasetChanges
pChanges_ =
  UpdateDatasetEntries'
    { $sel:datasetArn:UpdateDatasetEntries' :: Text
datasetArn = Text
pDatasetArn_,
      $sel:changes:UpdateDatasetEntries' :: DatasetChanges
changes = DatasetChanges
pChanges_
    }

-- | The Amazon Resource Name (ARN) of the dataset that you want to update.
updateDatasetEntries_datasetArn :: Lens.Lens' UpdateDatasetEntries Prelude.Text
updateDatasetEntries_datasetArn :: Lens' UpdateDatasetEntries Text
updateDatasetEntries_datasetArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateDatasetEntries' {Text
datasetArn :: Text
$sel:datasetArn:UpdateDatasetEntries' :: UpdateDatasetEntries -> Text
datasetArn} -> Text
datasetArn) (\s :: UpdateDatasetEntries
s@UpdateDatasetEntries' {} Text
a -> UpdateDatasetEntries
s {$sel:datasetArn:UpdateDatasetEntries' :: Text
datasetArn = Text
a} :: UpdateDatasetEntries)

-- | The changes that you want to make to the dataset.
updateDatasetEntries_changes :: Lens.Lens' UpdateDatasetEntries DatasetChanges
updateDatasetEntries_changes :: Lens' UpdateDatasetEntries DatasetChanges
updateDatasetEntries_changes = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateDatasetEntries' {DatasetChanges
changes :: DatasetChanges
$sel:changes:UpdateDatasetEntries' :: UpdateDatasetEntries -> DatasetChanges
changes} -> DatasetChanges
changes) (\s :: UpdateDatasetEntries
s@UpdateDatasetEntries' {} DatasetChanges
a -> UpdateDatasetEntries
s {$sel:changes:UpdateDatasetEntries' :: DatasetChanges
changes = DatasetChanges
a} :: UpdateDatasetEntries)

instance Core.AWSRequest UpdateDatasetEntries where
  type
    AWSResponse UpdateDatasetEntries =
      UpdateDatasetEntriesResponse
  request :: (Service -> Service)
-> UpdateDatasetEntries -> Request UpdateDatasetEntries
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 UpdateDatasetEntries
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse UpdateDatasetEntries)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Int -> UpdateDatasetEntriesResponse
UpdateDatasetEntriesResponse'
            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))
      )

instance Prelude.Hashable UpdateDatasetEntries where
  hashWithSalt :: Int -> UpdateDatasetEntries -> Int
hashWithSalt Int
_salt UpdateDatasetEntries' {Text
DatasetChanges
changes :: DatasetChanges
datasetArn :: Text
$sel:changes:UpdateDatasetEntries' :: UpdateDatasetEntries -> DatasetChanges
$sel:datasetArn:UpdateDatasetEntries' :: UpdateDatasetEntries -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
datasetArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` DatasetChanges
changes

instance Prelude.NFData UpdateDatasetEntries where
  rnf :: UpdateDatasetEntries -> ()
rnf UpdateDatasetEntries' {Text
DatasetChanges
changes :: DatasetChanges
datasetArn :: Text
$sel:changes:UpdateDatasetEntries' :: UpdateDatasetEntries -> DatasetChanges
$sel:datasetArn:UpdateDatasetEntries' :: UpdateDatasetEntries -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
datasetArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf DatasetChanges
changes

instance Data.ToHeaders UpdateDatasetEntries where
  toHeaders :: UpdateDatasetEntries -> 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
"RekognitionService.UpdateDatasetEntries" ::
                          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 UpdateDatasetEntries where
  toJSON :: UpdateDatasetEntries -> Value
toJSON UpdateDatasetEntries' {Text
DatasetChanges
changes :: DatasetChanges
datasetArn :: Text
$sel:changes:UpdateDatasetEntries' :: UpdateDatasetEntries -> DatasetChanges
$sel:datasetArn:UpdateDatasetEntries' :: UpdateDatasetEntries -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"DatasetArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
datasetArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"Changes" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= DatasetChanges
changes)
          ]
      )

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

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

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

-- |
-- Create a value of 'UpdateDatasetEntriesResponse' 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', 'updateDatasetEntriesResponse_httpStatus' - The response's http status code.
newUpdateDatasetEntriesResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  UpdateDatasetEntriesResponse
newUpdateDatasetEntriesResponse :: Int -> UpdateDatasetEntriesResponse
newUpdateDatasetEntriesResponse Int
pHttpStatus_ =
  UpdateDatasetEntriesResponse'
    { $sel:httpStatus:UpdateDatasetEntriesResponse' :: Int
httpStatus =
        Int
pHttpStatus_
    }

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

instance Prelude.NFData UpdateDatasetEntriesResponse where
  rnf :: UpdateDatasetEntriesResponse -> ()
rnf UpdateDatasetEntriesResponse' {Int
httpStatus :: Int
$sel:httpStatus:UpdateDatasetEntriesResponse' :: UpdateDatasetEntriesResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus