# @edirect/request

HTTP request utility for eDirect applications. Provides a thin Axios wrapper (`sendRequest`) that automatically resolves service base URLs from the common `config` folder structure, propagates correlation headers (`SessionId`, `QuoteId`), and optionally handles auth service token injection.

## Features

- Auto-resolves service base URL from `node-config` service configuration
- Supports explicit `baseURL` for external services
- Propagates `SessionId` and `QuoteId` correlation headers automatically
- Tokenized request variant for auto-authenticated calls (`sendTokenizedRequest`)
- Full Axios request config pass-through (headers, timeout, etc.)
- CommonJS and TypeScript exports

## Installation

```sh
pnpm add @edirect/request
# or
npm install @edirect/request
```

## Usage

### Basic Usage — Named Service (uses config folder)

```ts
import { sendRequest } from '@edirect/request';

// Service URL is resolved from config/default.yaml under the service name
const response = await sendRequest('entity-service', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
}).request('GET', '/entities/123');
```

The service name resolves to the base URL configured in your `config/` folder (via `node-config`):

```yaml
# config/default.yaml
entity-service:
  url: https://entity-service.internal.example.com
```

### Explicit Base URL — External Services

When the service is not in the config, pass `null` as service name and set `baseURL`:

```ts
import { sendRequest } from '@edirect/request';

const response = await sendRequest(null, {
  baseURL: 'https://auth.bolttechbroker.net',
  headers: {
    Authorization: `Bearer ${token}`,
  },
}).request('POST', '/token', { grant_type: 'client_credentials' });
```

### CommonJS

```js
const { sendRequest } = require('@edirect/request');

const response = await sendRequest('my-service', {
  headers: { Authorization: `Basic ${token}` },
}).request('GET', '/health');
```

### Correlation Header Propagation

```ts
import { sendRequestInstance } from '@edirect/request';

// Set correlation IDs once — all subsequent requests will include them as headers
sendRequestInstance.setIdSendRequest('session-abc-123');
sendRequestInstance.setQuoteIdSendRequest('quote-xyz-456');

// These requests will automatically include SessionId and QuoteId headers
await sendRequestInstance
  .sendRequest('policy-service')
  .request('GET', '/policies');
```

## API

### `sendRequest(service?, options?)`

| Parameter | Type                 | Description                                                                     |
| --------- | -------------------- | ------------------------------------------------------------------------------- |
| `service` | `string \| null`     | Service name to look up in `config/` folder, or `null` to use `options.baseURL` |
| `options` | `AxiosRequestConfig` | Standard Axios request config (headers, timeout, params, etc.)                  |

Returns `{ request: Request }` where `request(method, uri, data?)` executes the HTTP call.

### `Request` method

```ts
request(method: string, uri: string, data?: unknown): Promise<AxiosResponse>
```

### `SendRequest` class

For more control, import the `SendRequest` class directly:

```ts
import { SendRequest } from '@edirect/request';

const client = new SendRequest();
client.setIdSendRequest('session-id');
client.setQuoteIdSendRequest('quote-id');

await client.sendRequest('my-service').request('GET', '/endpoint');
```
