template.schema.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { z } from '@hono/zod-openapi';
  2. import { FileSchema } from '@/server/modules/files/file.schema';
  3. import { DeleteStatus, DisabledStatus } from '@/share/types';
  4. // 模板实体完整Schema
  5. export const TemplateSchema = z.object({
  6. id: z.number().int('必须是整数').positive('必须是正整数').openapi({
  7. description: '模板ID',
  8. example: 1
  9. }),
  10. title: z.string().min(1, '模板标题不能为空').max(255, '模板标题最多255个字符').openapi({
  11. description: '模板标题',
  12. example: '项目计划书模板'
  13. }),
  14. description: z.string().nullable().openapi({
  15. description: '模板描述',
  16. example: '适用于各类项目管理的标准计划书模板'
  17. }),
  18. fileId: z.number().int('必须是整数').positive('必须是正整数').openapi({
  19. description: '关联文件ID',
  20. example: 1
  21. }),
  22. file: FileSchema.openapi({
  23. description: '关联文件信息'
  24. }),
  25. category: z.string().min(1, '模板分类不能为空').max(100, '模板分类最多100个字符').openapi({
  26. description: '模板分类',
  27. example: '项目管理'
  28. }),
  29. isFree: z.number().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').openapi({
  30. description: '是否免费:0-收费,1-免费',
  31. example: 0
  32. }),
  33. downloadCount: z.number().int('必须是整数').min(0, '下载次数不能为负数').openapi({
  34. description: '下载次数',
  35. example: 100
  36. }),
  37. isDisabled: z.number().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').default(DisabledStatus.ENABLED).openapi({
  38. description: '是否禁用:0-启用,1-禁用',
  39. example: DisabledStatus.ENABLED
  40. }),
  41. isDeleted: z.number().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').default(DeleteStatus.NOT_DELETED).openapi({
  42. description: '是否删除:0-未删除,1-已删除',
  43. example: DeleteStatus.NOT_DELETED
  44. }),
  45. createdAt: z.coerce.date<Date>('创建时间格式不正确').openapi({
  46. description: '创建时间',
  47. example: '2024-01-15T10:30:00Z'
  48. }),
  49. updatedAt: z.coerce.date<Date>('更新时间格式不正确').openapi({
  50. description: '更新时间',
  51. example: '2024-01-16T14:20:00Z'
  52. })
  53. });
  54. // 创建模板请求Schema
  55. export const CreateTemplateDto = z.object({
  56. title: z.string().min(1, '模板标题不能为空').max(255, '模板标题最多255个字符').openapi({
  57. description: '模板标题',
  58. example: '项目计划书模板'
  59. }),
  60. description: z.string().nullable().optional().openapi({
  61. description: '模板描述',
  62. example: '适用于各类项目管理的标准计划书模板'
  63. }),
  64. fileId: z.coerce.number<number>().int('必须是整数').positive('必须是正整数').openapi({
  65. description: '关联文件ID',
  66. example: 1
  67. }),
  68. category: z.string().min(1, '模板分类不能为空').max(100, '模板分类最多100个字符').openapi({
  69. description: '模板分类',
  70. example: '项目管理'
  71. }),
  72. isFree: z.coerce.number<number>().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').default(0).openapi({
  73. description: '是否免费:0-收费,1-免费',
  74. example: 0
  75. })
  76. });
  77. // 更新模板请求Schema
  78. export const UpdateTemplateDto = z.object({
  79. title: z.string().min(1, '模板标题不能为空').max(255, '模板标题最多255个字符').optional().openapi({
  80. description: '模板标题',
  81. example: '项目计划书模板(更新版)'
  82. }),
  83. description: z.string().nullable().optional().openapi({
  84. description: '模板描述',
  85. example: '适用于各类项目管理的标准计划书模板(修订版)'
  86. }),
  87. fileId: z.coerce.number<number>().int('必须是整数').positive('必须是正整数').optional().openapi({
  88. description: '关联文件ID',
  89. example: 2
  90. }),
  91. category: z.string().min(1, '模板分类不能为空').max(100, '模板分类最多100个字符').optional().openapi({
  92. description: '模板分类',
  93. example: '项目管理'
  94. }),
  95. isFree: z.coerce.number<number>().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').optional().openapi({
  96. description: '是否免费:0-收费,1-免费',
  97. example: 1
  98. }),
  99. isDisabled: z.coerce.number<number>().int('必须是整数').min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').optional().openapi({
  100. description: '是否禁用:0-启用,1-禁用',
  101. example: DisabledStatus.ENABLED
  102. })
  103. });