{-# 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.Glacier.AbortMultipartUpload
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- This operation aborts a multipart upload identified by the upload ID.
--
-- After the Abort Multipart Upload request succeeds, you cannot upload any
-- more parts to the multipart upload or complete the multipart upload.
-- Aborting a completed upload fails. However, aborting an already-aborted
-- upload will succeed, for a short time. For more information about
-- uploading a part and completing a multipart upload, see
-- UploadMultipartPart and CompleteMultipartUpload.
--
-- This operation is idempotent.
--
-- An AWS account has full permission to perform all operations (actions).
-- However, AWS Identity and Access Management (IAM) users don\'t have any
-- permissions by default. You must grant them explicit permission to
-- perform specific actions. For more information, see
-- <https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identity and Access Management (IAM)>.
--
-- For conceptual information and underlying REST API, see
-- <https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working with Archives in Amazon S3 Glacier>
-- and
-- <https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-abort-upload.html Abort Multipart Upload>
-- in the /Amazon Glacier Developer Guide/.
module Amazonka.Glacier.AbortMultipartUpload
  ( -- * Creating a Request
    AbortMultipartUpload (..),
    newAbortMultipartUpload,

    -- * Request Lenses
    abortMultipartUpload_accountId,
    abortMultipartUpload_vaultName,
    abortMultipartUpload_uploadId,

    -- * Destructuring the Response
    AbortMultipartUploadResponse (..),
    newAbortMultipartUploadResponse,
  )
where

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

-- | Provides options to abort a multipart upload identified by the upload
-- ID.
--
-- For information about the underlying REST API, see
-- <https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-abort-upload.html Abort Multipart Upload>.
-- For conceptual information, see
-- <https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working with Archives in Amazon S3 Glacier>.
--
-- /See:/ 'newAbortMultipartUpload' smart constructor.
data AbortMultipartUpload = AbortMultipartUpload'
  { -- | The @AccountId@ value is the AWS account ID of the account that owns the
    -- vault. You can either specify an AWS account ID or optionally a single
    -- \'@-@\' (hyphen), in which case Amazon S3 Glacier uses the AWS account
    -- ID associated with the credentials used to sign the request. If you use
    -- an account ID, do not include any hyphens (\'-\') in the ID.
    AbortMultipartUpload -> Text
accountId :: Prelude.Text,
    -- | The name of the vault.
    AbortMultipartUpload -> Text
vaultName :: Prelude.Text,
    -- | The upload ID of the multipart upload to delete.
    AbortMultipartUpload -> Text
uploadId :: Prelude.Text
  }
  deriving (AbortMultipartUpload -> AbortMultipartUpload -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AbortMultipartUpload -> AbortMultipartUpload -> Bool
$c/= :: AbortMultipartUpload -> AbortMultipartUpload -> Bool
== :: AbortMultipartUpload -> AbortMultipartUpload -> Bool
$c== :: AbortMultipartUpload -> AbortMultipartUpload -> Bool
Prelude.Eq, ReadPrec [AbortMultipartUpload]
ReadPrec AbortMultipartUpload
Int -> ReadS AbortMultipartUpload
ReadS [AbortMultipartUpload]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AbortMultipartUpload]
$creadListPrec :: ReadPrec [AbortMultipartUpload]
readPrec :: ReadPrec AbortMultipartUpload
$creadPrec :: ReadPrec AbortMultipartUpload
readList :: ReadS [AbortMultipartUpload]
$creadList :: ReadS [AbortMultipartUpload]
readsPrec :: Int -> ReadS AbortMultipartUpload
$creadsPrec :: Int -> ReadS AbortMultipartUpload
Prelude.Read, Int -> AbortMultipartUpload -> ShowS
[AbortMultipartUpload] -> ShowS
AbortMultipartUpload -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AbortMultipartUpload] -> ShowS
$cshowList :: [AbortMultipartUpload] -> ShowS
show :: AbortMultipartUpload -> String
$cshow :: AbortMultipartUpload -> String
showsPrec :: Int -> AbortMultipartUpload -> ShowS
$cshowsPrec :: Int -> AbortMultipartUpload -> ShowS
Prelude.Show, forall x. Rep AbortMultipartUpload x -> AbortMultipartUpload
forall x. AbortMultipartUpload -> Rep AbortMultipartUpload x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AbortMultipartUpload x -> AbortMultipartUpload
$cfrom :: forall x. AbortMultipartUpload -> Rep AbortMultipartUpload x
Prelude.Generic)

-- |
-- Create a value of 'AbortMultipartUpload' 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:
--
-- 'accountId', 'abortMultipartUpload_accountId' - The @AccountId@ value is the AWS account ID of the account that owns the
-- vault. You can either specify an AWS account ID or optionally a single
-- \'@-@\' (hyphen), in which case Amazon S3 Glacier uses the AWS account
-- ID associated with the credentials used to sign the request. If you use
-- an account ID, do not include any hyphens (\'-\') in the ID.
--
-- 'vaultName', 'abortMultipartUpload_vaultName' - The name of the vault.
--
-- 'uploadId', 'abortMultipartUpload_uploadId' - The upload ID of the multipart upload to delete.
newAbortMultipartUpload ::
  -- | 'accountId'
  Prelude.Text ->
  -- | 'vaultName'
  Prelude.Text ->
  -- | 'uploadId'
  Prelude.Text ->
  AbortMultipartUpload
newAbortMultipartUpload :: Text -> Text -> Text -> AbortMultipartUpload
newAbortMultipartUpload
  Text
pAccountId_
  Text
pVaultName_
  Text
pUploadId_ =
    AbortMultipartUpload'
      { $sel:accountId:AbortMultipartUpload' :: Text
accountId = Text
pAccountId_,
        $sel:vaultName:AbortMultipartUpload' :: Text
vaultName = Text
pVaultName_,
        $sel:uploadId:AbortMultipartUpload' :: Text
uploadId = Text
pUploadId_
      }

-- | The @AccountId@ value is the AWS account ID of the account that owns the
-- vault. You can either specify an AWS account ID or optionally a single
-- \'@-@\' (hyphen), in which case Amazon S3 Glacier uses the AWS account
-- ID associated with the credentials used to sign the request. If you use
-- an account ID, do not include any hyphens (\'-\') in the ID.
abortMultipartUpload_accountId :: Lens.Lens' AbortMultipartUpload Prelude.Text
abortMultipartUpload_accountId :: Lens' AbortMultipartUpload Text
abortMultipartUpload_accountId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AbortMultipartUpload' {Text
accountId :: Text
$sel:accountId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
accountId} -> Text
accountId) (\s :: AbortMultipartUpload
s@AbortMultipartUpload' {} Text
a -> AbortMultipartUpload
s {$sel:accountId:AbortMultipartUpload' :: Text
accountId = Text
a} :: AbortMultipartUpload)

-- | The name of the vault.
abortMultipartUpload_vaultName :: Lens.Lens' AbortMultipartUpload Prelude.Text
abortMultipartUpload_vaultName :: Lens' AbortMultipartUpload Text
abortMultipartUpload_vaultName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AbortMultipartUpload' {Text
vaultName :: Text
$sel:vaultName:AbortMultipartUpload' :: AbortMultipartUpload -> Text
vaultName} -> Text
vaultName) (\s :: AbortMultipartUpload
s@AbortMultipartUpload' {} Text
a -> AbortMultipartUpload
s {$sel:vaultName:AbortMultipartUpload' :: Text
vaultName = Text
a} :: AbortMultipartUpload)

-- | The upload ID of the multipart upload to delete.
abortMultipartUpload_uploadId :: Lens.Lens' AbortMultipartUpload Prelude.Text
abortMultipartUpload_uploadId :: Lens' AbortMultipartUpload Text
abortMultipartUpload_uploadId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AbortMultipartUpload' {Text
uploadId :: Text
$sel:uploadId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
uploadId} -> Text
uploadId) (\s :: AbortMultipartUpload
s@AbortMultipartUpload' {} Text
a -> AbortMultipartUpload
s {$sel:uploadId:AbortMultipartUpload' :: Text
uploadId = Text
a} :: AbortMultipartUpload)

instance Core.AWSRequest AbortMultipartUpload where
  type
    AWSResponse AbortMultipartUpload =
      AbortMultipartUploadResponse
  request :: (Service -> Service)
-> AbortMultipartUpload -> Request AbortMultipartUpload
request Service -> Service
overrides =
    forall a. ByteString -> Request a -> Request a
Request.glacierVersionHeader (Service -> ByteString
Core.version Service
defaultService)
      forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. ToRequest a => Service -> a -> Request a
Request.delete (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy AbortMultipartUpload
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse AbortMultipartUpload)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
AWSResponse a
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveNull AbortMultipartUploadResponse
AbortMultipartUploadResponse'

instance Prelude.Hashable AbortMultipartUpload where
  hashWithSalt :: Int -> AbortMultipartUpload -> Int
hashWithSalt Int
_salt AbortMultipartUpload' {Text
uploadId :: Text
vaultName :: Text
accountId :: Text
$sel:uploadId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:vaultName:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:accountId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
accountId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
vaultName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
uploadId

instance Prelude.NFData AbortMultipartUpload where
  rnf :: AbortMultipartUpload -> ()
rnf AbortMultipartUpload' {Text
uploadId :: Text
vaultName :: Text
accountId :: Text
$sel:uploadId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:vaultName:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:accountId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
accountId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
vaultName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
uploadId

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

instance Data.ToPath AbortMultipartUpload where
  toPath :: AbortMultipartUpload -> ByteString
toPath AbortMultipartUpload' {Text
uploadId :: Text
vaultName :: Text
accountId :: Text
$sel:uploadId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:vaultName:AbortMultipartUpload' :: AbortMultipartUpload -> Text
$sel:accountId:AbortMultipartUpload' :: AbortMultipartUpload -> Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
accountId,
        ByteString
"/vaults/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
vaultName,
        ByteString
"/multipart-uploads/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
uploadId
      ]

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

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

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

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