Files
Picsur/shared/src/dto/api/api.dto.ts

39 lines
896 B
TypeScript
Raw Normal View History

2022-04-04 10:36:59 +02:00
import z from 'zod';
2022-02-25 12:22:00 +01:00
2022-04-04 10:36:59 +02:00
const ApiResponseBase = z.object({
statusCode: z.number().min(0).max(600),
timestamp: z.string(),
});
2022-02-25 12:22:00 +01:00
2022-04-04 10:36:59 +02:00
const ApiSuccessResponse = <T extends z.AnyZodObject>(data: T) =>
ApiResponseBase.merge(
z.object({
success: z.literal(true),
data,
}),
);
2022-02-25 12:22:00 +01:00
2022-04-04 10:36:59 +02:00
const ApiErrorResponse = ApiResponseBase.merge(
z.object({
success: z.literal(false),
data: z.object({
2022-07-04 17:11:42 +02:00
type: z.string(),
2022-04-04 10:36:59 +02:00
message: z.string(),
}),
}),
);
2022-02-25 12:22:00 +01:00
2022-04-04 10:36:59 +02:00
export const ApiResponseSchema = <T extends z.AnyZodObject>(data: T) =>
ApiErrorResponse.or(ApiSuccessResponse(data));
2022-02-25 12:22:00 +01:00
2022-04-04 10:36:59 +02:00
export type ApiErrorResponse = z.infer<typeof ApiErrorResponse>;
2022-04-05 20:37:25 +02:00
const ApiAnySuccessResponseSchema = ApiSuccessResponse(z.object({}))
.omit({ data: true })
.merge(
z.object({
data: z.any(),
}),
);
export type ApiAnySuccessResponse = z.infer<typeof ApiAnySuccessResponseSchema>;