Skip to content

Commit 91a7c76

Browse files
authoredJul 1, 2024··
Merge pull request #2836 from lit26/feature/add-more-apiresponse
feat: add more shorthand api response decorator
2 parents 91a40a3 + 2358cae commit 91a7c76

File tree

2 files changed

+166
-179
lines changed

2 files changed

+166
-179
lines changed
 

‎lib/decorators/api-response.decorator.ts

+85-164
Original file line numberDiff line numberDiff line change
@@ -82,171 +82,92 @@ export function ApiResponse(
8282
};
8383
}
8484

85-
export const ApiOkResponse = (options: ApiResponseOptions = {}) =>
86-
ApiResponse({
87-
...options,
88-
status: HttpStatus.OK
89-
});
90-
91-
export const ApiCreatedResponse = (options: ApiResponseOptions = {}) =>
92-
ApiResponse({
93-
...options,
94-
status: HttpStatus.CREATED
95-
});
96-
97-
export const ApiAcceptedResponse = (options: ApiResponseOptions = {}) =>
98-
ApiResponse({
99-
...options,
100-
status: HttpStatus.ACCEPTED
101-
});
102-
103-
export const ApiNoContentResponse = (options: ApiResponseOptions = {}) =>
104-
ApiResponse({
105-
...options,
106-
status: HttpStatus.NO_CONTENT
107-
});
108-
109-
export const ApiMovedPermanentlyResponse = (options: ApiResponseOptions = {}) =>
110-
ApiResponse({
111-
...options,
112-
status: HttpStatus.MOVED_PERMANENTLY
113-
});
114-
115-
export const ApiFoundResponse = (options: ApiResponseOptions = {}) =>
116-
ApiResponse({
117-
...options,
118-
status: HttpStatus.FOUND
119-
});
120-
121-
export const ApiBadRequestResponse = (options: ApiResponseOptions = {}) =>
122-
ApiResponse({
123-
...options,
124-
status: HttpStatus.BAD_REQUEST
125-
});
126-
127-
export const ApiUnauthorizedResponse = (options: ApiResponseOptions = {}) =>
128-
ApiResponse({
129-
...options,
130-
status: HttpStatus.UNAUTHORIZED
131-
});
132-
133-
export const ApiTooManyRequestsResponse = (options: ApiResponseOptions = {}) =>
134-
ApiResponse({
135-
...options,
136-
status: HttpStatus.TOO_MANY_REQUESTS
137-
});
138-
139-
export const ApiNotFoundResponse = (options: ApiResponseOptions = {}) =>
140-
ApiResponse({
141-
...options,
142-
status: HttpStatus.NOT_FOUND
143-
});
144-
145-
export const ApiInternalServerErrorResponse = (
146-
options: ApiResponseOptions = {}
147-
) =>
148-
ApiResponse({
149-
...options,
150-
status: HttpStatus.INTERNAL_SERVER_ERROR
151-
});
152-
153-
export const ApiBadGatewayResponse = (options: ApiResponseOptions = {}) =>
154-
ApiResponse({
155-
...options,
156-
status: HttpStatus.BAD_GATEWAY
157-
});
158-
159-
export const ApiConflictResponse = (options: ApiResponseOptions = {}) =>
160-
ApiResponse({
161-
...options,
162-
status: HttpStatus.CONFLICT
163-
});
164-
165-
export const ApiForbiddenResponse = (options: ApiResponseOptions = {}) =>
166-
ApiResponse({
167-
...options,
168-
status: HttpStatus.FORBIDDEN
169-
});
170-
171-
export const ApiGatewayTimeoutResponse = (options: ApiResponseOptions = {}) =>
172-
ApiResponse({
173-
...options,
174-
status: HttpStatus.GATEWAY_TIMEOUT
175-
});
176-
177-
export const ApiGoneResponse = (options: ApiResponseOptions = {}) =>
178-
ApiResponse({
179-
...options,
180-
status: HttpStatus.GONE
181-
});
182-
183-
export const ApiMethodNotAllowedResponse = (options: ApiResponseOptions = {}) =>
184-
ApiResponse({
185-
...options,
186-
status: HttpStatus.METHOD_NOT_ALLOWED
187-
});
188-
189-
export const ApiNotAcceptableResponse = (options: ApiResponseOptions = {}) =>
190-
ApiResponse({
191-
...options,
192-
status: HttpStatus.NOT_ACCEPTABLE
193-
});
194-
195-
export const ApiNotImplementedResponse = (options: ApiResponseOptions = {}) =>
196-
ApiResponse({
197-
...options,
198-
status: HttpStatus.NOT_IMPLEMENTED
199-
});
200-
201-
export const ApiPreconditionFailedResponse = (
202-
options: ApiResponseOptions = {}
203-
) =>
204-
ApiResponse({
205-
...options,
206-
status: HttpStatus.PRECONDITION_FAILED
207-
});
208-
209-
export const ApiPayloadTooLargeResponse = (options: ApiResponseOptions = {}) =>
210-
ApiResponse({
211-
...options,
212-
status: HttpStatus.PAYLOAD_TOO_LARGE
213-
});
214-
215-
export const ApiPaymentRequiredResponse = (options: ApiResponseOptions = {}) =>
216-
ApiResponse({
217-
...options,
218-
status: HttpStatus.PAYMENT_REQUIRED
219-
});
220-
221-
export const ApiRequestTimeoutResponse = (options: ApiResponseOptions = {}) =>
222-
ApiResponse({
223-
...options,
224-
status: HttpStatus.REQUEST_TIMEOUT
225-
});
226-
227-
export const ApiServiceUnavailableResponse = (
228-
options: ApiResponseOptions = {}
229-
) =>
230-
ApiResponse({
231-
...options,
232-
status: HttpStatus.SERVICE_UNAVAILABLE
233-
});
234-
235-
export const ApiUnprocessableEntityResponse = (
236-
options: ApiResponseOptions = {}
237-
) =>
238-
ApiResponse({
239-
...options,
240-
status: HttpStatus.UNPROCESSABLE_ENTITY
241-
});
85+
interface HttpStatusInfo {
86+
code: number;
87+
functionName: string;
88+
}
24289

243-
export const ApiUnsupportedMediaTypeResponse = (
244-
options: ApiResponseOptions = {}
245-
) =>
246-
ApiResponse({
247-
...options,
248-
status: HttpStatus.UNSUPPORTED_MEDIA_TYPE
249-
});
90+
const decorators: {
91+
[key: string]: (
92+
options?: ApiResponseOptions
93+
) => MethodDecorator & ClassDecorator;
94+
} = {};
95+
96+
const statusList: HttpStatusInfo[] = Object.keys(HttpStatus)
97+
.filter((key) => !isNaN(Number(HttpStatus[key])))
98+
.map((key) => {
99+
const functionName = key
100+
.split('_')
101+
.map(
102+
(strToken) =>
103+
`${strToken[0].toUpperCase()}${strToken.slice(1).toLowerCase()}`
104+
)
105+
.join('');
106+
return {
107+
code: Number(HttpStatus[key]),
108+
functionName: `Api${functionName}Response`
109+
};
110+
});
111+
112+
statusList.forEach(({ code, functionName }) => {
113+
decorators[functionName] = function (options: ApiResponseOptions = {}) {
114+
return ApiResponse({
115+
...options,
116+
status: code // Convert status to number
117+
});
118+
};
119+
});
120+
121+
export const {
122+
ApiContinueResponse,
123+
ApiSwitchingProtocolsResponse,
124+
ApiProcessingResponse,
125+
ApiEarlyhintsResponse,
126+
ApiOkResponse,
127+
ApiCreatedResponse,
128+
ApiAcceptedResponse,
129+
ApiNonAuthoritativeInformationResponse,
130+
ApiNoContentResponse,
131+
ApiResetContentResponse,
132+
ApiPartialContentResponse,
133+
ApiAmbiguousResponse,
134+
ApiMovedPermanentlyResponse,
135+
ApiFoundResponse,
136+
ApiSeeOtherResponse,
137+
ApiNotModifiedResponse,
138+
ApiTemporaryRedirectResponse,
139+
ApiPermanentRedirectResponse,
140+
ApiBadRequestResponse,
141+
ApiUnauthorizedResponse,
142+
ApiPaymentRequiredResponse,
143+
ApiForbiddenResponse,
144+
ApiNotFoundResponse,
145+
ApiMethodNotAllowedResponse,
146+
ApiNotAcceptableResponse,
147+
ApiProxyAuthenticationRequiredResponse,
148+
ApiRequestTimeoutResponse,
149+
ApiConflictResponse,
150+
ApiGoneResponse,
151+
ApiLengthRequiredResponse,
152+
ApiPreconditionFailedResponse,
153+
ApiPayloadTooLargeResponse,
154+
ApiUriTooLongResponse,
155+
ApiUnsupportedMediaTypeResponse,
156+
ApiRequestedRangeNotSatisfiableResponse,
157+
ApiExpectationFailedResponse,
158+
ApiIAmATeapotResponse,
159+
ApiMisdirectedResponse,
160+
ApiUnprocessableEntityResponse,
161+
ApiFailedDependencyResponse,
162+
ApiPreconditionRequiredResponse,
163+
ApiTooManyRequestsResponse,
164+
ApiInternalServerErrorResponse,
165+
ApiNotImplementedResponse,
166+
ApiBadGatewayResponse,
167+
ApiServiceUnavailableResponse,
168+
ApiGatewayTimeoutResponse,
169+
ApiHttpVersionNotSupportedResponse
170+
} = decorators;
250171

251172
export const ApiDefaultResponse = (options: ApiResponseOptions = {}) =>
252173
ApiResponse({

‎lib/extra/swagger-shim.ts

+81-15
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ export function ApiQuery() {
5959
export function ApiResponse() {
6060
return () => {};
6161
}
62+
export function ApiContinueResponse() {
63+
return () => {};
64+
}
65+
export function ApiSwitchingProtocolsResponse() {
66+
return () => {};
67+
}
68+
export function ApiProcessingResponse() {
69+
return () => {};
70+
}
71+
export function ApiEarlyhintsResponse() {
72+
return () => {};
73+
}
6274
export function ApiOkResponse() {
6375
return () => {};
6476
}
@@ -68,73 +80,127 @@ export function ApiCreatedResponse() {
6880
export function ApiAcceptedResponse() {
6981
return () => {};
7082
}
83+
export function ApiNonAuthoritativeInformationResponse() {
84+
return () => {};
85+
}
7186
export function ApiNoContentResponse() {
7287
return () => {};
7388
}
89+
export function ApiResetContentResponse() {
90+
return () => {};
91+
}
92+
export function ApiPartialContentResponse() {
93+
return () => {};
94+
}
95+
export function ApiAmbiguousResponse() {
96+
return () => {};
97+
}
7498
export function ApiMovedPermanentlyResponse() {
7599
return () => {};
76100
}
77101
export function ApiFoundResponse() {
78102
return () => {};
79103
}
104+
export function ApiSeeOtherResponse() {
105+
return () => {};
106+
}
107+
export function ApiNotModifiedResponse() {
108+
return () => {};
109+
}
110+
export function ApiTemporaryRedirectResponse() {
111+
return () => {};
112+
}
113+
export function ApiPermanentRedirectResponse() {
114+
return () => {};
115+
}
80116
export function ApiBadRequestResponse() {
81117
return () => {};
82118
}
83119
export function ApiUnauthorizedResponse() {
84120
return () => {};
85121
}
86-
export function ApiTooManyRequestsResponse() {
122+
export function ApiPaymentRequiredResponse() {
123+
return () => {};
124+
}
125+
export function ApiForbiddenResponse() {
87126
return () => {};
88127
}
89128
export function ApiNotFoundResponse() {
90129
return () => {};
91130
}
92-
export function ApiInternalServerErrorResponse() {
131+
export function ApiMethodNotAllowedResponse() {
93132
return () => {};
94133
}
95-
export function ApiBadGatewayResponse() {
134+
export function ApiNotAcceptableResponse() {
96135
return () => {};
97136
}
98-
export function ApiConflictResponse() {
137+
export function ApiProxyAuthenticationRequiredResponse() {
99138
return () => {};
100139
}
101-
export function ApiForbiddenResponse() {
140+
export function ApiRequestTimeoutResponse() {
102141
return () => {};
103142
}
104-
export function ApiGatewayTimeoutResponse() {
143+
export function ApiConflictResponse() {
105144
return () => {};
106145
}
107146
export function ApiGoneResponse() {
108147
return () => {};
109148
}
110-
export function ApiMethodNotAllowedResponse() {
149+
export function ApiLengthRequiredResponse() {
111150
return () => {};
112151
}
113-
export function ApiNotAcceptableResponse() {
152+
export function ApiPreconditionFailedResponse() {
114153
return () => {};
115154
}
116-
export function ApiNotImplementedResponse() {
155+
export function ApiPayloadTooLargeResponse() {
117156
return () => {};
118157
}
119-
export function ApiPreconditionFailedResponse() {
158+
export function ApiUriTooLongResponse() {
120159
return () => {};
121160
}
122-
export function ApiPayloadTooLargeResponse() {
161+
export function ApiUnsupportedMediaTypeResponse() {
123162
return () => {};
124163
}
125-
export function ApiPaymentRequiredResponse() {
164+
export function ApiRequestedRangeNotSatisfiableResponse() {
126165
return () => {};
127166
}
128-
export function ApiRequestTimeoutResponse() {
167+
export function ApiExpectationFailedResponse() {
129168
return () => {};
130169
}
131-
export function ApiServiceUnavailableResponse() {
170+
export function ApiIAmATeapotResponse() {
171+
return () => {};
172+
}
173+
export function ApiMisdirectedResponse() {
132174
return () => {};
133175
}
134176
export function ApiUnprocessableEntityResponse() {
135177
return () => {};
136178
}
137-
export function ApiUnsupportedMediaTypeResponse() {
179+
export function ApiFailedDependencyResponse() {
180+
return () => {};
181+
}
182+
export function ApiPreconditionRequiredResponse() {
183+
return () => {};
184+
}
185+
export function ApiTooManyRequestsResponse() {
186+
return () => {};
187+
}
188+
export function ApiInternalServerErrorResponse() {
189+
return () => {};
190+
}
191+
export function ApiNotImplementedResponse() {
192+
return () => {};
193+
}
194+
export function ApiBadGatewayResponse() {
195+
return () => {};
196+
}
197+
export function ApiServiceUnavailableResponse() {
198+
return () => {};
199+
}
200+
export function ApiGatewayTimeoutResponse() {
201+
return () => {};
202+
}
203+
export function ApiHttpVersionNotSupportedResponse() {
138204
return () => {};
139205
}
140206
export function ApiDefaultResponse() {

0 commit comments

Comments
 (0)
Please sign in to comment.