packages feed

aws-0.25.2: Aws/S3/Commands/RestoreObject.hs

{-# 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 { roObjectName :: Object
                  , roBucket :: Bucket
                  , roVersionId :: Maybe T.Text
                  , roTier :: RestoreObjectTier
                  , roObjectLifetimeDays :: RestoreObjectLifetimeDays
                  }
  deriving (Show)

data RestoreObjectTier
  = RestoreObjectTierExpedited
  | RestoreObjectTierStandard
  | RestoreObjectTierBulk
  deriving (Show)

data RestoreObjectLifetimeDays = RestoreObjectLifetimeDays Integer
  deriving (Show)

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

data RestoreObjectResponse
  = RestoreObjectAccepted
  | RestoreObjectAlreadyRestored
  | RestoreObjectAlreadyInProgress
  deriving (Show)

-- | ServiceConfiguration: 'S3Configuration'
instance SignQuery RestoreObject where
    type ServiceConfiguration RestoreObject = S3Configuration
    signQuery RestoreObject {..} = s3SignQuery S3Query
      { s3QMethod = Post
      , s3QBucket = Just $ T.encodeUtf8 roBucket
      , s3QObject = Just $ T.encodeUtf8 roObjectName
      , s3QSubresources = HTTP.toQuery
         [ Just ( "restore" :: B8.ByteString, Nothing :: Maybe T.Text)
         , case roVersionId of
           Nothing -> Nothing
           Just v -> Just ("versionId" :: B8.ByteString, Just v)
         ]
      , s3QQuery = []
      , s3QContentType = Nothing
      , s3QContentMd5 = Nothing
      , s3QAmzHeaders = []
      , s3QOtherHeaders = []
      , s3QRequestBody = (Just . HTTP.RequestBodyLBS . XML.renderLBS XML.def)
         XML.Document
          { XML.documentPrologue = XML.Prologue [] Nothing []
          , XML.documentRoot = XML.Element
            { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}RestoreRequest"
            , XML.elementAttributes = M.empty
            , XML.elementNodes =
              [ XML.NodeElement (XML.Element
                { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}Days"
                , XML.elementAttributes = M.empty
                , XML.elementNodes = case roObjectLifetimeDays of
                        RestoreObjectLifetimeDays n -> [XML.NodeContent (T.pack (show n))]
                })
              , XML.NodeElement (XML.Element
                { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}GlacierJobParameters"
                , XML.elementAttributes = M.empty
                , XML.elementNodes =
                  [ XML.NodeElement (XML.Element
                    { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}Tier"
                    , XML.elementAttributes = M.empty
                    , XML.elementNodes = case roTier of
                      RestoreObjectTierExpedited -> [XML.NodeContent "Expedited"]
                      RestoreObjectTierStandard ->  [XML.NodeContent "Standard"]
                      RestoreObjectTierBulk ->      [XML.NodeContent "Bulk"] 
                    })
                  ]
                })
              ]
            }
          , XML.documentEpilogue = []
          }
      }

instance ResponseConsumer RestoreObject RestoreObjectResponse where
    type ResponseMetadata RestoreObjectResponse = S3Metadata
    responseConsumer httpReq _ _ resp
        | status == HTTP.status202 = return RestoreObjectAccepted
        | status == HTTP.status200 = return RestoreObjectAlreadyRestored
        | status == HTTP.status409 = return RestoreObjectAlreadyInProgress
        | otherwise = throwStatusCodeException httpReq resp
      where
        status = HTTP.responseStatus resp

instance Transaction RestoreObject RestoreObjectResponse

instance AsMemoryResponse RestoreObjectResponse where
    type MemoryResponse RestoreObjectResponse = RestoreObjectResponse
    loadToMemory = return