# IT Lab Content Service
> Diese Library funktioniert nur mit NestJs

[![npm version](https://img.shields.io/npm/v/itlab-content-service.svg?style=flat-square)](https://www.npmjs.org/package/itlab-content-service)
[![install size](https://packagephobia.now.sh/badge?p=itlab-content-service)](https://packagephobia.now.sh/result?p=itlab-content-service)
[![npm downloads](https://img.shields.io/npm/dm/itlab-content-service.svg?style=flat-square)](http://npm-stat.com/charts.html?package=itlab-content-service)
[![jsdelivr](https://data.jsdelivr.com/v1/package/npm/itlab-content-service/badge?style=rounded)](https://www.jsdelivr.com/package/npm/itlab-content-service)

## Content module

[Axios](https://github.com/axios/axios) is richly featured HTTP client package that is widely used. This package wraps Axios and exposes it via the built-in `ContentModule`. The `ContentModule` exports the `ContentService` class, which exposes methods to perform HTTP requests to the [IT Lab Content Service](https://services.svi-itlab.com/content/api/).

### Installation

To begin using it, we first install the required dependency.

```bash
yarn add itlab-content-service
```

### Getting started

Once the installation process is complete, to use the `ContentService`, first import `ContentModule`.

```typescript
@Module({
  imports: [ContentModule],
  providers: [NewsService],
})
export class NewsModule {}
```

Next, inject `ContentService` using normal constructor injection.

> **Hint** `ContentModule` and `ContentService` are imported from `itlab-content-service` package.

```typescript
@Injectable()
export class NewsService {
  constructor(private readonly contentService: ContentService) {}
}
```

### Configuration

To configure the underlying service instance, pass an optional options object to the `register()` method of `ContentModule` when importing it. This options object will be passed directly to the underlying service constructor.

```typescript
@Module({
  imports: [
    ContentModule.register({
      token: "itlab token",
      target: "news",
    }),
  ],
  providers: [NewsService],
})
export class NewsModule {}
```

### Async configuration

When you need to pass module options asynchronously instead of statically, use the `registerAsync()` method. As with most dynamic modules, this package provides several techniques to deal with async configuration.

One technique is to use a factory function:

```typescript
ContentModule.registerAsync({
  useFactory: () => ({
    token: "itlab token",
    target: "news",
  }),
});
```

Like other factory providers, our factory function can be [async](https://docs.nestjs.com/fundamentals/custom-providers#factory-providers-usefactory) and can inject dependencies through `inject`.

```typescript
ContentModule.registerAsync({
  imports: [ConfigModule],
  useFactory: (configService: ConfigService) => ({
    token: configService.get<string>('K8S_TOKEN'),
    target: "news",
  }),
  inject: [ConfigService],
});
```

Alternatively, you can configure the `ContentModule` using a class instead of a factory, as shown below.

```typescript
ContentModule.registerAsync({
  useClass: ContentConfigService,
});
```

The construction above instantiates `ContentConfigService` inside `ContentModule`, using it to create an options object. Note that in this example, the `ContentConfigService` has to implement `ContentModuleOptionsFactory` interface as shown below. The `ContentModule` will call the `createContentOptions()` method on the instantiated object of the supplied class.

```typescript
@Injectable()
class ContentConfigService implements ContentModuleOptionsFactory {
  createContentOptions(): ContentModuleOptions {
    return {
      token: "itlab token",
      target: "news",
    };
  }
}
```

If you want to reuse an existing options provider instead of creating a private copy inside the `ContentModule`, use the `useExisting` syntax.

```typescript
ContentModule.registerAsync({
  imports: [ConfigModule],
  useExisting: ContentConfigService,
});
```
