# Akeneo API client

This is an [Akeneo PIM] API client for Elixir. You'll need an API token which can be retrieved by following the [getting started guide].
In order to get an overview of the available endpoints, look up the [API reference].

[Akeneo PIM]:
[getting started guide]:
[API reference]:

## Installation

The package can be installed by adding `akeneo_api` to your list of dependencies in `mix.exs`:

def deps do
    {:akeneo_api, "~> 0.1.0"}

## Configuration

Start by adding the credentials and connection parameters for `akeneo_api` to your `config/config.exs`:

config :akeneo_api,
    username: "USERNAME_HERE",
    password: "PASSWORD_HERE",
    client_id: "TOKEN_CLIENT_ID",
    secret: "TOKEN_SECRET",
    host: "https://AKENEO_INSTALLATION.tld",
    token_url: "https://AKENEO_INSTALLATION.tld/api/oauth/v1/token"

If you want to see what's going on behind the scenes, enable the `debug` mode of the `oauth2` module:

config :oauth2, debug: true

## Usage

This module uses the Swagger JSON provided by Akeneo to build modules and functions on compile time.
Every endpoint lives under the namespace `AkeneoApi.Endpoint.V1` such as:
iex(1)> AkeneoApi.Endpoint.V1.
AssetCategories                AssetTags                      
Assets                         AssociationTypes               
AttributeGroups                Attributes                     
Categories                     Channels                       
Currencies                     Families                       
Locales                        MeasureFamilies                
MediaFiles                     ProductModels                  
Products                       PublishedProducts              
ReferenceEntities              ReferenceEntitiesMediaFiles

Within this code-generation, every `operationId` of the Swagger specification becomes its own function, while each parameter within the URL-path becomes a mandatory argument of this function.
The generated function's last parameter is an optional Keyword List, transporting `query:` and `body:` parameters.

### Simple example

Get a list of products:

{:ok, product_list} = AkeneoApi.Endpoint.V1.Products.get_products

### Query example

Get a list of products filtered by name:

filter = %{name: [%{operator: "CONTAINS", value: "test", locale: "de_DE", scope: "ecommerce"}]}
{:ok, product_list} = AkeneoApi.Endpoint.V1.Products.get_products(query: [limit: 100, page: 2, search: Jason.encode!(filter)])

Refer to the [API reference] as well as the [filter documentation] to further details.

[API reference]:
[filter documentation]:

### File example

file = "/path/to/file

product = Jason.encode!(%{
  identifier: "product123",
  attribute: "image",
  scope: nil,
  locale: nil

body = {:multipart, [
  {"product", product},
  {:file, file}

AkeneoApi.Endpoint.V1.MediaFiles.post_media_files(body: body)