defmodule ExAws.Operation.S3DeleteAllObjects do
defstruct bucket: nil,
objects: [],
opts: [],
service: :s3
@type t :: %__MODULE__{}
defimpl ExAws.Operation do
def perform(%{bucket: bucket, objects: objects, opts: opts}, config) do
request_fun = fn objects_in_batch ->
bucket
|> ExAws.S3.delete_multiple_objects(objects_in_batch, opts)
|> ExAws.request(config)
end
delete_all_objects(request_fun, objects, opts, [])
end
defp delete_all_objects(_request_fun, [], _opts, acc) do
{:ok, Enum.reverse(acc)}
end
defp delete_all_objects(request_fun, objects, opts, acc) do
{objects, rest} = Enum.split(objects, 1000)
with {:ok, result} <- request_fun.(objects) do
delete_all_objects(request_fun, rest, opts, [result | acc])
end
end
def stream!(%{bucket: bucket, objects: objects, opts: opts}, config) do
objects
|> Stream.chunk_every(1000)
|> Stream.flat_map(fn objects_in_batch ->
bucket
|> ExAws.S3.delete_multiple_objects(objects_in_batch, opts)
|> ExAws.request!(config)
end)
end
end
end