{-# LANGUAGE CPP #-}
module Aws.S3.Commands.RestoreObject
where

import           Aws.Core
import           Aws.S3.Core
import qualified Data.ByteString.Lazy.Char8 as B8
import qualified Data.Map as M
import           Data.Maybe
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Network.HTTP.Types as HTTP
import qualified Network.HTTP.Conduit as HTTP
import qualified Text.XML as XML
#if !MIN_VERSION_time(1,5,0)
import           System.Locale
#endif
import           Prelude

data RestoreObject
  = RestoreObject { RestoreObject -> Object
roObjectName :: Object
                  , RestoreObject -> Object
roBucket :: Bucket
                  , RestoreObject -> Maybe Object
roVersionId :: Maybe T.Text
                  , RestoreObject -> RestoreObjectTier
roTier :: RestoreObjectTier
                  , RestoreObject -> RestoreObjectLifetimeDays
roObjectLifetimeDays :: RestoreObjectLifetimeDays
                  }
  deriving (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
$cshowsPrec :: Int -> RestoreObject -> ShowS
showsPrec :: Int -> RestoreObject -> ShowS
$cshow :: RestoreObject -> String
show :: RestoreObject -> String
$cshowList :: [RestoreObject] -> ShowS
showList :: [RestoreObject] -> ShowS
Show)

data RestoreObjectTier
  = RestoreObjectTierExpedited
  | RestoreObjectTierStandard
  | RestoreObjectTierBulk
  deriving (Int -> RestoreObjectTier -> ShowS
[RestoreObjectTier] -> ShowS
RestoreObjectTier -> String
(Int -> RestoreObjectTier -> ShowS)
-> (RestoreObjectTier -> String)
-> ([RestoreObjectTier] -> ShowS)
-> Show RestoreObjectTier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RestoreObjectTier -> ShowS
showsPrec :: Int -> RestoreObjectTier -> ShowS
$cshow :: RestoreObjectTier -> String
show :: RestoreObjectTier -> String
$cshowList :: [RestoreObjectTier] -> ShowS
showList :: [RestoreObjectTier] -> ShowS
Show)

data RestoreObjectLifetimeDays = RestoreObjectLifetimeDays Integer
  deriving (Int -> RestoreObjectLifetimeDays -> ShowS
[RestoreObjectLifetimeDays] -> ShowS
RestoreObjectLifetimeDays -> String
(Int -> RestoreObjectLifetimeDays -> ShowS)
-> (RestoreObjectLifetimeDays -> String)
-> ([RestoreObjectLifetimeDays] -> ShowS)
-> Show RestoreObjectLifetimeDays
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RestoreObjectLifetimeDays -> ShowS
showsPrec :: Int -> RestoreObjectLifetimeDays -> ShowS
$cshow :: RestoreObjectLifetimeDays -> String
show :: RestoreObjectLifetimeDays -> String
$cshowList :: [RestoreObjectLifetimeDays] -> ShowS
showList :: [RestoreObjectLifetimeDays] -> ShowS
Show)

restoreObject :: Bucket -> T.Text -> RestoreObjectTier -> RestoreObjectLifetimeDays -> RestoreObject
restoreObject :: Object
-> Object
-> RestoreObjectTier
-> RestoreObjectLifetimeDays
-> RestoreObject
restoreObject Object
bucket Object
obj RestoreObjectTier
tier RestoreObjectLifetimeDays
lifetime = Object
-> Object
-> Maybe Object
-> RestoreObjectTier
-> RestoreObjectLifetimeDays
-> RestoreObject
RestoreObject Object
obj Object
bucket Maybe Object
forall a. Maybe a
Nothing RestoreObjectTier
tier RestoreObjectLifetimeDays
lifetime

data RestoreObjectResponse
  = RestoreObjectAccepted
  | RestoreObjectAlreadyRestored
  | RestoreObjectAlreadyInProgress
  deriving (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
$cshowsPrec :: Int -> RestoreObjectResponse -> ShowS
showsPrec :: Int -> RestoreObjectResponse -> ShowS
$cshow :: RestoreObjectResponse -> String
show :: RestoreObjectResponse -> String
$cshowList :: [RestoreObjectResponse] -> ShowS
showList :: [RestoreObjectResponse] -> ShowS
Show)

-- | ServiceConfiguration: 'S3Configuration'
instance SignQuery RestoreObject where
    type ServiceConfiguration RestoreObject = S3Configuration
    signQuery :: forall queryType.
RestoreObject
-> ServiceConfiguration RestoreObject queryType
-> SignatureData
-> SignedQuery
signQuery RestoreObject {Maybe Object
Object
RestoreObjectLifetimeDays
RestoreObjectTier
roObjectName :: RestoreObject -> Object
roBucket :: RestoreObject -> Object
roVersionId :: RestoreObject -> Maybe Object
roTier :: RestoreObject -> RestoreObjectTier
roObjectLifetimeDays :: RestoreObject -> RestoreObjectLifetimeDays
roObjectName :: Object
roBucket :: Object
roVersionId :: Maybe Object
roTier :: RestoreObjectTier
roObjectLifetimeDays :: RestoreObjectLifetimeDays
..} = S3Query
-> S3Configuration queryType -> SignatureData -> SignedQuery
forall qt.
S3Query -> S3Configuration qt -> SignatureData -> SignedQuery
s3SignQuery S3Query
      { s3QMethod :: Method
s3QMethod = Method
Post
      , s3QBucket :: Maybe ByteString
s3QBucket = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Object -> ByteString
T.encodeUtf8 Object
roBucket
      , s3QObject :: Maybe ByteString
s3QObject = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Object -> ByteString
T.encodeUtf8 Object
roObjectName
      , s3QSubresources :: Query
s3QSubresources = [Maybe (ByteString, Maybe Object)] -> Query
forall a. QueryLike a => a -> Query
HTTP.toQuery
         [ (ByteString, Maybe Object) -> Maybe (ByteString, Maybe Object)
forall a. a -> Maybe a
Just ( ByteString
"restore" :: B8.ByteString, Maybe Object
forall a. Maybe a
Nothing :: Maybe T.Text)
         , case Maybe Object
roVersionId of
           Maybe Object
Nothing -> Maybe (ByteString, Maybe Object)
forall a. Maybe a
Nothing
           Just Object
v -> (ByteString, Maybe Object) -> Maybe (ByteString, Maybe Object)
forall a. a -> Maybe a
Just (ByteString
"versionId" :: B8.ByteString, Object -> Maybe Object
forall a. a -> Maybe a
Just Object
v)
         ]
      , s3QQuery :: Query
s3QQuery = []
      , s3QContentType :: Maybe ByteString
s3QContentType = Maybe ByteString
forall a. Maybe a
Nothing
      , s3QContentMd5 :: Maybe (Digest MD5)
s3QContentMd5 = Maybe (Digest MD5)
forall a. Maybe a
Nothing
      , s3QAmzHeaders :: RequestHeaders
s3QAmzHeaders = []
      , s3QOtherHeaders :: RequestHeaders
s3QOtherHeaders = []
      , s3QRequestBody :: Maybe RequestBody
s3QRequestBody = (RequestBody -> Maybe RequestBody
forall a. a -> Maybe a
Just (RequestBody -> Maybe RequestBody)
-> (Document -> RequestBody) -> Document -> Maybe RequestBody
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> RequestBody
HTTP.RequestBodyLBS (ByteString -> RequestBody)
-> (Document -> ByteString) -> Document -> RequestBody
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RenderSettings -> Document -> ByteString
XML.renderLBS RenderSettings
forall a. Default a => a
XML.def)
         XML.Document
          { documentPrologue :: Prologue
XML.documentPrologue = [Miscellaneous] -> Maybe Doctype -> [Miscellaneous] -> Prologue
XML.Prologue [] Maybe Doctype
forall a. Maybe a
Nothing []
          , documentRoot :: Element
XML.documentRoot = XML.Element
            { elementName :: Name
XML.elementName = Name
"{http://s3.amazonaws.com/doc/2006-03-01/}RestoreRequest"
            , elementAttributes :: Map Name Object
XML.elementAttributes = Map Name Object
forall k a. Map k a
M.empty
            , elementNodes :: [Node]
XML.elementNodes =
              [ Element -> Node
XML.NodeElement (XML.Element
                { elementName :: Name
XML.elementName = Name
"{http://s3.amazonaws.com/doc/2006-03-01/}Days"
                , elementAttributes :: Map Name Object
XML.elementAttributes = Map Name Object
forall k a. Map k a
M.empty
                , elementNodes :: [Node]
XML.elementNodes = case RestoreObjectLifetimeDays
roObjectLifetimeDays of
                        RestoreObjectLifetimeDays Integer
n -> [Object -> Node
XML.NodeContent (String -> Object
T.pack (Integer -> String
forall a. Show a => a -> String
show Integer
n))]
                })
              , Element -> Node
XML.NodeElement (XML.Element
                { elementName :: Name
XML.elementName = Name
"{http://s3.amazonaws.com/doc/2006-03-01/}GlacierJobParameters"
                , elementAttributes :: Map Name Object
XML.elementAttributes = Map Name Object
forall k a. Map k a
M.empty
                , elementNodes :: [Node]
XML.elementNodes =
                  [ Element -> Node
XML.NodeElement (XML.Element
                    { elementName :: Name
XML.elementName = Name
"{http://s3.amazonaws.com/doc/2006-03-01/}Tier"
                    , elementAttributes :: Map Name Object
XML.elementAttributes = Map Name Object
forall k a. Map k a
M.empty
                    , elementNodes :: [Node]
XML.elementNodes = case RestoreObjectTier
roTier of
                      RestoreObjectTier
RestoreObjectTierExpedited -> [Object -> Node
XML.NodeContent Object
"Expedited"]
                      RestoreObjectTier
RestoreObjectTierStandard ->  [Object -> Node
XML.NodeContent Object
"Standard"]
                      RestoreObjectTier
RestoreObjectTierBulk ->      [Object -> Node
XML.NodeContent Object
"Bulk"] 
                    })
                  ]
                })
              ]
            }
          , documentEpilogue :: [Miscellaneous]
XML.documentEpilogue = []
          }
      }

instance ResponseConsumer RestoreObject RestoreObjectResponse where
    type ResponseMetadata RestoreObjectResponse = S3Metadata
    responseConsumer :: Request
-> RestoreObject
-> IORef (ResponseMetadata RestoreObjectResponse)
-> HTTPResponseConsumer RestoreObjectResponse
responseConsumer Request
httpReq RestoreObject
_ IORef (ResponseMetadata RestoreObjectResponse)
_ Response (ConduitM () ByteString (ResourceT IO) ())
resp
        | Status
status Status -> Status -> Bool
forall a. Eq a => a -> a -> Bool
== Status
HTTP.status202 = RestoreObjectResponse -> ResourceT IO RestoreObjectResponse
forall a. a -> ResourceT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return RestoreObjectResponse
RestoreObjectAccepted
        | Status
status Status -> Status -> Bool
forall a. Eq a => a -> a -> Bool
== Status
HTTP.status200 = RestoreObjectResponse -> ResourceT IO RestoreObjectResponse
forall a. a -> ResourceT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return RestoreObjectResponse
RestoreObjectAlreadyRestored
        | Status
status Status -> Status -> Bool
forall a. Eq a => a -> a -> Bool
== Status
HTTP.status409 = RestoreObjectResponse -> ResourceT IO RestoreObjectResponse
forall a. a -> ResourceT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return RestoreObjectResponse
RestoreObjectAlreadyInProgress
        | Bool
otherwise = Request -> HTTPResponseConsumer RestoreObjectResponse
forall (m :: * -> *) a.
MonadThrow m =>
Request -> Response (ConduitM () ByteString m ()) -> m a
throwStatusCodeException Request
httpReq Response (ConduitM () ByteString (ResourceT IO) ())
resp
      where
        status :: Status
status = Response (ConduitM () ByteString (ResourceT IO) ()) -> Status
forall body. Response body -> Status
HTTP.responseStatus Response (ConduitM () ByteString (ResourceT IO) ())
resp

instance Transaction RestoreObject RestoreObjectResponse

instance AsMemoryResponse RestoreObjectResponse where
    type MemoryResponse RestoreObjectResponse = RestoreObjectResponse
    loadToMemory :: RestoreObjectResponse
-> ResourceT IO (MemoryResponse RestoreObjectResponse)
loadToMemory = RestoreObjectResponse
-> ResourceT IO (MemoryResponse RestoreObjectResponse)
RestoreObjectResponse -> ResourceT IO RestoreObjectResponse
forall a. a -> ResourceT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return