Skip to content

Commit b0158af

Browse files
committed
feat: implement payload builder
1 parent b0221c8 commit b0158af

File tree

3 files changed

+58
-26
lines changed

3 files changed

+58
-26
lines changed

lib/builders/http-request.builder.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { type PathVariableBuilder } from "./path-variable.builder";
2-
import { type RequestBodyBuilder } from "./request-body.builder";
3-
import { type RequestFormBuilder } from "./request-form.builder";
2+
import { PayloadBuilder } from "./payload.builder";
43
import { type RequestHeaderBuilder } from "./request-header.builder";
54
import { type RequestParamBuilder } from "./request-param.builder";
65
import { UrlBuilder } from "./url.builder";
@@ -17,9 +16,8 @@ export class HttpRequestBuilder {
1716
private baseUrl = "";
1817
private readonly pathVariableBuilder?: PathVariableBuilder;
1918
private readonly requestParamBuilder?: RequestParamBuilder;
20-
private readonly requestBodyBuilder?: RequestBodyBuilder;
21-
private readonly requestFormBuilder?: RequestFormBuilder;
2219
private readonly requestHeaderBuilder?: RequestHeaderBuilder;
20+
private readonly payloadBuilder: PayloadBuilder;
2321

2422
constructor(
2523
readonly target: object,
@@ -29,31 +27,34 @@ export class HttpRequestBuilder {
2927
) {
3028
this.pathVariableBuilder = this.getMetadata(PATH_VARIABLE_METADATA);
3129
this.requestParamBuilder = this.getMetadata(REQUEST_PARAM_METADATA);
32-
this.requestBodyBuilder = this.getMetadata(REQUEST_BODY_METADATA);
33-
this.requestFormBuilder = this.getMetadata(REQUEST_FORM_METADATA);
3430
this.requestHeaderBuilder = this.getMetadata(REQUEST_HEADER_METADATA);
31+
this.payloadBuilder = new PayloadBuilder(
32+
this.getMetadata(REQUEST_BODY_METADATA),
33+
this.getMetadata(REQUEST_FORM_METADATA)
34+
);
3535
}
3636

3737
setBaseUrl(baseUrl: string): void {
3838
this.baseUrl = baseUrl;
3939
}
4040

4141
build(args: any[]): Request {
42-
const payload =
43-
this.requestBodyBuilder?.build(args) ??
44-
this.requestFormBuilder?.build(args);
4542
const urlBuilder = new UrlBuilder(
4643
this.baseUrl,
4744
this.url,
4845
args,
4946
this.pathVariableBuilder,
5047
this.requestParamBuilder
5148
);
49+
const payload = this.payloadBuilder.build(args);
5250
const headers = this.requestHeaderBuilder?.build(args);
5351

5452
return new Request(urlBuilder.build(), {
5553
method: this.method,
56-
headers,
54+
headers: {
55+
...headers,
56+
...this.payloadBuilder.contentType,
57+
},
5758
body: payload,
5859
});
5960
}

lib/builders/payload.builder.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { type RequestBodyBuilder } from "./request-body.builder";
2+
import { type RequestFormBuilder } from "./request-form.builder";
3+
4+
export class PayloadBuilder {
5+
constructor(
6+
private readonly requestBodyBuilder?: RequestBodyBuilder,
7+
private readonly requestFormBuilder?: RequestFormBuilder
8+
) {}
9+
10+
get contentType(): { "Content-Type": string } | undefined {
11+
if (this.requestBodyBuilder != null) {
12+
return { "Content-Type": "application/json" };
13+
}
14+
15+
if (this.requestFormBuilder != null) {
16+
return { "Content-Type": "application/x-www-form-urlencoded" };
17+
}
18+
19+
return undefined;
20+
}
21+
22+
build(args: any[]): BodyInit | undefined {
23+
return (
24+
this.requestBodyBuilder?.build(args) ??
25+
this.requestFormBuilder?.build(args)
26+
);
27+
}
28+
}

lib/node-fetch.injector.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,36 @@ export class NodeFetchInjector implements OnModuleInit {
1717
const httpProviders = this.getHttpProviders();
1818

1919
httpProviders.forEach((wrapper) => {
20-
const prototype = wrapper.metatype.prototype;
2120
const baseUrl: string | undefined = Reflect.getMetadata(
2221
HTTP_INTERFACE_METADATA,
23-
prototype
22+
wrapper.metatype.prototype
2423
);
2524

2625
if (baseUrl == null) {
2726
return;
2827
}
2928

30-
this.metadataScanner
31-
.getAllMethodNames(prototype)
32-
.forEach((methodName) => {
33-
const httpRequestBuilder: HttpRequestBuilder | undefined =
34-
Reflect.getMetadata(HTTP_EXCHANGE_METADATA, prototype, methodName);
29+
this.wrapMethods(wrapper, baseUrl);
30+
});
31+
}
32+
33+
private wrapMethods(wrapper: InstanceWrapper, baseUrl: string): void {
34+
const prototype = wrapper.metatype.prototype;
3535

36-
if (httpRequestBuilder == null) {
37-
return;
38-
}
36+
this.metadataScanner.getAllMethodNames(prototype).forEach((methodName) => {
37+
const httpRequestBuilder: HttpRequestBuilder | undefined =
38+
Reflect.getMetadata(HTTP_EXCHANGE_METADATA, prototype, methodName);
39+
40+
if (httpRequestBuilder == null) {
41+
return;
42+
}
3943

40-
httpRequestBuilder.setBaseUrl(baseUrl);
44+
httpRequestBuilder.setBaseUrl(baseUrl);
4145

42-
wrapper.instance[methodName] = async (...args: never[]) =>
43-
await this.httpClient
44-
.request(httpRequestBuilder.build(args))
45-
.then(async (response) => await response.json());
46-
});
46+
wrapper.instance[methodName] = async (...args: never[]) =>
47+
await this.httpClient
48+
.request(httpRequestBuilder.build(args))
49+
.then(async (response) => await response.json());
4750
});
4851
}
4952

0 commit comments

Comments
 (0)