module Aws.S3.Commands.GetBucketObjectVersions
where
import Aws.Core
import Aws.S3.Core
import Control.Applicative
import Data.ByteString.Char8 ()
import Data.Maybe
import Text.XML.Cursor (($/), (&|), (&//))
import qualified Data.ByteString.Char8 as B8
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Traversable
import Prelude
import qualified Network.HTTP.Types as HTTP
import qualified Text.XML.Cursor as Cu
import qualified Text.XML as XML
data GetBucketObjectVersions
= GetBucketObjectVersions {
gbovBucket :: Bucket
, gbovDelimiter :: Maybe T.Text
, gbovKeyMarker :: Maybe T.Text
, gbovMaxKeys :: Maybe Int
, gbovPrefix :: Maybe T.Text
, gbovVersionIdMarker :: Maybe T.Text
}
deriving (Show)
getBucketObjectVersions :: Bucket -> GetBucketObjectVersions
getBucketObjectVersions bucket
= GetBucketObjectVersions {
gbovBucket = bucket
, gbovDelimiter = Nothing
, gbovKeyMarker = Nothing
, gbovMaxKeys = Nothing
, gbovPrefix = Nothing
, gbovVersionIdMarker = Nothing
}
data GetBucketObjectVersionsResponse
= GetBucketObjectVersionsResponse {
gbovrName :: Bucket
, gbovrDelimiter :: Maybe T.Text
, gbovrKeyMarker :: Maybe T.Text
, gbovrMaxKeys :: Maybe Int
, gbovrPrefix :: Maybe T.Text
, gbovrVersionIdMarker :: Maybe T.Text
, gbovrContents :: [ObjectVersionInfo]
, gbovrCommonPrefixes :: [T.Text]
, gbovrIsTruncated :: Bool
, gbovrNextKeyMarker :: Maybe T.Text
, gbovrNextVersionIdMarker :: Maybe T.Text
}
deriving (Show)
instance SignQuery GetBucketObjectVersions where
type ServiceConfiguration GetBucketObjectVersions = S3Configuration
signQuery GetBucketObjectVersions {..} = s3SignQuery S3Query {
s3QMethod = Get
, s3QBucket = Just $ T.encodeUtf8 gbovBucket
, s3QObject = Nothing
, s3QSubresources = [ ("versions", Nothing) ]
, s3QQuery = HTTP.toQuery [
("delimiter" :: B8.ByteString ,) <$> gbovDelimiter
, ("key-marker",) <$> gbovKeyMarker
, ("max-keys",) . T.pack . show <$> gbovMaxKeys
, ("prefix",) <$> gbovPrefix
, ("version-id-marker",) <$> gbovVersionIdMarker
]
, s3QContentType = Nothing
, s3QContentMd5 = Nothing
, s3QAmzHeaders = []
, s3QOtherHeaders = []
, s3QRequestBody = Nothing
}
instance ResponseConsumer r GetBucketObjectVersionsResponse where
type ResponseMetadata GetBucketObjectVersionsResponse = S3Metadata
responseConsumer _ _ = s3XmlResponseConsumer parse
where parse cursor
= do name <- force "Missing Name" $ cursor $/ elContent "Name"
let delimiter = listToMaybe $ cursor $/ elContent "Delimiter"
let keyMarker = listToMaybe $ cursor $/ elContent "KeyMarker"
let versionMarker = listToMaybe $ cursor $/ elContent "VersionIdMarker"
maxKeys <- Data.Traversable.sequence . listToMaybe $ cursor $/ elContent "MaxKeys" &| textReadInt
let truncated = maybe True (/= "false") $ listToMaybe $ cursor $/ elContent "IsTruncated"
let nextKeyMarker = listToMaybe $ cursor $/ elContent "NextKeyMarker"
let nextVersionMarker = listToMaybe $ cursor $/ elContent "NextVersionIdMarker"
let prefix = listToMaybe $ cursor $/ elContent "Prefix"
contents <- sequence $ cursor $/ Cu.checkName objectNodeName &| parseObjectVersionInfo
let commonPrefixes = cursor $/ Cu.laxElement "CommonPrefixes" &// Cu.content
return GetBucketObjectVersionsResponse{
gbovrName = name
, gbovrDelimiter = delimiter
, gbovrKeyMarker = keyMarker
, gbovrMaxKeys = maxKeys
, gbovrPrefix = prefix
, gbovrVersionIdMarker = versionMarker
, gbovrContents = contents
, gbovrCommonPrefixes = commonPrefixes
, gbovrIsTruncated = truncated
, gbovrNextKeyMarker = nextKeyMarker
, gbovrNextVersionIdMarker = nextVersionMarker
}
objectNodeName n = let fn = T.toCaseFold $ XML.nameLocalName n
in fn == T.toCaseFold "Version" || fn == T.toCaseFold "DeleteMarker"
instance Transaction GetBucketObjectVersions GetBucketObjectVersionsResponse
instance IteratedTransaction GetBucketObjectVersions GetBucketObjectVersionsResponse where
nextIteratedRequest request response
= case (gbovrIsTruncated response, gbovrNextKeyMarker response, gbovrNextVersionIdMarker response, gbovrContents response) of
(True, Just keyMarker, Just versionMarker, _ ) -> Just $ request { gbovKeyMarker = Just keyMarker, gbovVersionIdMarker = Just versionMarker }
(True, Nothing, Nothing, contents@(_:_)) -> Just $ request { gbovKeyMarker = Just $ oviKey $ last contents, gbovVersionIdMarker = Just $ oviVersionId $ last contents }
(_, _, _, _ ) -> Nothing
instance ListResponse GetBucketObjectVersionsResponse ObjectVersionInfo where
listResponse = gbovrContents
instance AsMemoryResponse GetBucketObjectVersionsResponse where
type MemoryResponse GetBucketObjectVersionsResponse = GetBucketObjectVersionsResponse
loadToMemory = return