{-# 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.Rum.PutRumEvents
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Sends telemetry events about your application performance and user
-- behavior to CloudWatch RUM. The code snippet that RUM generates for you
-- to add to your application includes @PutRumEvents@ operations to send
-- this data to RUM.
--
-- Each @PutRumEvents@ operation can send a batch of events from one user
-- session.
module Amazonka.Rum.PutRumEvents
  ( -- * Creating a Request
    PutRumEvents (..),
    newPutRumEvents,

    -- * Request Lenses
    putRumEvents_appMonitorDetails,
    putRumEvents_batchId,
    putRumEvents_id,
    putRumEvents_rumEvents,
    putRumEvents_userDetails,

    -- * Destructuring the Response
    PutRumEventsResponse (..),
    newPutRumEventsResponse,

    -- * Response Lenses
    putRumEventsResponse_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 qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.Rum.Types

-- | /See:/ 'newPutRumEvents' smart constructor.
data PutRumEvents = PutRumEvents'
  { -- | A structure that contains information about the app monitor that
    -- collected this telemetry information.
    PutRumEvents -> AppMonitorDetails
appMonitorDetails :: AppMonitorDetails,
    -- | A unique identifier for this batch of RUM event data.
    PutRumEvents -> Text
batchId :: Prelude.Text,
    -- | The ID of the app monitor that is sending this data.
    PutRumEvents -> Text
id :: Prelude.Text,
    -- | An array of structures that contain the telemetry event data.
    PutRumEvents -> [RumEvent]
rumEvents :: [RumEvent],
    -- | A structure that contains information about the user session that this
    -- batch of events was collected from.
    PutRumEvents -> UserDetails
userDetails :: UserDetails
  }
  deriving (PutRumEvents -> PutRumEvents -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PutRumEvents -> PutRumEvents -> Bool
$c/= :: PutRumEvents -> PutRumEvents -> Bool
== :: PutRumEvents -> PutRumEvents -> Bool
$c== :: PutRumEvents -> PutRumEvents -> Bool
Prelude.Eq, ReadPrec [PutRumEvents]
ReadPrec PutRumEvents
Int -> ReadS PutRumEvents
ReadS [PutRumEvents]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PutRumEvents]
$creadListPrec :: ReadPrec [PutRumEvents]
readPrec :: ReadPrec PutRumEvents
$creadPrec :: ReadPrec PutRumEvents
readList :: ReadS [PutRumEvents]
$creadList :: ReadS [PutRumEvents]
readsPrec :: Int -> ReadS PutRumEvents
$creadsPrec :: Int -> ReadS PutRumEvents
Prelude.Read, Int -> PutRumEvents -> ShowS
[PutRumEvents] -> ShowS
PutRumEvents -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutRumEvents] -> ShowS
$cshowList :: [PutRumEvents] -> ShowS
show :: PutRumEvents -> String
$cshow :: PutRumEvents -> String
showsPrec :: Int -> PutRumEvents -> ShowS
$cshowsPrec :: Int -> PutRumEvents -> ShowS
Prelude.Show, forall x. Rep PutRumEvents x -> PutRumEvents
forall x. PutRumEvents -> Rep PutRumEvents x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PutRumEvents x -> PutRumEvents
$cfrom :: forall x. PutRumEvents -> Rep PutRumEvents x
Prelude.Generic)

-- |
-- Create a value of 'PutRumEvents' 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:
--
-- 'appMonitorDetails', 'putRumEvents_appMonitorDetails' - A structure that contains information about the app monitor that
-- collected this telemetry information.
--
-- 'batchId', 'putRumEvents_batchId' - A unique identifier for this batch of RUM event data.
--
-- 'id', 'putRumEvents_id' - The ID of the app monitor that is sending this data.
--
-- 'rumEvents', 'putRumEvents_rumEvents' - An array of structures that contain the telemetry event data.
--
-- 'userDetails', 'putRumEvents_userDetails' - A structure that contains information about the user session that this
-- batch of events was collected from.
newPutRumEvents ::
  -- | 'appMonitorDetails'
  AppMonitorDetails ->
  -- | 'batchId'
  Prelude.Text ->
  -- | 'id'
  Prelude.Text ->
  -- | 'userDetails'
  UserDetails ->
  PutRumEvents
newPutRumEvents :: AppMonitorDetails -> Text -> Text -> UserDetails -> PutRumEvents
newPutRumEvents
  AppMonitorDetails
pAppMonitorDetails_
  Text
pBatchId_
  Text
pId_
  UserDetails
pUserDetails_ =
    PutRumEvents'
      { $sel:appMonitorDetails:PutRumEvents' :: AppMonitorDetails
appMonitorDetails =
          AppMonitorDetails
pAppMonitorDetails_,
        $sel:batchId:PutRumEvents' :: Text
batchId = Text
pBatchId_,
        $sel:id:PutRumEvents' :: Text
id = Text
pId_,
        $sel:rumEvents:PutRumEvents' :: [RumEvent]
rumEvents = forall a. Monoid a => a
Prelude.mempty,
        $sel:userDetails:PutRumEvents' :: UserDetails
userDetails = UserDetails
pUserDetails_
      }

-- | A structure that contains information about the app monitor that
-- collected this telemetry information.
putRumEvents_appMonitorDetails :: Lens.Lens' PutRumEvents AppMonitorDetails
putRumEvents_appMonitorDetails :: Lens' PutRumEvents AppMonitorDetails
putRumEvents_appMonitorDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRumEvents' {AppMonitorDetails
appMonitorDetails :: AppMonitorDetails
$sel:appMonitorDetails:PutRumEvents' :: PutRumEvents -> AppMonitorDetails
appMonitorDetails} -> AppMonitorDetails
appMonitorDetails) (\s :: PutRumEvents
s@PutRumEvents' {} AppMonitorDetails
a -> PutRumEvents
s {$sel:appMonitorDetails:PutRumEvents' :: AppMonitorDetails
appMonitorDetails = AppMonitorDetails
a} :: PutRumEvents)

-- | A unique identifier for this batch of RUM event data.
putRumEvents_batchId :: Lens.Lens' PutRumEvents Prelude.Text
putRumEvents_batchId :: Lens' PutRumEvents Text
putRumEvents_batchId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRumEvents' {Text
batchId :: Text
$sel:batchId:PutRumEvents' :: PutRumEvents -> Text
batchId} -> Text
batchId) (\s :: PutRumEvents
s@PutRumEvents' {} Text
a -> PutRumEvents
s {$sel:batchId:PutRumEvents' :: Text
batchId = Text
a} :: PutRumEvents)

-- | The ID of the app monitor that is sending this data.
putRumEvents_id :: Lens.Lens' PutRumEvents Prelude.Text
putRumEvents_id :: Lens' PutRumEvents Text
putRumEvents_id = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRumEvents' {Text
id :: Text
$sel:id:PutRumEvents' :: PutRumEvents -> Text
id} -> Text
id) (\s :: PutRumEvents
s@PutRumEvents' {} Text
a -> PutRumEvents
s {$sel:id:PutRumEvents' :: Text
id = Text
a} :: PutRumEvents)

-- | An array of structures that contain the telemetry event data.
putRumEvents_rumEvents :: Lens.Lens' PutRumEvents [RumEvent]
putRumEvents_rumEvents :: Lens' PutRumEvents [RumEvent]
putRumEvents_rumEvents = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRumEvents' {[RumEvent]
rumEvents :: [RumEvent]
$sel:rumEvents:PutRumEvents' :: PutRumEvents -> [RumEvent]
rumEvents} -> [RumEvent]
rumEvents) (\s :: PutRumEvents
s@PutRumEvents' {} [RumEvent]
a -> PutRumEvents
s {$sel:rumEvents:PutRumEvents' :: [RumEvent]
rumEvents = [RumEvent]
a} :: PutRumEvents) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A structure that contains information about the user session that this
-- batch of events was collected from.
putRumEvents_userDetails :: Lens.Lens' PutRumEvents UserDetails
putRumEvents_userDetails :: Lens' PutRumEvents UserDetails
putRumEvents_userDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRumEvents' {UserDetails
userDetails :: UserDetails
$sel:userDetails:PutRumEvents' :: PutRumEvents -> UserDetails
userDetails} -> UserDetails
userDetails) (\s :: PutRumEvents
s@PutRumEvents' {} UserDetails
a -> PutRumEvents
s {$sel:userDetails:PutRumEvents' :: UserDetails
userDetails = UserDetails
a} :: PutRumEvents)

instance Core.AWSRequest PutRumEvents where
  type AWSResponse PutRumEvents = PutRumEventsResponse
  request :: (Service -> Service) -> PutRumEvents -> Request PutRumEvents
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 PutRumEvents
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse PutRumEvents)))
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 -> PutRumEventsResponse
PutRumEventsResponse'
            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 PutRumEvents where
  hashWithSalt :: Int -> PutRumEvents -> Int
hashWithSalt Int
_salt PutRumEvents' {[RumEvent]
Text
AppMonitorDetails
UserDetails
userDetails :: UserDetails
rumEvents :: [RumEvent]
id :: Text
batchId :: Text
appMonitorDetails :: AppMonitorDetails
$sel:userDetails:PutRumEvents' :: PutRumEvents -> UserDetails
$sel:rumEvents:PutRumEvents' :: PutRumEvents -> [RumEvent]
$sel:id:PutRumEvents' :: PutRumEvents -> Text
$sel:batchId:PutRumEvents' :: PutRumEvents -> Text
$sel:appMonitorDetails:PutRumEvents' :: PutRumEvents -> AppMonitorDetails
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` AppMonitorDetails
appMonitorDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
batchId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
id
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` [RumEvent]
rumEvents
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` UserDetails
userDetails

instance Prelude.NFData PutRumEvents where
  rnf :: PutRumEvents -> ()
rnf PutRumEvents' {[RumEvent]
Text
AppMonitorDetails
UserDetails
userDetails :: UserDetails
rumEvents :: [RumEvent]
id :: Text
batchId :: Text
appMonitorDetails :: AppMonitorDetails
$sel:userDetails:PutRumEvents' :: PutRumEvents -> UserDetails
$sel:rumEvents:PutRumEvents' :: PutRumEvents -> [RumEvent]
$sel:id:PutRumEvents' :: PutRumEvents -> Text
$sel:batchId:PutRumEvents' :: PutRumEvents -> Text
$sel:appMonitorDetails:PutRumEvents' :: PutRumEvents -> AppMonitorDetails
..} =
    forall a. NFData a => a -> ()
Prelude.rnf AppMonitorDetails
appMonitorDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
batchId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
id
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [RumEvent]
rumEvents
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf UserDetails
userDetails

instance Data.ToHeaders PutRumEvents where
  toHeaders :: PutRumEvents -> 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 PutRumEvents where
  toJSON :: PutRumEvents -> Value
toJSON PutRumEvents' {[RumEvent]
Text
AppMonitorDetails
UserDetails
userDetails :: UserDetails
rumEvents :: [RumEvent]
id :: Text
batchId :: Text
appMonitorDetails :: AppMonitorDetails
$sel:userDetails:PutRumEvents' :: PutRumEvents -> UserDetails
$sel:rumEvents:PutRumEvents' :: PutRumEvents -> [RumEvent]
$sel:id:PutRumEvents' :: PutRumEvents -> Text
$sel:batchId:PutRumEvents' :: PutRumEvents -> Text
$sel:appMonitorDetails:PutRumEvents' :: PutRumEvents -> AppMonitorDetails
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just
              (Key
"AppMonitorDetails" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= AppMonitorDetails
appMonitorDetails),
            forall a. a -> Maybe a
Prelude.Just (Key
"BatchId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
batchId),
            forall a. a -> Maybe a
Prelude.Just (Key
"RumEvents" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= [RumEvent]
rumEvents),
            forall a. a -> Maybe a
Prelude.Just (Key
"UserDetails" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= UserDetails
userDetails)
          ]
      )

instance Data.ToPath PutRumEvents where
  toPath :: PutRumEvents -> ByteString
toPath PutRumEvents' {[RumEvent]
Text
AppMonitorDetails
UserDetails
userDetails :: UserDetails
rumEvents :: [RumEvent]
id :: Text
batchId :: Text
appMonitorDetails :: AppMonitorDetails
$sel:userDetails:PutRumEvents' :: PutRumEvents -> UserDetails
$sel:rumEvents:PutRumEvents' :: PutRumEvents -> [RumEvent]
$sel:id:PutRumEvents' :: PutRumEvents -> Text
$sel:batchId:PutRumEvents' :: PutRumEvents -> Text
$sel:appMonitorDetails:PutRumEvents' :: PutRumEvents -> AppMonitorDetails
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/appmonitors/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
id, ByteString
"/"]

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

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

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

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

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