1module Aws.S3.Commands.PutBucketVersioning where
2
3import           Aws.Core
4import           Aws.S3.Core
5import           Network.HTTP.Types (toQuery)
6import qualified Data.Map             as M
7import qualified Data.Text.Encoding   as T
8import qualified Network.HTTP.Conduit as HTTP
9import qualified Text.XML             as XML
10import qualified Data.ByteString.Lazy.Char8 as B8
11
12data VersioningState = VersioningSuspended | VersioningEnabled
13    deriving (Show)
14
15-- | Sets the versioning state of an existing bucket.
16data PutBucketVersioning
17    = PutBucketVersioning
18      { pbvBucket :: Bucket
19      , pbvVersioningConfiguration :: VersioningState
20      }
21    deriving (Show)
22
23putBucketVersioning :: Bucket -> VersioningState -> PutBucketVersioning
24putBucketVersioning = PutBucketVersioning
25
26data PutBucketVersioningResponse
27    = PutBucketVersioningResponse
28    deriving (Show)
29
30-- | ServiceConfiguration: 'S3Configuration'
31instance SignQuery PutBucketVersioning where
32    type ServiceConfiguration PutBucketVersioning = S3Configuration
33
34    signQuery PutBucketVersioning{..} = s3SignQuery $ S3Query
35      { s3QMethod       = Put
36      , s3QBucket       = Just $ T.encodeUtf8 pbvBucket
37      , s3QSubresources = toQuery [("versioning" :: B8.ByteString, Nothing :: Maybe B8.ByteString)]
38      , s3QQuery        = []
39      , s3QContentType  = Nothing
40      , s3QContentMd5   = Nothing
41      , s3QObject       = Nothing
42      , s3QAmzHeaders   = []
43      , s3QOtherHeaders = []
44      , s3QRequestBody  = (Just . HTTP.RequestBodyLBS . XML.renderLBS XML.def)
45         XML.Document
46          { XML.documentPrologue = XML.Prologue [] Nothing []
47          , XML.documentRoot = XML.Element
48            { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}VersioningConfiguration"
49            , XML.elementAttributes = M.empty
50            , XML.elementNodes = [ XML.NodeElement (XML.Element
51              { XML.elementName = "{http://s3.amazonaws.com/doc/2006-03-01/}Status"
52              , XML.elementAttributes = M.empty
53              , XML.elementNodes = case pbvVersioningConfiguration of
54                VersioningSuspended -> [XML.NodeContent "Suspended"]
55                VersioningEnabled ->  [XML.NodeContent "Enabled"]
56              })]
57            }
58          , XML.documentEpilogue = []
59          }
60      }
61
62instance ResponseConsumer r PutBucketVersioningResponse where
63    type ResponseMetadata PutBucketVersioningResponse = S3Metadata
64
65    responseConsumer _ _ = s3ResponseConsumer $ \_ -> return PutBucketVersioningResponse
66
67instance Transaction PutBucketVersioning PutBucketVersioningResponse
68
69instance AsMemoryResponse PutBucketVersioningResponse where
70    type MemoryResponse PutBucketVersioningResponse = PutBucketVersioningResponse
71    loadToMemory = return
72