module Network.Minio.ListOps where
import qualified Data.Conduit as C
import qualified Data.Conduit.Combinators as CC
import qualified Data.Conduit.List as CL
import Network.Minio.Data
( Bucket,
ListObjectsResult
( lorCPrefixes,
lorHasMore,
lorNextToken,
lorObjects
),
ListObjectsV1Result
( lorCPrefixes',
lorHasMore',
lorNextMarker,
lorObjects'
),
ListPartsResult (lprHasMore, lprNextPart, lprParts),
ListUploadsResult
( lurHasMore,
lurNextKey,
lurNextUpload,
lurUploads
),
Minio,
Object,
ObjectInfo,
ObjectPartInfo (opiSize),
UploadId,
UploadInfo (UploadInfo),
)
import Network.Minio.S3API
( listIncompleteParts',
listIncompleteUploads',
listObjects',
listObjectsV1',
)
data ListItem
= ListItemObject ObjectInfo
| ListItemPrefix Text
deriving stock (Int -> ListItem -> ShowS
[ListItem] -> ShowS
ListItem -> String
(Int -> ListItem -> ShowS)
-> (ListItem -> String) -> ([ListItem] -> ShowS) -> Show ListItem
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ListItem] -> ShowS
$cshowList :: [ListItem] -> ShowS
show :: ListItem -> String
$cshow :: ListItem -> String
showsPrec :: Int -> ListItem -> ShowS
$cshowsPrec :: Int -> ListItem -> ShowS
Show, ListItem -> ListItem -> Bool
(ListItem -> ListItem -> Bool)
-> (ListItem -> ListItem -> Bool) -> Eq ListItem
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ListItem -> ListItem -> Bool
$c/= :: ListItem -> ListItem -> Bool
== :: ListItem -> ListItem -> Bool
$c== :: ListItem -> ListItem -> Bool
Eq)
listObjects :: Bucket -> Maybe Text -> Bool -> C.ConduitM () ListItem Minio ()
listObjects :: Bucket -> Maybe Bucket -> Bool -> ConduitM () ListItem Minio ()
listObjects Bucket
bucket Maybe Bucket
prefix Bool
recurse = Maybe Bucket -> ConduitM () ListItem Minio ()
loop Maybe Bucket
forall a. Maybe a
Nothing
where
loop :: Maybe Text -> C.ConduitM () ListItem Minio ()
loop :: Maybe Bucket -> ConduitM () ListItem Minio ()
loop Maybe Bucket
nextToken = do
let delimiter :: Maybe Bucket
delimiter = Maybe Bucket -> Maybe Bucket -> Bool -> Maybe Bucket
forall a. a -> a -> Bool -> a
bool (Bucket -> Maybe Bucket
forall a. a -> Maybe a
Just Bucket
"/") Maybe Bucket
forall a. Maybe a
Nothing Bool
recurse
ListObjectsResult
res <- Minio ListObjectsResult
-> ConduitT () ListItem Minio ListObjectsResult
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Minio ListObjectsResult
-> ConduitT () ListItem Minio ListObjectsResult)
-> Minio ListObjectsResult
-> ConduitT () ListItem Minio ListObjectsResult
forall a b. (a -> b) -> a -> b
$ Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Int
-> Minio ListObjectsResult
listObjects' Bucket
bucket Maybe Bucket
prefix Maybe Bucket
nextToken Maybe Bucket
delimiter Maybe Int
forall a. Maybe a
Nothing
[ListItem] -> ConduitM () ListItem Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([ListItem] -> ConduitM () ListItem Minio ())
-> [ListItem] -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$ (ObjectInfo -> ListItem) -> [ObjectInfo] -> [ListItem]
forall a b. (a -> b) -> [a] -> [b]
map ObjectInfo -> ListItem
ListItemObject ([ObjectInfo] -> [ListItem]) -> [ObjectInfo] -> [ListItem]
forall a b. (a -> b) -> a -> b
$ ListObjectsResult -> [ObjectInfo]
lorObjects ListObjectsResult
res
Bool
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
recurse (ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ())
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
[ListItem] -> ConduitM () ListItem Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([ListItem] -> ConduitM () ListItem Minio ())
-> [ListItem] -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
(Bucket -> ListItem) -> [Bucket] -> [ListItem]
forall a b. (a -> b) -> [a] -> [b]
map Bucket -> ListItem
ListItemPrefix ([Bucket] -> [ListItem]) -> [Bucket] -> [ListItem]
forall a b. (a -> b) -> a -> b
$
ListObjectsResult -> [Bucket]
lorCPrefixes ListObjectsResult
res
Bool
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ListObjectsResult -> Bool
lorHasMore ListObjectsResult
res) (ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ())
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
Maybe Bucket -> ConduitM () ListItem Minio ()
loop (ListObjectsResult -> Maybe Bucket
lorNextToken ListObjectsResult
res)
listObjectsV1 ::
Bucket ->
Maybe Text ->
Bool ->
C.ConduitM () ListItem Minio ()
listObjectsV1 :: Bucket -> Maybe Bucket -> Bool -> ConduitM () ListItem Minio ()
listObjectsV1 Bucket
bucket Maybe Bucket
prefix Bool
recurse = Maybe Bucket -> ConduitM () ListItem Minio ()
loop Maybe Bucket
forall a. Maybe a
Nothing
where
loop :: Maybe Text -> C.ConduitM () ListItem Minio ()
loop :: Maybe Bucket -> ConduitM () ListItem Minio ()
loop Maybe Bucket
nextMarker = do
let delimiter :: Maybe Bucket
delimiter = Maybe Bucket -> Maybe Bucket -> Bool -> Maybe Bucket
forall a. a -> a -> Bool -> a
bool (Bucket -> Maybe Bucket
forall a. a -> Maybe a
Just Bucket
"/") Maybe Bucket
forall a. Maybe a
Nothing Bool
recurse
ListObjectsV1Result
res <- Minio ListObjectsV1Result
-> ConduitT () ListItem Minio ListObjectsV1Result
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Minio ListObjectsV1Result
-> ConduitT () ListItem Minio ListObjectsV1Result)
-> Minio ListObjectsV1Result
-> ConduitT () ListItem Minio ListObjectsV1Result
forall a b. (a -> b) -> a -> b
$ Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Int
-> Minio ListObjectsV1Result
listObjectsV1' Bucket
bucket Maybe Bucket
prefix Maybe Bucket
nextMarker Maybe Bucket
delimiter Maybe Int
forall a. Maybe a
Nothing
[ListItem] -> ConduitM () ListItem Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([ListItem] -> ConduitM () ListItem Minio ())
-> [ListItem] -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$ (ObjectInfo -> ListItem) -> [ObjectInfo] -> [ListItem]
forall a b. (a -> b) -> [a] -> [b]
map ObjectInfo -> ListItem
ListItemObject ([ObjectInfo] -> [ListItem]) -> [ObjectInfo] -> [ListItem]
forall a b. (a -> b) -> a -> b
$ ListObjectsV1Result -> [ObjectInfo]
lorObjects' ListObjectsV1Result
res
Bool
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
recurse (ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ())
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
[ListItem] -> ConduitM () ListItem Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([ListItem] -> ConduitM () ListItem Minio ())
-> [ListItem] -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
(Bucket -> ListItem) -> [Bucket] -> [ListItem]
forall a b. (a -> b) -> [a] -> [b]
map Bucket -> ListItem
ListItemPrefix ([Bucket] -> [ListItem]) -> [Bucket] -> [ListItem]
forall a b. (a -> b) -> a -> b
$
ListObjectsV1Result -> [Bucket]
lorCPrefixes' ListObjectsV1Result
res
Bool
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ListObjectsV1Result -> Bool
lorHasMore' ListObjectsV1Result
res) (ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ())
-> ConduitM () ListItem Minio () -> ConduitM () ListItem Minio ()
forall a b. (a -> b) -> a -> b
$
Maybe Bucket -> ConduitM () ListItem Minio ()
loop (ListObjectsV1Result -> Maybe Bucket
lorNextMarker ListObjectsV1Result
res)
listIncompleteUploads ::
Bucket ->
Maybe Text ->
Bool ->
C.ConduitM () UploadInfo Minio ()
listIncompleteUploads :: Bucket -> Maybe Bucket -> Bool -> ConduitM () UploadInfo Minio ()
listIncompleteUploads Bucket
bucket Maybe Bucket
prefix Bool
recurse = Maybe Bucket -> Maybe Bucket -> ConduitM () UploadInfo Minio ()
loop Maybe Bucket
forall a. Maybe a
Nothing Maybe Bucket
forall a. Maybe a
Nothing
where
loop :: Maybe Text -> Maybe Text -> C.ConduitM () UploadInfo Minio ()
loop :: Maybe Bucket -> Maybe Bucket -> ConduitM () UploadInfo Minio ()
loop Maybe Bucket
nextKeyMarker Maybe Bucket
nextUploadIdMarker = do
let delimiter :: Maybe Bucket
delimiter = Maybe Bucket -> Maybe Bucket -> Bool -> Maybe Bucket
forall a. a -> a -> Bool -> a
bool (Bucket -> Maybe Bucket
forall a. a -> Maybe a
Just Bucket
"/") Maybe Bucket
forall a. Maybe a
Nothing Bool
recurse
ListUploadsResult
res <-
Minio ListUploadsResult
-> ConduitT () UploadInfo Minio ListUploadsResult
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Minio ListUploadsResult
-> ConduitT () UploadInfo Minio ListUploadsResult)
-> Minio ListUploadsResult
-> ConduitT () UploadInfo Minio ListUploadsResult
forall a b. (a -> b) -> a -> b
$
Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Maybe Int
-> Minio ListUploadsResult
listIncompleteUploads'
Bucket
bucket
Maybe Bucket
prefix
Maybe Bucket
delimiter
Maybe Bucket
nextKeyMarker
Maybe Bucket
nextUploadIdMarker
Maybe Int
forall a. Maybe a
Nothing
[Int64]
aggrSizes <- Minio [Int64] -> ConduitT () UploadInfo Minio [Int64]
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Minio [Int64] -> ConduitT () UploadInfo Minio [Int64])
-> Minio [Int64] -> ConduitT () UploadInfo Minio [Int64]
forall a b. (a -> b) -> a -> b
$
[(Bucket, Bucket, UTCTime)]
-> ((Bucket, Bucket, UTCTime) -> Minio Int64) -> Minio [Int64]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (ListUploadsResult -> [(Bucket, Bucket, UTCTime)]
lurUploads ListUploadsResult
res) (((Bucket, Bucket, UTCTime) -> Minio Int64) -> Minio [Int64])
-> ((Bucket, Bucket, UTCTime) -> Minio Int64) -> Minio [Int64]
forall a b. (a -> b) -> a -> b
$ \(Bucket
uKey, Bucket
uId, UTCTime
_) -> do
[ObjectPartInfo]
partInfos <-
ConduitT () Void Minio [ObjectPartInfo] -> Minio [ObjectPartInfo]
forall (m :: * -> *) r. Monad m => ConduitT () Void m r -> m r
C.runConduit (ConduitT () Void Minio [ObjectPartInfo] -> Minio [ObjectPartInfo])
-> ConduitT () Void Minio [ObjectPartInfo]
-> Minio [ObjectPartInfo]
forall a b. (a -> b) -> a -> b
$
Bucket -> Bucket -> Bucket -> ConduitM () ObjectPartInfo Minio ()
listIncompleteParts Bucket
bucket Bucket
uKey Bucket
uId
ConduitM () ObjectPartInfo Minio ()
-> ConduitM ObjectPartInfo Void Minio [ObjectPartInfo]
-> ConduitT () Void Minio [ObjectPartInfo]
forall (m :: * -> *) a b c r.
Monad m =>
ConduitM a b m () -> ConduitM b c m r -> ConduitM a c m r
C..| ConduitM ObjectPartInfo Void Minio [ObjectPartInfo]
forall (m :: * -> *) a o. Monad m => ConduitT a o m [a]
CC.sinkList
Int64 -> Minio Int64
forall (m :: * -> *) a. Monad m => a -> m a
return (Int64 -> Minio Int64) -> Int64 -> Minio Int64
forall a b. (a -> b) -> a -> b
$ (Int64 -> ObjectPartInfo -> Int64)
-> Int64 -> [ObjectPartInfo] -> Int64
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Int64
sizeSofar ObjectPartInfo
p -> ObjectPartInfo -> Int64
opiSize ObjectPartInfo
p Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+ Int64
sizeSofar) Int64
0 [ObjectPartInfo]
partInfos
[UploadInfo] -> ConduitM () UploadInfo Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([UploadInfo] -> ConduitM () UploadInfo Minio ())
-> [UploadInfo] -> ConduitM () UploadInfo Minio ()
forall a b. (a -> b) -> a -> b
$
((Bucket, Bucket, UTCTime) -> Int64 -> UploadInfo)
-> [(Bucket, Bucket, UTCTime)] -> [Int64] -> [UploadInfo]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
( (((Bucket, Bucket, UTCTime), Int64) -> UploadInfo)
-> (Bucket, Bucket, UTCTime) -> Int64 -> UploadInfo
forall a b c. ((a, b) -> c) -> a -> b -> c
curry
( \((Bucket
uKey, Bucket
uId, UTCTime
uInitTime), Int64
size) ->
Bucket -> Bucket -> UTCTime -> Int64 -> UploadInfo
UploadInfo Bucket
uKey Bucket
uId UTCTime
uInitTime Int64
size
)
)
(ListUploadsResult -> [(Bucket, Bucket, UTCTime)]
lurUploads ListUploadsResult
res)
[Int64]
aggrSizes
Bool
-> ConduitM () UploadInfo Minio ()
-> ConduitM () UploadInfo Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ListUploadsResult -> Bool
lurHasMore ListUploadsResult
res) (ConduitM () UploadInfo Minio ()
-> ConduitM () UploadInfo Minio ())
-> ConduitM () UploadInfo Minio ()
-> ConduitM () UploadInfo Minio ()
forall a b. (a -> b) -> a -> b
$
Maybe Bucket -> Maybe Bucket -> ConduitM () UploadInfo Minio ()
loop (ListUploadsResult -> Maybe Bucket
lurNextKey ListUploadsResult
res) (ListUploadsResult -> Maybe Bucket
lurNextUpload ListUploadsResult
res)
listIncompleteParts ::
Bucket ->
Object ->
UploadId ->
C.ConduitM () ObjectPartInfo Minio ()
listIncompleteParts :: Bucket -> Bucket -> Bucket -> ConduitM () ObjectPartInfo Minio ()
listIncompleteParts Bucket
bucket Bucket
object Bucket
uploadId = Maybe Bucket -> ConduitM () ObjectPartInfo Minio ()
loop Maybe Bucket
forall a. Maybe a
Nothing
where
loop :: Maybe Text -> C.ConduitM () ObjectPartInfo Minio ()
loop :: Maybe Bucket -> ConduitM () ObjectPartInfo Minio ()
loop Maybe Bucket
nextPartMarker = do
ListPartsResult
res <-
Minio ListPartsResult
-> ConduitT () ObjectPartInfo Minio ListPartsResult
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Minio ListPartsResult
-> ConduitT () ObjectPartInfo Minio ListPartsResult)
-> Minio ListPartsResult
-> ConduitT () ObjectPartInfo Minio ListPartsResult
forall a b. (a -> b) -> a -> b
$
Bucket
-> Bucket
-> Bucket
-> Maybe Bucket
-> Maybe Bucket
-> Minio ListPartsResult
listIncompleteParts'
Bucket
bucket
Bucket
object
Bucket
uploadId
Maybe Bucket
forall a. Maybe a
Nothing
Maybe Bucket
nextPartMarker
[ObjectPartInfo] -> ConduitM () ObjectPartInfo Minio ()
forall (m :: * -> *) a i. Monad m => [a] -> ConduitT i a m ()
CL.sourceList ([ObjectPartInfo] -> ConduitM () ObjectPartInfo Minio ())
-> [ObjectPartInfo] -> ConduitM () ObjectPartInfo Minio ()
forall a b. (a -> b) -> a -> b
$ ListPartsResult -> [ObjectPartInfo]
lprParts ListPartsResult
res
Bool
-> ConduitM () ObjectPartInfo Minio ()
-> ConduitM () ObjectPartInfo Minio ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ListPartsResult -> Bool
lprHasMore ListPartsResult
res) (ConduitM () ObjectPartInfo Minio ()
-> ConduitM () ObjectPartInfo Minio ())
-> ConduitM () ObjectPartInfo Minio ()
-> ConduitM () ObjectPartInfo Minio ()
forall a b. (a -> b) -> a -> b
$
Maybe Bucket -> ConduitM () ObjectPartInfo Minio ()
loop (Int -> Bucket
forall b a. (Show a, IsString b) => a -> b
show (Int -> Bucket) -> Maybe Int -> Maybe Bucket
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListPartsResult -> Maybe Int
lprNextPart ListPartsResult
res)