Skip to content

Commit 91a7c76

Browse files
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

Lines changed: 85 additions & 164 deletions
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({

0 commit comments

Comments
 (0)