{-# 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.S3.RestoreObject
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Restores an archived copy of an object back into Amazon S3
--
-- This action is not supported by Amazon S3 on Outposts.
--
-- This action performs the following types of requests:
--
-- -   @select@ - Perform a select query on an archived object
--
-- -   @restore an archive@ - Restore an archived object
--
-- To use this operation, you must have permissions to perform the
-- @s3:RestoreObject@ action. The bucket owner has this permission by
-- default and can grant this permission to others. For more information
-- about permissions, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources Permissions Related to Bucket Subresource Operations>
-- and
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html Managing Access Permissions to Your Amazon S3 Resources>
-- in the /Amazon S3 User Guide/.
--
-- __Querying Archives with Select Requests__
--
-- You use a select type of request to perform SQL queries on archived
-- objects. The archived objects that are being queried by the select
-- request must be formatted as uncompressed comma-separated values (CSV)
-- files. You can run queries and custom analytics on your archived data
-- without having to restore your data to a hotter Amazon S3 tier. For an
-- overview about select requests, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/querying-glacier-archives.html Querying Archived Objects>
-- in the /Amazon S3 User Guide/.
--
-- When making a select request, do the following:
--
-- -   Define an output location for the select query\'s output. This must
--     be an Amazon S3 bucket in the same Amazon Web Services Region as the
--     bucket that contains the archive object that is being queried. The
--     Amazon Web Services account that initiates the job must have
--     permissions to write to the S3 bucket. You can specify the storage
--     class and encryption for the output objects stored in the bucket.
--     For more information about output, see
--     <https://docs.aws.amazon.com/AmazonS3/latest/dev/querying-glacier-archives.html Querying Archived Objects>
--     in the /Amazon S3 User Guide/.
--
--     For more information about the @S3@ structure in the request body,
--     see the following:
--
--     -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject>
--
--     -   <https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html Managing Access with ACLs>
--         in the /Amazon S3 User Guide/
--
--     -   <https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html Protecting Data Using Server-Side Encryption>
--         in the /Amazon S3 User Guide/
--
-- -   Define the SQL expression for the @SELECT@ type of restoration for
--     your query in the request body\'s @SelectParameters@ structure. You
--     can use expressions like the following examples.
--
--     -   The following expression returns all records from the specified
--         object.
--
--         @SELECT * FROM Object@
--
--     -   Assuming that you are not using any headers for data stored in
--         the object, you can specify columns with positional headers.
--
--         @SELECT s._1, s._2 FROM Object s WHERE s._3 > 100@
--
--     -   If you have headers and you set the @fileHeaderInfo@ in the
--         @CSV@ structure in the request body to @USE@, you can specify
--         headers in the query. (If you set the @fileHeaderInfo@ field to
--         @IGNORE@, the first row is skipped for the query.) You cannot
--         mix ordinal positions with header column names.
--
--         @SELECT s.Id, s.FirstName, s.SSN FROM S3Object s@
--
-- For more information about using SQL with S3 Glacier Select restore, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-glacier-select-sql-reference.html SQL Reference for Amazon S3 Select and S3 Glacier Select>
-- in the /Amazon S3 User Guide/.
--
-- When making a select request, you can also do the following:
--
-- -   To expedite your queries, specify the @Expedited@ tier. For more
--     information about tiers, see \"Restoring Archives,\" later in this
--     topic.
--
-- -   Specify details about the data serialization format of both the
--     input object that is being queried and the serialization of the
--     CSV-encoded query results.
--
-- The following are additional important facts about the select feature:
--
-- -   The output results are new Amazon S3 objects. Unlike archive
--     retrievals, they are stored until explicitly deleted-manually or
--     through a lifecycle policy.
--
-- -   You can issue more than one select request on the same Amazon S3
--     object. Amazon S3 doesn\'t deduplicate requests, so avoid issuing
--     duplicate requests.
--
-- -   Amazon S3 accepts a select request even if the object has already
--     been restored. A select request doesn’t return error response @409@.
--
-- __Restoring objects__
--
-- Objects that you archive to the S3 Glacier or S3 Glacier Deep Archive
-- storage class, and S3 Intelligent-Tiering Archive or S3
-- Intelligent-Tiering Deep Archive tiers are not accessible in real time.
-- For objects in Archive Access or Deep Archive Access tiers you must
-- first initiate a restore request, and then wait until the object is
-- moved into the Frequent Access tier. For objects in S3 Glacier or S3
-- Glacier Deep Archive storage classes you must first initiate a restore
-- request, and then wait until a temporary copy of the object is
-- available. To access an archived object, you must restore the object for
-- the duration (number of days) that you specify.
--
-- To restore a specific object version, you can provide a version ID. If
-- you don\'t provide a version ID, Amazon S3 restores the current version.
--
-- When restoring an archived object (or using a select request), you can
-- specify one of the following data access tier options in the @Tier@
-- element of the request body:
--
-- -   __@Expedited@__ - Expedited retrievals allow you to quickly access
--     your data stored in the S3 Glacier storage class or S3
--     Intelligent-Tiering Archive tier when occasional urgent requests for
--     a subset of archives are required. For all but the largest archived
--     objects (250 MB+), data accessed using Expedited retrievals is
--     typically made available within 1–5 minutes. Provisioned capacity
--     ensures that retrieval capacity for Expedited retrievals is
--     available when you need it. Expedited retrievals and provisioned
--     capacity are not available for objects stored in the S3 Glacier Deep
--     Archive storage class or S3 Intelligent-Tiering Deep Archive tier.
--
-- -   __@Standard@__ - Standard retrievals allow you to access any of your
--     archived objects within several hours. This is the default option
--     for retrieval requests that do not specify the retrieval option.
--     Standard retrievals typically finish within 3–5 hours for objects
--     stored in the S3 Glacier storage class or S3 Intelligent-Tiering
--     Archive tier. They typically finish within 12 hours for objects
--     stored in the S3 Glacier Deep Archive storage class or S3
--     Intelligent-Tiering Deep Archive tier. Standard retrievals are free
--     for objects stored in S3 Intelligent-Tiering.
--
-- -   __@Bulk@__ - Bulk retrievals are the lowest-cost retrieval option in
--     S3 Glacier, enabling you to retrieve large amounts, even petabytes,
--     of data inexpensively. Bulk retrievals typically finish within 5–12
--     hours for objects stored in the S3 Glacier storage class or S3
--     Intelligent-Tiering Archive tier. They typically finish within 48
--     hours for objects stored in the S3 Glacier Deep Archive storage
--     class or S3 Intelligent-Tiering Deep Archive tier. Bulk retrievals
--     are free for objects stored in S3 Intelligent-Tiering.
--
-- For more information about archive retrieval options and provisioned
-- capacity for @Expedited@ data access, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html Restoring Archived Objects>
-- in the /Amazon S3 User Guide/.
--
-- You can use Amazon S3 restore speed upgrade to change the restore speed
-- to a faster speed while it is in progress. For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html#restoring-objects-upgrade-tier.title.html Upgrading the speed of an in-progress restore>
-- in the /Amazon S3 User Guide/.
--
-- To get the status of object restoration, you can send a @HEAD@ request.
-- Operations return the @x-amz-restore@ header, which provides information
-- about the restoration status, in the response. You can use Amazon S3
-- event notifications to notify you when a restore is initiated or
-- completed. For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html Configuring Amazon S3 Event Notifications>
-- in the /Amazon S3 User Guide/.
--
-- After restoring an archived object, you can update the restoration
-- period by reissuing the request with a new period. Amazon S3 updates the
-- restoration period relative to the current time and charges only for the
-- request-there are no data transfer charges. You cannot update the
-- restoration period when Amazon S3 is actively processing your current
-- restore request for the object.
--
-- If your bucket has a lifecycle configuration with a rule that includes
-- an expiration action, the object expiration overrides the life span that
-- you specify in a restore request. For example, if you restore an object
-- copy for 10 days, but the object is scheduled to expire in 3 days,
-- Amazon S3 deletes the object in 3 days. For more information about
-- lifecycle configuration, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html PutBucketLifecycleConfiguration>
-- and
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html Object Lifecycle Management>
-- in /Amazon S3 User Guide/.
--
-- __Responses__
--
-- A successful action returns either the @200 OK@ or @202 Accepted@ status
-- code.
--
-- -   If the object is not previously restored, then Amazon S3 returns
--     @202 Accepted@ in the response.
--
-- -   If the object is previously restored, Amazon S3 returns @200 OK@ in
--     the response.
--
-- __Special Errors__
--
-- -   -   /Code: RestoreAlreadyInProgress/
--
--     -   /Cause: Object restore is already in progress. (This error does
--         not apply to SELECT type requests.)/
--
--     -   /HTTP Status Code: 409 Conflict/
--
--     -   /SOAP Fault Code Prefix: Client/
--
-- -   -   /Code: GlacierExpeditedRetrievalNotAvailable/
--
--     -   /Cause: expedited retrievals are currently not available. Try
--         again later. (Returned if there is insufficient capacity to
--         process the Expedited request. This error applies only to
--         Expedited retrievals and not to S3 Standard or Bulk
--         retrievals.)/
--
--     -   /HTTP Status Code: 503/
--
--     -   /SOAP Fault Code Prefix: N\/A/
--
-- __Related Resources__
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html PutBucketLifecycleConfiguration>
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html GetBucketNotificationConfiguration>
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-glacier-select-sql-reference.html SQL Reference for Amazon S3 Select and S3 Glacier Select>
--     in the /Amazon S3 User Guide/
module Amazonka.S3.RestoreObject
  ( -- * Creating a Request
    RestoreObject (..),
    newRestoreObject,

    -- * Request Lenses
    restoreObject_versionId,
    restoreObject_requestPayer,
    restoreObject_expectedBucketOwner,
    restoreObject_restoreRequest,
    restoreObject_bucket,
    restoreObject_key,

    -- * Destructuring the Response
    RestoreObjectResponse (..),
    newRestoreObjectResponse,

    -- * Response Lenses
    restoreObjectResponse_requestCharged,
    restoreObjectResponse_restoreOutputPath,
    restoreObjectResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.S3.Types

-- | /See:/ 'newRestoreObject' smart constructor.
data RestoreObject = RestoreObject'
  { -- | VersionId used to reference a specific version of the object.
    RestoreObject -> Maybe ObjectVersionId
versionId :: Prelude.Maybe ObjectVersionId,
    RestoreObject -> Maybe RequestPayer
requestPayer :: Prelude.Maybe RequestPayer,
    -- | The account ID of the expected bucket owner. If the bucket is owned by a
    -- different account, the request will fail with an HTTP
    -- @403 (Access Denied)@ error.
    RestoreObject -> Maybe Text
expectedBucketOwner :: Prelude.Maybe Prelude.Text,
    RestoreObject -> Maybe RestoreRequest
restoreRequest :: Prelude.Maybe RestoreRequest,
    -- | The bucket name containing the object to restore.
    --
    -- When using this action with an access point, you must direct requests to
    -- the access point hostname. The access point hostname takes the form
    -- /AccessPointName/-/AccountId/.s3-accesspoint./Region/.amazonaws.com.
    -- When using this action with an access point through the Amazon Web
    -- Services SDKs, you provide the access point ARN in place of the bucket
    -- name. For more information about access point ARNs, see
    -- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html Using access points>
    -- in the /Amazon S3 User Guide/.
    --
    -- When using this action with Amazon S3 on Outposts, you must direct
    -- requests to the S3 on Outposts hostname. The S3 on Outposts hostname
    -- takes the form
    -- /AccessPointName/-/AccountId/./outpostID/.s3-outposts./Region/.amazonaws.com.
    -- When using this action using S3 on Outposts through the Amazon Web
    -- Services SDKs, you provide the Outposts bucket ARN in place of the
    -- bucket name. For more information about S3 on Outposts ARNs, see
    -- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html Using S3 on Outposts>
    -- in the /Amazon S3 User Guide/.
    RestoreObject -> BucketName
bucket :: BucketName,
    -- | Object key for which the action was initiated.
    RestoreObject -> ObjectKey
key :: ObjectKey
  }
  deriving (RestoreObject -> RestoreObject -> Bool
(RestoreObject -> RestoreObject -> Bool)
-> (RestoreObject -> RestoreObject -> Bool) -> Eq RestoreObject
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RestoreObject -> RestoreObject -> Bool
$c/= :: RestoreObject -> RestoreObject -> Bool
== :: RestoreObject -> RestoreObject -> Bool
$c== :: RestoreObject -> RestoreObject -> Bool
Prelude.Eq, Int -> RestoreObject -> ShowS
[RestoreObject] -> ShowS
RestoreObject -> String
(Int -> RestoreObject -> ShowS)
-> (RestoreObject -> String)
-> ([RestoreObject] -> ShowS)
-> Show RestoreObject
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RestoreObject] -> ShowS
$cshowList :: [RestoreObject] -> ShowS
show :: RestoreObject -> String
$cshow :: RestoreObject -> String
showsPrec :: Int -> RestoreObject -> ShowS
$cshowsPrec :: Int -> RestoreObject -> ShowS
Prelude.Show, (forall x. RestoreObject -> Rep RestoreObject x)
-> (forall x. Rep RestoreObject x -> RestoreObject)
-> Generic RestoreObject
forall x. Rep RestoreObject x -> RestoreObject
forall x. RestoreObject -> Rep RestoreObject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RestoreObject x -> RestoreObject
$cfrom :: forall x. RestoreObject -> Rep RestoreObject x
Prelude.Generic)

-- |
-- Create a value of 'RestoreObject' 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:
--
-- 'versionId', 'restoreObject_versionId' - VersionId used to reference a specific version of the object.
--
-- 'requestPayer', 'restoreObject_requestPayer' - Undocumented member.
--
-- 'expectedBucketOwner', 'restoreObject_expectedBucketOwner' - The account ID of the expected bucket owner. If the bucket is owned by a
-- different account, the request will fail with an HTTP
-- @403 (Access Denied)@ error.
--
-- 'restoreRequest', 'restoreObject_restoreRequest' - Undocumented member.
--
-- 'bucket', 'restoreObject_bucket' - The bucket name containing the object to restore.
--
-- When using this action with an access point, you must direct requests to
-- the access point hostname. The access point hostname takes the form
-- /AccessPointName/-/AccountId/.s3-accesspoint./Region/.amazonaws.com.
-- When using this action with an access point through the Amazon Web
-- Services SDKs, you provide the access point ARN in place of the bucket
-- name. For more information about access point ARNs, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html Using access points>
-- in the /Amazon S3 User Guide/.
--
-- When using this action with Amazon S3 on Outposts, you must direct
-- requests to the S3 on Outposts hostname. The S3 on Outposts hostname
-- takes the form
-- /AccessPointName/-/AccountId/./outpostID/.s3-outposts./Region/.amazonaws.com.
-- When using this action using S3 on Outposts through the Amazon Web
-- Services SDKs, you provide the Outposts bucket ARN in place of the
-- bucket name. For more information about S3 on Outposts ARNs, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html Using S3 on Outposts>
-- in the /Amazon S3 User Guide/.
--
-- 'key', 'restoreObject_key' - Object key for which the action was initiated.
newRestoreObject ::
  -- | 'bucket'
  BucketName ->
  -- | 'key'
  ObjectKey ->
  RestoreObject
newRestoreObject :: BucketName -> ObjectKey -> RestoreObject
newRestoreObject BucketName
pBucket_ ObjectKey
pKey_ =
  RestoreObject' :: Maybe ObjectVersionId
-> Maybe RequestPayer
-> Maybe Text
-> Maybe RestoreRequest
-> BucketName
-> ObjectKey
-> RestoreObject
RestoreObject'
    { $sel:versionId:RestoreObject' :: Maybe ObjectVersionId
versionId = Maybe ObjectVersionId
forall a. Maybe a
Prelude.Nothing,
      $sel:requestPayer:RestoreObject' :: Maybe RequestPayer
requestPayer = Maybe RequestPayer
forall a. Maybe a
Prelude.Nothing,
      $sel:expectedBucketOwner:RestoreObject' :: Maybe Text
expectedBucketOwner = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:restoreRequest:RestoreObject' :: Maybe RestoreRequest
restoreRequest = Maybe RestoreRequest
forall a. Maybe a
Prelude.Nothing,
      $sel:bucket:RestoreObject' :: BucketName
bucket = BucketName
pBucket_,
      $sel:key:RestoreObject' :: ObjectKey
key = ObjectKey
pKey_
    }

-- | VersionId used to reference a specific version of the object.
restoreObject_versionId :: Lens.Lens' RestoreObject (Prelude.Maybe ObjectVersionId)
restoreObject_versionId :: (Maybe ObjectVersionId -> f (Maybe ObjectVersionId))
-> RestoreObject -> f RestoreObject
restoreObject_versionId = (RestoreObject -> Maybe ObjectVersionId)
-> (RestoreObject -> Maybe ObjectVersionId -> RestoreObject)
-> Lens
     RestoreObject
     RestoreObject
     (Maybe ObjectVersionId)
     (Maybe ObjectVersionId)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {Maybe ObjectVersionId
versionId :: Maybe ObjectVersionId
$sel:versionId:RestoreObject' :: RestoreObject -> Maybe ObjectVersionId
versionId} -> Maybe ObjectVersionId
versionId) (\s :: RestoreObject
s@RestoreObject' {} Maybe ObjectVersionId
a -> RestoreObject
s {$sel:versionId:RestoreObject' :: Maybe ObjectVersionId
versionId = Maybe ObjectVersionId
a} :: RestoreObject)

-- | Undocumented member.
restoreObject_requestPayer :: Lens.Lens' RestoreObject (Prelude.Maybe RequestPayer)
restoreObject_requestPayer :: (Maybe RequestPayer -> f (Maybe RequestPayer))
-> RestoreObject -> f RestoreObject
restoreObject_requestPayer = (RestoreObject -> Maybe RequestPayer)
-> (RestoreObject -> Maybe RequestPayer -> RestoreObject)
-> Lens
     RestoreObject
     RestoreObject
     (Maybe RequestPayer)
     (Maybe RequestPayer)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {Maybe RequestPayer
requestPayer :: Maybe RequestPayer
$sel:requestPayer:RestoreObject' :: RestoreObject -> Maybe RequestPayer
requestPayer} -> Maybe RequestPayer
requestPayer) (\s :: RestoreObject
s@RestoreObject' {} Maybe RequestPayer
a -> RestoreObject
s {$sel:requestPayer:RestoreObject' :: Maybe RequestPayer
requestPayer = Maybe RequestPayer
a} :: RestoreObject)

-- | The account ID of the expected bucket owner. If the bucket is owned by a
-- different account, the request will fail with an HTTP
-- @403 (Access Denied)@ error.
restoreObject_expectedBucketOwner :: Lens.Lens' RestoreObject (Prelude.Maybe Prelude.Text)
restoreObject_expectedBucketOwner :: (Maybe Text -> f (Maybe Text)) -> RestoreObject -> f RestoreObject
restoreObject_expectedBucketOwner = (RestoreObject -> Maybe Text)
-> (RestoreObject -> Maybe Text -> RestoreObject)
-> Lens RestoreObject RestoreObject (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {Maybe Text
expectedBucketOwner :: Maybe Text
$sel:expectedBucketOwner:RestoreObject' :: RestoreObject -> Maybe Text
expectedBucketOwner} -> Maybe Text
expectedBucketOwner) (\s :: RestoreObject
s@RestoreObject' {} Maybe Text
a -> RestoreObject
s {$sel:expectedBucketOwner:RestoreObject' :: Maybe Text
expectedBucketOwner = Maybe Text
a} :: RestoreObject)

-- | Undocumented member.
restoreObject_restoreRequest :: Lens.Lens' RestoreObject (Prelude.Maybe RestoreRequest)
restoreObject_restoreRequest :: (Maybe RestoreRequest -> f (Maybe RestoreRequest))
-> RestoreObject -> f RestoreObject
restoreObject_restoreRequest = (RestoreObject -> Maybe RestoreRequest)
-> (RestoreObject -> Maybe RestoreRequest -> RestoreObject)
-> Lens
     RestoreObject
     RestoreObject
     (Maybe RestoreRequest)
     (Maybe RestoreRequest)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {Maybe RestoreRequest
restoreRequest :: Maybe RestoreRequest
$sel:restoreRequest:RestoreObject' :: RestoreObject -> Maybe RestoreRequest
restoreRequest} -> Maybe RestoreRequest
restoreRequest) (\s :: RestoreObject
s@RestoreObject' {} Maybe RestoreRequest
a -> RestoreObject
s {$sel:restoreRequest:RestoreObject' :: Maybe RestoreRequest
restoreRequest = Maybe RestoreRequest
a} :: RestoreObject)

-- | The bucket name containing the object to restore.
--
-- When using this action with an access point, you must direct requests to
-- the access point hostname. The access point hostname takes the form
-- /AccessPointName/-/AccountId/.s3-accesspoint./Region/.amazonaws.com.
-- When using this action with an access point through the Amazon Web
-- Services SDKs, you provide the access point ARN in place of the bucket
-- name. For more information about access point ARNs, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html Using access points>
-- in the /Amazon S3 User Guide/.
--
-- When using this action with Amazon S3 on Outposts, you must direct
-- requests to the S3 on Outposts hostname. The S3 on Outposts hostname
-- takes the form
-- /AccessPointName/-/AccountId/./outpostID/.s3-outposts./Region/.amazonaws.com.
-- When using this action using S3 on Outposts through the Amazon Web
-- Services SDKs, you provide the Outposts bucket ARN in place of the
-- bucket name. For more information about S3 on Outposts ARNs, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html Using S3 on Outposts>
-- in the /Amazon S3 User Guide/.
restoreObject_bucket :: Lens.Lens' RestoreObject BucketName
restoreObject_bucket :: (BucketName -> f BucketName) -> RestoreObject -> f RestoreObject
restoreObject_bucket = (RestoreObject -> BucketName)
-> (RestoreObject -> BucketName -> RestoreObject)
-> Lens RestoreObject RestoreObject BucketName BucketName
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {BucketName
bucket :: BucketName
$sel:bucket:RestoreObject' :: RestoreObject -> BucketName
bucket} -> BucketName
bucket) (\s :: RestoreObject
s@RestoreObject' {} BucketName
a -> RestoreObject
s {$sel:bucket:RestoreObject' :: BucketName
bucket = BucketName
a} :: RestoreObject)

-- | Object key for which the action was initiated.
restoreObject_key :: Lens.Lens' RestoreObject ObjectKey
restoreObject_key :: (ObjectKey -> f ObjectKey) -> RestoreObject -> f RestoreObject
restoreObject_key = (RestoreObject -> ObjectKey)
-> (RestoreObject -> ObjectKey -> RestoreObject)
-> Lens RestoreObject RestoreObject ObjectKey ObjectKey
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObject' {ObjectKey
key :: ObjectKey
$sel:key:RestoreObject' :: RestoreObject -> ObjectKey
key} -> ObjectKey
key) (\s :: RestoreObject
s@RestoreObject' {} ObjectKey
a -> RestoreObject
s {$sel:key:RestoreObject' :: ObjectKey
key = ObjectKey
a} :: RestoreObject)

instance Core.AWSRequest RestoreObject where
  type
    AWSResponse RestoreObject =
      RestoreObjectResponse
  request :: RestoreObject -> Request RestoreObject
request =
    Request RestoreObject -> Request RestoreObject
forall a. Request a -> Request a
Request.s3vhost
      (Request RestoreObject -> Request RestoreObject)
-> (RestoreObject -> Request RestoreObject)
-> RestoreObject
-> Request RestoreObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. Service -> RestoreObject -> Request RestoreObject
forall a. (ToRequest a, ToElement a) => Service -> a -> Request a
Request.postXML Service
defaultService
  response :: Logger
-> Service
-> Proxy RestoreObject
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse RestoreObject)))
response =
    (Int
 -> ResponseHeaders
 -> ()
 -> Either String (AWSResponse RestoreObject))
-> Logger
-> Service
-> Proxy RestoreObject
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse RestoreObject)))
forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> Logger
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Maybe RequestCharged -> Maybe Text -> Int -> RestoreObjectResponse
RestoreObjectResponse'
            (Maybe RequestCharged
 -> Maybe Text -> Int -> RestoreObjectResponse)
-> Either String (Maybe RequestCharged)
-> Either String (Maybe Text -> Int -> RestoreObjectResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (ResponseHeaders
h ResponseHeaders
-> HeaderName -> Either String (Maybe RequestCharged)
forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Core..#? HeaderName
"x-amz-request-charged")
            Either String (Maybe Text -> Int -> RestoreObjectResponse)
-> Either String (Maybe Text)
-> Either String (Int -> RestoreObjectResponse)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h ResponseHeaders -> HeaderName -> Either String (Maybe Text)
forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Core..#? HeaderName
"x-amz-restore-output-path")
            Either String (Int -> RestoreObjectResponse)
-> Either String Int -> Either String RestoreObjectResponse
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Int -> Either String Int
forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (Int -> Int
forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable RestoreObject

instance Prelude.NFData RestoreObject

instance Core.ToElement RestoreObject where
  toElement :: RestoreObject -> Element
toElement RestoreObject' {Maybe Text
Maybe ObjectVersionId
Maybe RequestPayer
Maybe RestoreRequest
ObjectKey
BucketName
key :: ObjectKey
bucket :: BucketName
restoreRequest :: Maybe RestoreRequest
expectedBucketOwner :: Maybe Text
requestPayer :: Maybe RequestPayer
versionId :: Maybe ObjectVersionId
$sel:key:RestoreObject' :: RestoreObject -> ObjectKey
$sel:bucket:RestoreObject' :: RestoreObject -> BucketName
$sel:restoreRequest:RestoreObject' :: RestoreObject -> Maybe RestoreRequest
$sel:expectedBucketOwner:RestoreObject' :: RestoreObject -> Maybe Text
$sel:requestPayer:RestoreObject' :: RestoreObject -> Maybe RequestPayer
$sel:versionId:RestoreObject' :: RestoreObject -> Maybe ObjectVersionId
..} =
    Name -> Maybe RestoreRequest -> Element
forall a. ToXML a => Name -> a -> Element
Core.mkElement
      Name
"{http://s3.amazonaws.com/doc/2006-03-01/}RestoreRequest"
      Maybe RestoreRequest
restoreRequest

instance Core.ToHeaders RestoreObject where
  toHeaders :: RestoreObject -> ResponseHeaders
toHeaders RestoreObject' {Maybe Text
Maybe ObjectVersionId
Maybe RequestPayer
Maybe RestoreRequest
ObjectKey
BucketName
key :: ObjectKey
bucket :: BucketName
restoreRequest :: Maybe RestoreRequest
expectedBucketOwner :: Maybe Text
requestPayer :: Maybe RequestPayer
versionId :: Maybe ObjectVersionId
$sel:key:RestoreObject' :: RestoreObject -> ObjectKey
$sel:bucket:RestoreObject' :: RestoreObject -> BucketName
$sel:restoreRequest:RestoreObject' :: RestoreObject -> Maybe RestoreRequest
$sel:expectedBucketOwner:RestoreObject' :: RestoreObject -> Maybe Text
$sel:requestPayer:RestoreObject' :: RestoreObject -> Maybe RequestPayer
$sel:versionId:RestoreObject' :: RestoreObject -> Maybe ObjectVersionId
..} =
    [ResponseHeaders] -> ResponseHeaders
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ HeaderName
"x-amz-request-payer" HeaderName -> Maybe RequestPayer -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# Maybe RequestPayer
requestPayer,
        HeaderName
"x-amz-expected-bucket-owner"
          HeaderName -> Maybe Text -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# Maybe Text
expectedBucketOwner
      ]

instance Core.ToPath RestoreObject where
  toPath :: RestoreObject -> ByteString
toPath RestoreObject' {Maybe Text
Maybe ObjectVersionId
Maybe RequestPayer
Maybe RestoreRequest
ObjectKey
BucketName
key :: ObjectKey
bucket :: BucketName
restoreRequest :: Maybe RestoreRequest
expectedBucketOwner :: Maybe Text
requestPayer :: Maybe RequestPayer
versionId :: Maybe ObjectVersionId
$sel:key:RestoreObject' :: RestoreObject -> ObjectKey
$sel:bucket:RestoreObject' :: RestoreObject -> BucketName
$sel:restoreRequest:RestoreObject' :: RestoreObject -> Maybe RestoreRequest
$sel:expectedBucketOwner:RestoreObject' :: RestoreObject -> Maybe Text
$sel:requestPayer:RestoreObject' :: RestoreObject -> Maybe RequestPayer
$sel:versionId:RestoreObject' :: RestoreObject -> Maybe ObjectVersionId
..} =
    [ByteString] -> ByteString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/", BucketName -> ByteString
forall a. ToByteString a => a -> ByteString
Core.toBS BucketName
bucket, ByteString
"/", ObjectKey -> ByteString
forall a. ToByteString a => a -> ByteString
Core.toBS ObjectKey
key]

instance Core.ToQuery RestoreObject where
  toQuery :: RestoreObject -> QueryString
toQuery RestoreObject' {Maybe Text
Maybe ObjectVersionId
Maybe RequestPayer
Maybe RestoreRequest
ObjectKey
BucketName
key :: ObjectKey
bucket :: BucketName
restoreRequest :: Maybe RestoreRequest
expectedBucketOwner :: Maybe Text
requestPayer :: Maybe RequestPayer
versionId :: Maybe ObjectVersionId
$sel:key:RestoreObject' :: RestoreObject -> ObjectKey
$sel:bucket:RestoreObject' :: RestoreObject -> BucketName
$sel:restoreRequest:RestoreObject' :: RestoreObject -> Maybe RestoreRequest
$sel:expectedBucketOwner:RestoreObject' :: RestoreObject -> Maybe Text
$sel:requestPayer:RestoreObject' :: RestoreObject -> Maybe RequestPayer
$sel:versionId:RestoreObject' :: RestoreObject -> Maybe ObjectVersionId
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"versionId" ByteString -> Maybe ObjectVersionId -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe ObjectVersionId
versionId, QueryString
"restore"]

-- | /See:/ 'newRestoreObjectResponse' smart constructor.
data RestoreObjectResponse = RestoreObjectResponse'
  { RestoreObjectResponse -> Maybe RequestCharged
requestCharged :: Prelude.Maybe RequestCharged,
    -- | Indicates the path in the provided S3 output location where Select
    -- results will be restored to.
    RestoreObjectResponse -> Maybe Text
restoreOutputPath :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    RestoreObjectResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (RestoreObjectResponse -> RestoreObjectResponse -> Bool
(RestoreObjectResponse -> RestoreObjectResponse -> Bool)
-> (RestoreObjectResponse -> RestoreObjectResponse -> Bool)
-> Eq RestoreObjectResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RestoreObjectResponse -> RestoreObjectResponse -> Bool
$c/= :: RestoreObjectResponse -> RestoreObjectResponse -> Bool
== :: RestoreObjectResponse -> RestoreObjectResponse -> Bool
$c== :: RestoreObjectResponse -> RestoreObjectResponse -> Bool
Prelude.Eq, ReadPrec [RestoreObjectResponse]
ReadPrec RestoreObjectResponse
Int -> ReadS RestoreObjectResponse
ReadS [RestoreObjectResponse]
(Int -> ReadS RestoreObjectResponse)
-> ReadS [RestoreObjectResponse]
-> ReadPrec RestoreObjectResponse
-> ReadPrec [RestoreObjectResponse]
-> Read RestoreObjectResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RestoreObjectResponse]
$creadListPrec :: ReadPrec [RestoreObjectResponse]
readPrec :: ReadPrec RestoreObjectResponse
$creadPrec :: ReadPrec RestoreObjectResponse
readList :: ReadS [RestoreObjectResponse]
$creadList :: ReadS [RestoreObjectResponse]
readsPrec :: Int -> ReadS RestoreObjectResponse
$creadsPrec :: Int -> ReadS RestoreObjectResponse
Prelude.Read, Int -> RestoreObjectResponse -> ShowS
[RestoreObjectResponse] -> ShowS
RestoreObjectResponse -> String
(Int -> RestoreObjectResponse -> ShowS)
-> (RestoreObjectResponse -> String)
-> ([RestoreObjectResponse] -> ShowS)
-> Show RestoreObjectResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RestoreObjectResponse] -> ShowS
$cshowList :: [RestoreObjectResponse] -> ShowS
show :: RestoreObjectResponse -> String
$cshow :: RestoreObjectResponse -> String
showsPrec :: Int -> RestoreObjectResponse -> ShowS
$cshowsPrec :: Int -> RestoreObjectResponse -> ShowS
Prelude.Show, (forall x. RestoreObjectResponse -> Rep RestoreObjectResponse x)
-> (forall x. Rep RestoreObjectResponse x -> RestoreObjectResponse)
-> Generic RestoreObjectResponse
forall x. Rep RestoreObjectResponse x -> RestoreObjectResponse
forall x. RestoreObjectResponse -> Rep RestoreObjectResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RestoreObjectResponse x -> RestoreObjectResponse
$cfrom :: forall x. RestoreObjectResponse -> Rep RestoreObjectResponse x
Prelude.Generic)

-- |
-- Create a value of 'RestoreObjectResponse' 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:
--
-- 'requestCharged', 'restoreObjectResponse_requestCharged' - Undocumented member.
--
-- 'restoreOutputPath', 'restoreObjectResponse_restoreOutputPath' - Indicates the path in the provided S3 output location where Select
-- results will be restored to.
--
-- 'httpStatus', 'restoreObjectResponse_httpStatus' - The response's http status code.
newRestoreObjectResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  RestoreObjectResponse
newRestoreObjectResponse :: Int -> RestoreObjectResponse
newRestoreObjectResponse Int
pHttpStatus_ =
  RestoreObjectResponse' :: Maybe RequestCharged -> Maybe Text -> Int -> RestoreObjectResponse
RestoreObjectResponse'
    { $sel:requestCharged:RestoreObjectResponse' :: Maybe RequestCharged
requestCharged =
        Maybe RequestCharged
forall a. Maybe a
Prelude.Nothing,
      $sel:restoreOutputPath:RestoreObjectResponse' :: Maybe Text
restoreOutputPath = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:RestoreObjectResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Undocumented member.
restoreObjectResponse_requestCharged :: Lens.Lens' RestoreObjectResponse (Prelude.Maybe RequestCharged)
restoreObjectResponse_requestCharged :: (Maybe RequestCharged -> f (Maybe RequestCharged))
-> RestoreObjectResponse -> f RestoreObjectResponse
restoreObjectResponse_requestCharged = (RestoreObjectResponse -> Maybe RequestCharged)
-> (RestoreObjectResponse
    -> Maybe RequestCharged -> RestoreObjectResponse)
-> Lens
     RestoreObjectResponse
     RestoreObjectResponse
     (Maybe RequestCharged)
     (Maybe RequestCharged)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObjectResponse' {Maybe RequestCharged
requestCharged :: Maybe RequestCharged
$sel:requestCharged:RestoreObjectResponse' :: RestoreObjectResponse -> Maybe RequestCharged
requestCharged} -> Maybe RequestCharged
requestCharged) (\s :: RestoreObjectResponse
s@RestoreObjectResponse' {} Maybe RequestCharged
a -> RestoreObjectResponse
s {$sel:requestCharged:RestoreObjectResponse' :: Maybe RequestCharged
requestCharged = Maybe RequestCharged
a} :: RestoreObjectResponse)

-- | Indicates the path in the provided S3 output location where Select
-- results will be restored to.
restoreObjectResponse_restoreOutputPath :: Lens.Lens' RestoreObjectResponse (Prelude.Maybe Prelude.Text)
restoreObjectResponse_restoreOutputPath :: (Maybe Text -> f (Maybe Text))
-> RestoreObjectResponse -> f RestoreObjectResponse
restoreObjectResponse_restoreOutputPath = (RestoreObjectResponse -> Maybe Text)
-> (RestoreObjectResponse -> Maybe Text -> RestoreObjectResponse)
-> Lens
     RestoreObjectResponse
     RestoreObjectResponse
     (Maybe Text)
     (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RestoreObjectResponse' {Maybe Text
restoreOutputPath :: Maybe Text
$sel:restoreOutputPath:RestoreObjectResponse' :: RestoreObjectResponse -> Maybe Text
restoreOutputPath} -> Maybe Text
restoreOutputPath) (\s :: RestoreObjectResponse
s@RestoreObjectResponse' {} Maybe Text
a -> RestoreObjectResponse
s {$sel:restoreOutputPath:RestoreObjectResponse' :: Maybe Text
restoreOutputPath = Maybe Text
a} :: RestoreObjectResponse)

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

instance Prelude.NFData RestoreObjectResponse