module Network.AWS.Flow.S3
( listObjectsAction
, getObjectAction
, putObjectAction
) where
import Network.AWS.Flow.Prelude hiding ( ByteString, hash, stripPrefix )
import Network.AWS.Flow.Types
import Data.Conduit
import Data.Conduit.List hiding ( concatMap, map, mapMaybe )
import Data.Conduit.Binary
import Data.Text hiding ( concatMap, map )
import Network.AWS.Data.Body
import Network.AWS.Data.Text
import Network.AWS.S3
listObjectsAction :: MonadFlow m => Uid -> m [Text]
listObjectsAction uid = do
timeout' <- asks feTimeout
bucket' <- asks feBucket
prefix <- asks fePrefix
timeout timeout' $ do
rs <- paginate (listObjects (BucketName bucket') &
loPrefix .~ Just (prefix <> "/" <> uid))
$$ consume
return $
mapMaybe (stripPrefix (prefix <> "/" <> uid <> "/") . toText . (^. oKey)) $
concatMap (^. lorsContents) rs
getObjectAction :: MonadFlow m => Uid -> Text -> m Blob
getObjectAction uid key = do
timeout' <- asks feTimeout
bucket' <- asks feBucket
prefix <- asks fePrefix
timeout timeout' $ do
r <- send $ getObject (BucketName bucket') (ObjectKey $ prefix <> "/" <> uid <> "/" <> key)
blob <- sinkBody (r ^. gorsBody) sinkLbs
return (key, blob)
putObjectAction :: MonadFlow m => Uid -> Artifact -> m ()
putObjectAction uid (key, hash, size, blob) = do
timeout' <- asks feTimeout
bucket' <- asks feBucket
prefix <- asks fePrefix
void $ timeout timeout' $
send $ putObject (BucketName bucket') (ObjectKey $ prefix <> "/" <> uid <> "/" <> key) (Hashed $ hashedBody hash size $ sourceLbs blob)