Skip to content

Commit

Permalink
feat: add register client module
Browse files Browse the repository at this point in the history
  • Loading branch information
KillWolfVlad committed Jul 8, 2022
1 parent 5a39a66 commit 4bdb934
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 45 deletions.
56 changes: 13 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,69 +36,39 @@ yarn add @byndyusoft/nest-http-client @nestjs/common axios
<summary>1. Create module</summary>

```typescript
import {
DynamicModuleHelper,
TRegisterAsyncOptions,
} from "@byndyusoft/nest-dynamic-module";
import { TRegisterAsyncOptions } from "@byndyusoft/nest-dynamic-module";
import {
HttpClientModule,
IHttpClientOptions,
} from "@byndyusoft/nest-http-client";
import { DynamicModule, Module } from "@nestjs/common";
import { DynamicModule, Global, Module } from "@nestjs/common";
import urlJoin from "proper-url-join";
import qs from "qs";

import { ClientBaseOptionsToken, ClientOptionsToken } from "./tokens";
import { UsersClient } from "./usersClient";
import * as providers from "./providers";

@Global()
@Module({
imports: [
HttpClientModule.registerAsync({
inject: [ClientOptionsToken],
useFactory: (options: IHttpClientOptions) => options,
}),
],
providers: [UsersClient],
exports: [UsersClient],
providers: Object.values(providers),
exports: Object.values(providers),
})
export class ClientModule {
public static registerAsync(
options?: TRegisterAsyncOptions<IHttpClientOptions>,
): DynamicModule {
return DynamicModuleHelper.registerAsync(
{
module: ClientModule,
global: true,
providers: [
{
provide: ClientOptionsToken,
inject: [ClientBaseOptionsToken],
useFactory: (baseOptions: IHttpClientOptions) =>
ClientModule.clientOptionsFactory(baseOptions),
},
],
exports: [ClientOptionsToken],
},
ClientBaseOptionsToken,
return HttpClientModule.registerClientModule(
{ module: ClientModule },
options,
);
}

private static clientOptionsFactory(
baseOptions: IHttpClientOptions,
): IHttpClientOptions {
return {
...baseOptions,
config: {
...baseOptions.config,
baseURL: urlJoin(baseOptions.config?.baseURL as string, "/api/v1"),
(config) => ({
...config,
baseURL: urlJoin(config?.baseURL as string, "/api/v1"),
paramsSerializer: (params) =>
qs.stringify(params, {
skipNulls: true,
arrayFormat: "repeat",
}),
},
};
}),
);
}
}
```
Expand Down
17 changes: 17 additions & 0 deletions src/httpClientBaseOptionsToken.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright 2022 Byndyusoft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

export const HttpClientBaseOptionsToken = Symbol("HttpClientBaseOptionsToken");
36 changes: 34 additions & 2 deletions src/httpClientModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,19 @@ import {
TRegisterAsyncOptions,
} from "@byndyusoft/nest-dynamic-module";
import { DynamicModule, Module } from "@nestjs/common";
import { AxiosRequestConfig } from "axios";

import { HttpClient } from "./httpClient";
import { HttpClientBaseOptionsToken } from "./httpClientBaseOptionsToken";
import { IHttpClientOptions } from "./httpClientOptionsInterface";
import { HttpClientOptionsToken } from "./httpClientOptionsToken";
import { HttpCoreClient } from "./httpCoreClient";

const providers = [HttpCoreClient, HttpClient];

@Module({
providers: [HttpCoreClient, HttpClient],
exports: [HttpCoreClient, HttpClient],
providers,
exports: providers,
})
export class HttpClientModule {
public static registerAsync(
Expand All @@ -41,4 +45,32 @@ export class HttpClientModule {
options,
);
}

public static registerClientModule(
dynamicModule: DynamicModule,
options?: TRegisterAsyncOptions<IHttpClientOptions>,
configFactory?: (config?: AxiosRequestConfig) => AxiosRequestConfig,
): DynamicModule {
return DynamicModuleHelper.registerAsync(
{
...dynamicModule,
providers: [
...providers,
...(dynamicModule.providers ?? []),
{
provide: HttpClientOptionsToken,
inject: [HttpClientBaseOptionsToken],
useFactory: (
baseOptions: IHttpClientOptions,
): IHttpClientOptions => ({
...baseOptions,
config: configFactory?.(baseOptions.config) ?? baseOptions.config,
}),
},
],
},
HttpClientBaseOptionsToken,
options,
);
}
}
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/

export * from "./httpClient";
export * from "./httpClientBaseOptionsToken";
export * from "./httpClientModule";
export * from "./httpClientOptionsInterface";
export * from "./httpClientOptionsToken";
Expand Down

0 comments on commit 4bdb934

Please sign in to comment.