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>;
|