{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.DynamoDBStreams.Types.Record
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.DynamoDBStreams.Types.Record where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.DynamoDBStreams.Internal
import Amazonka.DynamoDBStreams.Types.Identity
import Amazonka.DynamoDBStreams.Types.OperationType
import Amazonka.DynamoDBStreams.Types.StreamRecord
import qualified Amazonka.Prelude as Prelude

-- | A description of a unique event within a stream.
--
-- /See:/ 'newRecord' smart constructor.
data Record = Record'
  { -- | The region in which the @GetRecords@ request was received.
    Record -> Maybe Text
awsRegion :: Prelude.Maybe Prelude.Text,
    -- | The main body of the stream record, containing all of the
    -- DynamoDB-specific fields.
    Record -> Maybe StreamRecord
dynamodb :: Prelude.Maybe StreamRecord,
    -- | A globally unique identifier for the event that was recorded in this
    -- stream record.
    Record -> Maybe Text
eventID :: Prelude.Maybe Prelude.Text,
    -- | The type of data modification that was performed on the DynamoDB table:
    --
    -- -   @INSERT@ - a new item was added to the table.
    --
    -- -   @MODIFY@ - one or more of an existing item\'s attributes were
    --     modified.
    --
    -- -   @REMOVE@ - the item was deleted from the table
    Record -> Maybe OperationType
eventName :: Prelude.Maybe OperationType,
    -- | The AWS service from which the stream record originated. For DynamoDB
    -- Streams, this is @aws:dynamodb@.
    Record -> Maybe Text
eventSource :: Prelude.Maybe Prelude.Text,
    -- | The version number of the stream record format. This number is updated
    -- whenever the structure of @Record@ is modified.
    --
    -- Client applications must not assume that @eventVersion@ will remain at a
    -- particular value, as this number is subject to change at any time. In
    -- general, @eventVersion@ will only increase as the low-level DynamoDB
    -- Streams API evolves.
    Record -> Maybe Text
eventVersion :: Prelude.Maybe Prelude.Text,
    -- | Items that are deleted by the Time to Live process after expiration have
    -- the following fields:
    --
    -- -   Records[].userIdentity.type
    --
    --     \"Service\"
    --
    -- -   Records[].userIdentity.principalId
    --
    --     \"dynamodb.amazonaws.com\"
    Record -> Maybe Identity
userIdentity :: Prelude.Maybe Identity
  }
  deriving (Record -> Record -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Record -> Record -> Bool
$c/= :: Record -> Record -> Bool
== :: Record -> Record -> Bool
$c== :: Record -> Record -> Bool
Prelude.Eq, ReadPrec [Record]
ReadPrec Record
Int -> ReadS Record
ReadS [Record]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Record]
$creadListPrec :: ReadPrec [Record]
readPrec :: ReadPrec Record
$creadPrec :: ReadPrec Record
readList :: ReadS [Record]
$creadList :: ReadS [Record]
readsPrec :: Int -> ReadS Record
$creadsPrec :: Int -> ReadS Record
Prelude.Read, Int -> Record -> ShowS
[Record] -> ShowS
Record -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Record] -> ShowS
$cshowList :: [Record] -> ShowS
show :: Record -> String
$cshow :: Record -> String
showsPrec :: Int -> Record -> ShowS
$cshowsPrec :: Int -> Record -> ShowS
Prelude.Show, forall x. Rep Record x -> Record
forall x. Record -> Rep Record x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Record x -> Record
$cfrom :: forall x. Record -> Rep Record x
Prelude.Generic)

-- |
-- Create a value of 'Record' 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:
--
-- 'awsRegion', 'record_awsRegion' - The region in which the @GetRecords@ request was received.
--
-- 'dynamodb', 'record_dynamodb' - The main body of the stream record, containing all of the
-- DynamoDB-specific fields.
--
-- 'eventID', 'record_eventID' - A globally unique identifier for the event that was recorded in this
-- stream record.
--
-- 'eventName', 'record_eventName' - The type of data modification that was performed on the DynamoDB table:
--
-- -   @INSERT@ - a new item was added to the table.
--
-- -   @MODIFY@ - one or more of an existing item\'s attributes were
--     modified.
--
-- -   @REMOVE@ - the item was deleted from the table
--
-- 'eventSource', 'record_eventSource' - The AWS service from which the stream record originated. For DynamoDB
-- Streams, this is @aws:dynamodb@.
--
-- 'eventVersion', 'record_eventVersion' - The version number of the stream record format. This number is updated
-- whenever the structure of @Record@ is modified.
--
-- Client applications must not assume that @eventVersion@ will remain at a
-- particular value, as this number is subject to change at any time. In
-- general, @eventVersion@ will only increase as the low-level DynamoDB
-- Streams API evolves.
--
-- 'userIdentity', 'record_userIdentity' - Items that are deleted by the Time to Live process after expiration have
-- the following fields:
--
-- -   Records[].userIdentity.type
--
--     \"Service\"
--
-- -   Records[].userIdentity.principalId
--
--     \"dynamodb.amazonaws.com\"
newRecord ::
  Record
newRecord :: Record
newRecord =
  Record'
    { $sel:awsRegion:Record' :: Maybe Text
awsRegion = forall a. Maybe a
Prelude.Nothing,
      $sel:dynamodb:Record' :: Maybe StreamRecord
dynamodb = forall a. Maybe a
Prelude.Nothing,
      $sel:eventID:Record' :: Maybe Text
eventID = forall a. Maybe a
Prelude.Nothing,
      $sel:eventName:Record' :: Maybe OperationType
eventName = forall a. Maybe a
Prelude.Nothing,
      $sel:eventSource:Record' :: Maybe Text
eventSource = forall a. Maybe a
Prelude.Nothing,
      $sel:eventVersion:Record' :: Maybe Text
eventVersion = forall a. Maybe a
Prelude.Nothing,
      $sel:userIdentity:Record' :: Maybe Identity
userIdentity = forall a. Maybe a
Prelude.Nothing
    }

-- | The region in which the @GetRecords@ request was received.
record_awsRegion :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
record_awsRegion :: Lens' Record (Maybe Text)
record_awsRegion = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe Text
awsRegion :: Maybe Text
$sel:awsRegion:Record' :: Record -> Maybe Text
awsRegion} -> Maybe Text
awsRegion) (\s :: Record
s@Record' {} Maybe Text
a -> Record
s {$sel:awsRegion:Record' :: Maybe Text
awsRegion = Maybe Text
a} :: Record)

-- | The main body of the stream record, containing all of the
-- DynamoDB-specific fields.
record_dynamodb :: Lens.Lens' Record (Prelude.Maybe StreamRecord)
record_dynamodb :: Lens' Record (Maybe StreamRecord)
record_dynamodb = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe StreamRecord
dynamodb :: Maybe StreamRecord
$sel:dynamodb:Record' :: Record -> Maybe StreamRecord
dynamodb} -> Maybe StreamRecord
dynamodb) (\s :: Record
s@Record' {} Maybe StreamRecord
a -> Record
s {$sel:dynamodb:Record' :: Maybe StreamRecord
dynamodb = Maybe StreamRecord
a} :: Record)

-- | A globally unique identifier for the event that was recorded in this
-- stream record.
record_eventID :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
record_eventID :: Lens' Record (Maybe Text)
record_eventID = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe Text
eventID :: Maybe Text
$sel:eventID:Record' :: Record -> Maybe Text
eventID} -> Maybe Text
eventID) (\s :: Record
s@Record' {} Maybe Text
a -> Record
s {$sel:eventID:Record' :: Maybe Text
eventID = Maybe Text
a} :: Record)

-- | The type of data modification that was performed on the DynamoDB table:
--
-- -   @INSERT@ - a new item was added to the table.
--
-- -   @MODIFY@ - one or more of an existing item\'s attributes were
--     modified.
--
-- -   @REMOVE@ - the item was deleted from the table
record_eventName :: Lens.Lens' Record (Prelude.Maybe OperationType)
record_eventName :: Lens' Record (Maybe OperationType)
record_eventName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe OperationType
eventName :: Maybe OperationType
$sel:eventName:Record' :: Record -> Maybe OperationType
eventName} -> Maybe OperationType
eventName) (\s :: Record
s@Record' {} Maybe OperationType
a -> Record
s {$sel:eventName:Record' :: Maybe OperationType
eventName = Maybe OperationType
a} :: Record)

-- | The AWS service from which the stream record originated. For DynamoDB
-- Streams, this is @aws:dynamodb@.
record_eventSource :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
record_eventSource :: Lens' Record (Maybe Text)
record_eventSource = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe Text
eventSource :: Maybe Text
$sel:eventSource:Record' :: Record -> Maybe Text
eventSource} -> Maybe Text
eventSource) (\s :: Record
s@Record' {} Maybe Text
a -> Record
s {$sel:eventSource:Record' :: Maybe Text
eventSource = Maybe Text
a} :: Record)

-- | The version number of the stream record format. This number is updated
-- whenever the structure of @Record@ is modified.
--
-- Client applications must not assume that @eventVersion@ will remain at a
-- particular value, as this number is subject to change at any time. In
-- general, @eventVersion@ will only increase as the low-level DynamoDB
-- Streams API evolves.
record_eventVersion :: Lens.Lens' Record (Prelude.Maybe Prelude.Text)
record_eventVersion :: Lens' Record (Maybe Text)
record_eventVersion = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe Text
eventVersion :: Maybe Text
$sel:eventVersion:Record' :: Record -> Maybe Text
eventVersion} -> Maybe Text
eventVersion) (\s :: Record
s@Record' {} Maybe Text
a -> Record
s {$sel:eventVersion:Record' :: Maybe Text
eventVersion = Maybe Text
a} :: Record)

-- | Items that are deleted by the Time to Live process after expiration have
-- the following fields:
--
-- -   Records[].userIdentity.type
--
--     \"Service\"
--
-- -   Records[].userIdentity.principalId
--
--     \"dynamodb.amazonaws.com\"
record_userIdentity :: Lens.Lens' Record (Prelude.Maybe Identity)
record_userIdentity :: Lens' Record (Maybe Identity)
record_userIdentity = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Record' {Maybe Identity
userIdentity :: Maybe Identity
$sel:userIdentity:Record' :: Record -> Maybe Identity
userIdentity} -> Maybe Identity
userIdentity) (\s :: Record
s@Record' {} Maybe Identity
a -> Record
s {$sel:userIdentity:Record' :: Maybe Identity
userIdentity = Maybe Identity
a} :: Record)

instance Data.FromJSON Record where
  parseJSON :: Value -> Parser Record
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Record"
      ( \Object
x ->
          Maybe Text
-> Maybe StreamRecord
-> Maybe Text
-> Maybe OperationType
-> Maybe Text
-> Maybe Text
-> Maybe Identity
-> Record
Record'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"awsRegion")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"dynamodb")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"eventID")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"eventName")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"eventSource")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"eventVersion")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"userIdentity")
      )

instance Prelude.Hashable Record where
  hashWithSalt :: Int -> Record -> Int
hashWithSalt Int
_salt Record' {Maybe Text
Maybe Identity
Maybe OperationType
Maybe StreamRecord
userIdentity :: Maybe Identity
eventVersion :: Maybe Text
eventSource :: Maybe Text
eventName :: Maybe OperationType
eventID :: Maybe Text
dynamodb :: Maybe StreamRecord
awsRegion :: Maybe Text
$sel:userIdentity:Record' :: Record -> Maybe Identity
$sel:eventVersion:Record' :: Record -> Maybe Text
$sel:eventSource:Record' :: Record -> Maybe Text
$sel:eventName:Record' :: Record -> Maybe OperationType
$sel:eventID:Record' :: Record -> Maybe Text
$sel:dynamodb:Record' :: Record -> Maybe StreamRecord
$sel:awsRegion:Record' :: Record -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
awsRegion
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe StreamRecord
dynamodb
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
eventID
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe OperationType
eventName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
eventSource
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
eventVersion
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Identity
userIdentity

instance Prelude.NFData Record where
  rnf :: Record -> ()
rnf Record' {Maybe Text
Maybe Identity
Maybe OperationType
Maybe StreamRecord
userIdentity :: Maybe Identity
eventVersion :: Maybe Text
eventSource :: Maybe Text
eventName :: Maybe OperationType
eventID :: Maybe Text
dynamodb :: Maybe StreamRecord
awsRegion :: Maybe Text
$sel:userIdentity:Record' :: Record -> Maybe Identity
$sel:eventVersion:Record' :: Record -> Maybe Text
$sel:eventSource:Record' :: Record -> Maybe Text
$sel:eventName:Record' :: Record -> Maybe OperationType
$sel:eventID:Record' :: Record -> Maybe Text
$sel:dynamodb:Record' :: Record -> Maybe StreamRecord
$sel:awsRegion:Record' :: Record -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
awsRegion
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe StreamRecord
dynamodb
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eventID
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OperationType
eventName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eventSource
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eventVersion
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Identity
userIdentity