README.md

# BunnyCDN

## Description
BunnyCDN is a simple batteries included HTTP client for the BunnyCDN Storage API. By default, it uses Req as the http client. You can supply your own by implementing the `BunnyCDN.HTTPClient` behaviour. See [https://github.com/quarterpi/bunny_cdn/blob/master/lib/http_client.ex](lib/http_client.ex) for more details.


## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `bunny_cdn` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:bunny_cdn, "~> 0.1.0"}
  ]
end
```
Next, you will need to fetch your dependencies via `mix deps.get`.

Run with iex `iex -S mix`.

Optionally supply the storage endpoint, storage zone, and storage api key as environment variables:
```
BUNNY_STORAGE_API_KEY=my-super-secret-api-key \ 
BUNNY_DEFAULT_ENDPOINT=ny.storage.bunnycdn.com \ 
BUNNY_STORAGE_ZONE=my-test-storage \ 
iex -S mix
```

## Examples
If you load the storage endpoint, storage zone, and storage api keys as environment variables as demonstrated above, you can use the BunnyCDN.Client.new!/0 function to create a new client struct.
```elixir
alias BunnyCDN.Client

client = Client.new!()

# List contents of root directory.
BunnyCDN.get(client, "/")

# List contents of files directory. If it does not exist, the contents of `body` will be []. 
BunnyCDN.get(client, "audio/")

# Download file at "audio/sample.mp3". If the file does not exists, an error touple will be returned with the status code 404. Otherwise the body will contain the binary representation of the file. The `content-type` and `content-length` headers can be used to determine the file's type and size.
BunnyCDN.get(client, "audio/sample.mp3")

# Upload a file. If the directory does not exists, it will be created. The status code will be 201 and the body will contain `%{"HttpCode" => 201, "Message" => "File uploaded."}`.
{:ok, file} = File.read("./sample.mp3")
uri = "audio/sample.mp3"
BunnyCDN.put(client, file, uri) 

# Optionally supply the file name and path separately.
BunnyCDN.put(client, file, "audio", "sample.mp3")

# Delete a file. The response will have the status code 200 and the body will contain {"HttpCode" => 200, "Message" => "File deleted successfuly."}
BunnyCDN.delete(client, "sample.mp3")

# Delete a directory. The response will have the status code 200 and the body will contain {"HttpCode" => 200, "Message" => "File deleted successfuly."}
BunnyCDN.delete(client, "files/")
```

## Acknowledgments
BunnyCDN is inspired by [aws-elixir](https://github.com/aws-beam/aws-elixir/tree/master).


Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/bunny_cdn>.