<!-- TOC -->
* [`occ-client` v3](#occ-client-v3)
  * [Creation of the client](#creation-of-the-client)
    * [Without client credentials](#without-client-credentials)
    * [With client credentials](#with-client-credentials)
    * [With password credentials](#with-password-credentials)
  * [Using the client](#using-the-client)
  * [Creating schema from OpenAPI3.0](#creating-schema-from-openapi30)
  * [Using the OAuth2 Client](#using-the-oauth2-client)
<!-- TOC -->

# `occ-client` v3

This package acts as a client for the SAP Commerce OCC that expose the API docs as an OpenAPI3.0 specification.

## Creation of the client

### Without client credentials

In case you don't need access token to be able to operate with the API, you can create the client directly.

```typescript
import {OccClient} from '@e2y/occ-client';
import {paths} from '../../types/occ/schema';

const occClient = await new OccClient(
  new URL('https://localhost:9002/occ/v2/')
).create<paths>();
```

### With client credentials

```typescript
import {OccClient} from '@e2y/occ-client';
import {paths} from '../../types/occ/schema';

const occClient = await new OccClient(
  new URL('https://localhost:9002/occ/v2/'),
  {
    oauthTokenUrl: new URL(
      'https://localhost:9002/authorizationserver/oauth/token'
    ),
    clientId,
    clientSecret
  }
).create<paths>();
```

### With password credentials

Depending on the actions you want to make, you may need to use the password grant type. To do so, you can use the
`password` method.

```typescript
import {OccClient} from '@e2y/occ-client';
import {paths} from '../../types/occ/schema';

const occClient = await new OccClient(
  new URL('https://localhost:9002/occ/v2/'),
  {
    oauthTokenUrl: new URL(
      'https://localhost:9002/authorizationserver/oauth/token'
    ),
    clientId,
    clientSecret,
    username,
    password
  }
).create<paths>();
```

## Using the client

First, you need to specify the paths of the resources you want to use (refer to [Creating schema from OpenAPI3.0](
#creating- schema-from-openapi30)). In case of the OCC-Client, you do this once you instantiate the client.

```typescript
import {OccClient} from '@e2y/occ-client';
// This are the paths you need to import
import {paths} from '../../types/occ/schema';

const occClient = await new OccClient(...).create<paths>()
```

Then, you create the endpoint you want to use.

```typescript
const getCurrencies = fetcher
  .path('/{baseSiteId}/currencies')
  .method('get')
  .create();
```

Finally, you can use the endpoint to get the data you want.

```typescript
const currenciesResponse = await getCurrencies({baseSiteId: 'wololo'});
```

## Creating schema from OpenAPI3.0

You can create the schema of any API that meets the OpenAPI3.0 specification. To do so, you can use the `schema`
package.

```bash
npx openapi-typescript https://myapi.dev/api/v1/openapi.yaml -o ./path/to/my/schema.d.ts
```

You can find more information about this [here](https://openapi-ts.pages.dev/cli/).

## Using the OAuth2 Client

The `OccClient` uses the `OAuth2Client` class to handle the authentication. You can use it directly if you need to
perform actions that are not covered by the `OccClient`.

```typescript
import {OAuth2Client} from '@e2y/occ-client';

const oauth2Client = new OAuth2Client({
  oauthTokenUrl: new URL(
    'https://localhost:9002/authorizationserver/oauth/token'
  ),
  clientId,
  clientSecret,
  username,
  password
});

const {accessToken} = await oauth2Client.getToken();
```
