README.md

![elixir workflow](https://github.com/bettyblocks/file_storage_api/actions/workflows/elixir.yml/badge.svg)
[![Hex.pm](https://img.shields.io/hexpm/v/file_storage_api.svg)]()
[![Hex Docs](https://img.shields.io/badge/hex-docs-blue.svg)](https://hexdocs.pm/file_storage_api)

# FileStorageApi

Library to be able to upload and manage files to different storage service azure/s3 

## Installation

It can be added to your project by adding

```elixir
def deps do
  [
    {:file_storage_api, "~> 1.0"}
  ]
end
```

Configuration

Ability to set storage engine currently `S3` and `Azure` supported. 
For tests `Mock` can be used with the mox library.
```elixir
config :file_storage_api, :storage_api, engine: Azure
```

S3 configuration (options from ex_aws_s3 library)
```elixir
config :file_storage_api, :s3_config,
  host: "127.0.0.1",
  scheme: "http://",
  port: 9000,
  access_key_id: "admin",
  secret_access_key: "password",
  path_style: true
```

For test S3 can also be mocked by

```elixir
config :file_storage_api, :s3_config, module: AwsMock
```

Azure configuration (options from azure library)
```elixir
config :file_storage_api, :azure_blob,
  account_key: "password",
  account_name: "user",
  environment_suffix: "core.windows.net",
  host: ,
  development: "true" || "false"
```

It will need the package `file` in linux to be able to read mime types and work.

## Dynamic configuration

You can use a map or keyword list to pass a long dynamic configuration in the connection field.

For azure
```elixir
%{
  engine: :azure,
  config: %{
    host: "postfix.example",
    secret_key: "YWNjb3VudF9rZXk=",
    access_key: "amazing"
  }
}
```

For S3
```elixir
%{
  engine: :s3,
  config: %{host: "test.example", secret_key: "test123", access_key: "amazing", scheme: "http://"}
}
```

For mocking you can set the engine to Mock

## Multiple storage accounts

It can be necessary to connect to multiple S3- or Azure-accounts. This can be done by adding multiple connections, each with its own engine. To facilitate testing, it is possible to change the engine per connection.
> :warning: A connection-name **must** end with `_conn`.

---

#### Example

Make a custom-connection, with a S3-engine in development, and a Azure-engine in production.

File: `config/dev.exs`:
```elixir
config :file_storage_api, :custom_conn, engine: :s3

config :file_storage_api, :custom_s3_config,
  host: "127.0.0.1",
  scheme: "http://",
  port: 9000,
  access_key_id: "custom-admin",
  secret_access_key: "custom-password",
  path_style: true
```

File: `config/prod.exs`:
```elixir
config :file_storage_api, :custom_conn, engine: :azure

config :file_storage_api, :custom_azure_blob,
  account_key: "custom-password",
  account_name: "custom-user",
  environment_suffix: "core.windows.net",
  host: ,
  development: "true" || "false"
```