{-# 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.SQS.DeleteMessage
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Deletes the specified message from the specified queue. To select the
-- message to delete, use the @ReceiptHandle@ of the message (/not/ the
-- @MessageId@ which you receive when you send the message). Amazon SQS can
-- delete a message from a queue even if a visibility timeout setting
-- causes the message to be locked by another consumer. Amazon SQS
-- automatically deletes messages left in a queue longer than the retention
-- period configured for the queue.
--
-- The @ReceiptHandle@ is associated with a /specific instance/ of
-- receiving a message. If you receive a message more than once, the
-- @ReceiptHandle@ is different each time you receive a message. When you
-- use the @DeleteMessage@ action, you must provide the most recently
-- received @ReceiptHandle@ for the message (otherwise, the request
-- succeeds, but the message might not be deleted).
--
-- For standard queues, it is possible to receive a message even after you
-- delete it. This might happen on rare occasions if one of the servers
-- which stores a copy of the message is unavailable when you send the
-- request to delete the message. The copy remains on the server and might
-- be returned to you during a subsequent receive request. You should
-- ensure that your application is idempotent, so that receiving a message
-- more than once does not cause issues.
module Amazonka.SQS.DeleteMessage
  ( -- * Creating a Request
    DeleteMessage (..),
    newDeleteMessage,

    -- * Request Lenses
    deleteMessage_queueUrl,
    deleteMessage_receiptHandle,

    -- * Destructuring the Response
    DeleteMessageResponse (..),
    newDeleteMessageResponse,
  )
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.SQS.Types

-- |
--
-- /See:/ 'newDeleteMessage' smart constructor.
data DeleteMessage = DeleteMessage'
  { -- | The URL of the Amazon SQS queue from which messages are deleted.
    --
    -- Queue URLs and names are case-sensitive.
    DeleteMessage -> Text
queueUrl :: Prelude.Text,
    -- | The receipt handle associated with the message to delete.
    DeleteMessage -> Text
receiptHandle :: Prelude.Text
  }
  deriving (DeleteMessage -> DeleteMessage -> Bool
(DeleteMessage -> DeleteMessage -> Bool)
-> (DeleteMessage -> DeleteMessage -> Bool) -> Eq DeleteMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeleteMessage -> DeleteMessage -> Bool
== :: DeleteMessage -> DeleteMessage -> Bool
$c/= :: DeleteMessage -> DeleteMessage -> Bool
/= :: DeleteMessage -> DeleteMessage -> Bool
Prelude.Eq, ReadPrec [DeleteMessage]
ReadPrec DeleteMessage
Int -> ReadS DeleteMessage
ReadS [DeleteMessage]
(Int -> ReadS DeleteMessage)
-> ReadS [DeleteMessage]
-> ReadPrec DeleteMessage
-> ReadPrec [DeleteMessage]
-> Read DeleteMessage
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS DeleteMessage
readsPrec :: Int -> ReadS DeleteMessage
$creadList :: ReadS [DeleteMessage]
readList :: ReadS [DeleteMessage]
$creadPrec :: ReadPrec DeleteMessage
readPrec :: ReadPrec DeleteMessage
$creadListPrec :: ReadPrec [DeleteMessage]
readListPrec :: ReadPrec [DeleteMessage]
Prelude.Read, Int -> DeleteMessage -> ShowS
[DeleteMessage] -> ShowS
DeleteMessage -> String
(Int -> DeleteMessage -> ShowS)
-> (DeleteMessage -> String)
-> ([DeleteMessage] -> ShowS)
-> Show DeleteMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeleteMessage -> ShowS
showsPrec :: Int -> DeleteMessage -> ShowS
$cshow :: DeleteMessage -> String
show :: DeleteMessage -> String
$cshowList :: [DeleteMessage] -> ShowS
showList :: [DeleteMessage] -> ShowS
Prelude.Show, (forall x. DeleteMessage -> Rep DeleteMessage x)
-> (forall x. Rep DeleteMessage x -> DeleteMessage)
-> Generic DeleteMessage
forall x. Rep DeleteMessage x -> DeleteMessage
forall x. DeleteMessage -> Rep DeleteMessage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DeleteMessage -> Rep DeleteMessage x
from :: forall x. DeleteMessage -> Rep DeleteMessage x
$cto :: forall x. Rep DeleteMessage x -> DeleteMessage
to :: forall x. Rep DeleteMessage x -> DeleteMessage
Prelude.Generic)

-- |
-- Create a value of 'DeleteMessage' 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:
--
-- 'queueUrl', 'deleteMessage_queueUrl' - The URL of the Amazon SQS queue from which messages are deleted.
--
-- Queue URLs and names are case-sensitive.
--
-- 'receiptHandle', 'deleteMessage_receiptHandle' - The receipt handle associated with the message to delete.
newDeleteMessage ::
  -- | 'queueUrl'
  Prelude.Text ->
  -- | 'receiptHandle'
  Prelude.Text ->
  DeleteMessage
newDeleteMessage :: Text -> Text -> DeleteMessage
newDeleteMessage Text
pQueueUrl_ Text
pReceiptHandle_ =
  DeleteMessage'
    { $sel:queueUrl:DeleteMessage' :: Text
queueUrl = Text
pQueueUrl_,
      $sel:receiptHandle:DeleteMessage' :: Text
receiptHandle = Text
pReceiptHandle_
    }

-- | The URL of the Amazon SQS queue from which messages are deleted.
--
-- Queue URLs and names are case-sensitive.
deleteMessage_queueUrl :: Lens.Lens' DeleteMessage Prelude.Text
deleteMessage_queueUrl :: Lens' DeleteMessage Text
deleteMessage_queueUrl = (DeleteMessage -> Text)
-> (DeleteMessage -> Text -> DeleteMessage)
-> Lens' DeleteMessage Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteMessage' {Text
$sel:queueUrl:DeleteMessage' :: DeleteMessage -> Text
queueUrl :: Text
queueUrl} -> Text
queueUrl) (\s :: DeleteMessage
s@DeleteMessage' {} Text
a -> DeleteMessage
s {queueUrl = a} :: DeleteMessage)

-- | The receipt handle associated with the message to delete.
deleteMessage_receiptHandle :: Lens.Lens' DeleteMessage Prelude.Text
deleteMessage_receiptHandle :: Lens' DeleteMessage Text
deleteMessage_receiptHandle = (DeleteMessage -> Text)
-> (DeleteMessage -> Text -> DeleteMessage)
-> Lens' DeleteMessage Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteMessage' {Text
$sel:receiptHandle:DeleteMessage' :: DeleteMessage -> Text
receiptHandle :: Text
receiptHandle} -> Text
receiptHandle) (\s :: DeleteMessage
s@DeleteMessage' {} Text
a -> DeleteMessage
s {receiptHandle = a} :: DeleteMessage)

instance Core.AWSRequest DeleteMessage where
  type
    AWSResponse DeleteMessage =
      DeleteMessageResponse
  request :: (Service -> Service) -> DeleteMessage -> Request DeleteMessage
request Service -> Service
overrides =
    Service -> DeleteMessage -> Request DeleteMessage
forall a. ToRequest a => Service -> a -> Request a
Request.postQuery (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy DeleteMessage
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse DeleteMessage)))
response =
    AWSResponse DeleteMessage
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy DeleteMessage
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse DeleteMessage)))
forall (m :: * -> *) a.
MonadResource m =>
AWSResponse a
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveNull AWSResponse DeleteMessage
DeleteMessageResponse
DeleteMessageResponse'

instance Prelude.Hashable DeleteMessage where
  hashWithSalt :: Int -> DeleteMessage -> Int
hashWithSalt Int
_salt DeleteMessage' {Text
$sel:queueUrl:DeleteMessage' :: DeleteMessage -> Text
$sel:receiptHandle:DeleteMessage' :: DeleteMessage -> Text
queueUrl :: Text
receiptHandle :: Text
..} =
    Int
_salt
      Int -> Text -> Int
forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
queueUrl
      Int -> Text -> Int
forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
receiptHandle

instance Prelude.NFData DeleteMessage where
  rnf :: DeleteMessage -> ()
rnf DeleteMessage' {Text
$sel:queueUrl:DeleteMessage' :: DeleteMessage -> Text
$sel:receiptHandle:DeleteMessage' :: DeleteMessage -> Text
queueUrl :: Text
receiptHandle :: Text
..} =
    Text -> ()
forall a. NFData a => a -> ()
Prelude.rnf Text
queueUrl
      () -> () -> ()
forall a b. a -> b -> b
`Prelude.seq` Text -> ()
forall a. NFData a => a -> ()
Prelude.rnf Text
receiptHandle

instance Data.ToHeaders DeleteMessage where
  toHeaders :: DeleteMessage -> [Header]
toHeaders = [Header] -> DeleteMessage -> [Header]
forall a b. a -> b -> a
Prelude.const [Header]
forall a. Monoid a => a
Prelude.mempty

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

instance Data.ToQuery DeleteMessage where
  toQuery :: DeleteMessage -> QueryString
toQuery DeleteMessage' {Text
$sel:queueUrl:DeleteMessage' :: DeleteMessage -> Text
$sel:receiptHandle:DeleteMessage' :: DeleteMessage -> Text
queueUrl :: Text
receiptHandle :: Text
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"DeleteMessage" :: Prelude.ByteString),
        ByteString
"Version"
          ByteString -> ByteString -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2012-11-05" :: Prelude.ByteString),
        ByteString
"QueueUrl" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
queueUrl,
        ByteString
"ReceiptHandle" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
receiptHandle
      ]

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

-- |
-- Create a value of 'DeleteMessageResponse' 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.
newDeleteMessageResponse ::
  DeleteMessageResponse
newDeleteMessageResponse :: DeleteMessageResponse
newDeleteMessageResponse = DeleteMessageResponse
DeleteMessageResponse'

instance Prelude.NFData DeleteMessageResponse where
  rnf :: DeleteMessageResponse -> ()
rnf DeleteMessageResponse
_ = ()