monorepo/server/post/schema.ts

134 lines
3.4 KiB
TypeScript
Raw Normal View History

2024-12-02 13:41:28 +08:00
import { isNil } from 'lodash';
import { z } from 'zod';
/**
*
*/
export const postItemResponseSchema = z
.object({
2025-02-09 10:39:10 +08:00
authorId: z.string(),
2024-12-02 13:41:28 +08:00
id: z.string(),
title: z.string(),
thumb: z.string(),
summary: z.string().nullable().optional(),
keywords: z.string().nullable().optional(),
description: z.string().nullable().optional(),
slug: z.string().nullable().optional(),
body: z.string(),
createdAt: z.coerce.date(),
updatedAt: z.coerce.date(),
})
.strict();
/**
*
*/
export const postPaginateResponseSchema = z.object({
items: z.array(postItemResponseSchema),
meta: z.object({
itemCount: z.coerce.number(),
totalItems: z.coerce.number().optional(),
perPage: z.coerce.number(),
totalPages: z.coerce.number().optional(),
currentPage: z.coerce.number(),
}),
});
/**
*
*/
export const postPageNumbersResponseSchema = z.object({
result: z.coerce.number(),
});
/**
*
*/
export const postPaginateRequestQuerySchema = z.object({
page: z.coerce.number().optional(),
limit: z.coerce.number().optional(),
orderBy: z.enum(['asc', 'desc']).optional(),
});
/**
*
*/
export const postPageNumbersRequestQuerySchema = z.object({
limit: z.coerce.number().optional(),
});
/**
*
*/
export const postDetailRequestParamsSchema = z.object({
item: z.string(),
});
/**
* ID
*/
export const postDetailByIdRequestParamsSchema = z.object({
id: z.string(),
});
/**
* slug
*/
export const postDetailBySlugRequestParamsSchema = z.object({
slug: z.string(),
});
/**
*
* @param slugUniqueValidator Slug
* @param id
*/
export const getPostItemRequestSchema = (
slugUniqueValidator?: (val?: string | null) => Promise<boolean>,
) => {
const slug = z
.string()
.max(250, {
message: 'slug不得超过250个字符',
})
.nullable()
.optional();
if (!isNil(slugUniqueValidator)) {
slug.refine(slugUniqueValidator, {
message: 'slug必须是唯一的,请重新设置',
});
}
return z
.object({
title: z
.string()
.min(10, {
message: '标题不得少于10个字符',
})
.max(200, {
message: '标题不得超过200个字符',
}),
summary: z.string().max(300, {
message: '摘要不得超过300个字符',
}),
keywords: z
.string()
.max(200, {
message: '描述不得超过200个字符',
})
.nullable()
.optional(),
description: z
.string()
.max(300, {
message: '描述不得超过300个字符',
})
.nullable()
.optional(),
slug,
body: z.string().min(1, {
message: '标题不得少于1个字符',
}),
})
.strict();
};