Behaviour for storage adapters.
@callback delete(file_url :: String.t(), opts :: keyword()) :: {:ok, String.t()} | {:error, any()}
@callback presign(file_key :: String.t(), opts :: keyword()) :: {:ok, String.t()} | {:error, any()}
@callback upload(upload :: map(), opts :: keyword()) :: {:ok, String.t()} | {:error, any()}