Skip to content

Commit f018265

Browse files
authored
chore: Enhance error handling Rest definitions (RocketChat#36706)
1 parent 85e4001 commit f018265

4 files changed

Lines changed: 36 additions & 6 deletions

File tree

apps/meteor/app/api/server/definition.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,19 +311,27 @@ type PromiseOrValue<T> = T | Promise<T>;
311311

312312
type InferResult<TResult> = TResult extends ValidateFunction<infer T> ? T : TResult;
313313

314+
type InferNon200Result<T> =
315+
InferResult<T> extends {
316+
success: false;
317+
error?: infer TError;
318+
}
319+
? TError
320+
: never;
321+
314322
type Results<TResponse extends TypedOptions['response']> = {
315323
[K in keyof TResponse]: K extends SuccessStatusCodes
316324
? SuccessResult<InferResult<TResponse[200]>, K>
317325
: K extends RedirectStatusCodes
318-
? RedirectResult<InferResult<TResponse[300]>, K>
326+
? RedirectResult<InferNon200Result<TResponse[300]>, K>
319327
: K extends 400
320328
? FailureResult<InferResult<TResponse[400]>>
321329
: K extends 401
322-
? UnauthorizedResult<InferResult<TResponse[401]>>
330+
? UnauthorizedResult<InferNon200Result<TResponse[401]>>
323331
: K extends 403
324-
? ForbiddenResult<InferResult<TResponse[403]>>
332+
? ForbiddenResult<InferNon200Result<TResponse[403]>>
325333
: K extends 404
326-
? NotFoundResult<InferResult<TResponse[404]>>
334+
? NotFoundResult<InferNon200Result<TResponse[404]>>
327335
: K extends ErrorStatusCodes
328336
? InternalError<InferResult<TResponse[500]>, K>
329337
: never;

apps/meteor/ee/server/apps/communication/endpoints/appLogsDistinctInstanceHandler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import { ajv } from '@rocket.chat/rest-typings';
33
import type { AppsRestApi } from '../rest';
44

55
// This might be a good candidate for a default validator function exported by @rocket.chat/rest-typings
6-
const errorResponse = ajv.compile<unknown>({
6+
const errorResponse = ajv.compile<{
7+
success: false;
8+
error: string;
9+
}>({
710
additionalProperties: false,
811
type: 'object',
912
properties: {

apps/meteor/ee/server/apps/communication/endpoints/appLogsExportHandler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import type { AppsRestApi } from '../rest';
88
import { makeAppLogsQuery } from './lib/makeAppLogsQuery';
99
import { APIClass } from '../../../../../app/api/server/ApiClass';
1010

11-
const isErrorResponse = ajv.compile({
11+
const isErrorResponse = ajv.compile<{
12+
success: false;
13+
error: string;
14+
}>({
1215
type: 'object',
1316
properties: {
1417
success: {

packages/rest-typings/src/v1/Ajv.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,19 @@ const ForbiddenErrorResponseSchema = {
9090
};
9191

9292
export const validateForbiddenErrorResponse = ajv.compile<ForbiddenErrorResponse>(ForbiddenErrorResponseSchema);
93+
94+
type NotFoundErrorResponse = {
95+
success: false;
96+
error: string;
97+
};
98+
99+
const NotFoundErrorResponseSchema = {
100+
type: 'object',
101+
properties: {
102+
success: { type: 'boolean', enum: [false] },
103+
error: { type: 'string' },
104+
},
105+
required: ['success', 'error'],
106+
};
107+
108+
export const validateNotFoundErrorResponse = ajv.compile<NotFoundErrorResponse>(NotFoundErrorResponseSchema);

0 commit comments

Comments
 (0)