file.schema.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { z } from '@hono/zod-openapi';
  2. import { UserSchema } from '../users/user.schema';
  3. export const FileSchema = z.object({
  4. id: z.number().int().positive().openapi({
  5. description: '文件ID',
  6. example: 1
  7. }),
  8. name: z.string().max(255).openapi({
  9. description: '文件名称',
  10. example: '项目计划书.pdf'
  11. }),
  12. type: z.string().max(50).nullable().openapi({
  13. description: '文件类型',
  14. example: 'application/pdf'
  15. }),
  16. size: z.number().int().positive().nullable().openapi({
  17. description: '文件大小,单位字节',
  18. example: 102400
  19. }),
  20. path: z.string().max(512).openapi({
  21. description: '文件存储路径',
  22. example: '/uploads/documents/2023/project-plan.pdf'
  23. }),
  24. fullUrl: z.string().url().openapi({
  25. description: '完整文件访问URL',
  26. example: 'https://minio.example.com/d8dai/uploads/documents/2023/project-plan.pdf'
  27. }),
  28. description: z.string().nullable().openapi({
  29. description: '文件描述',
  30. example: '2023年度项目计划书'
  31. }),
  32. uploadUserId: z.number().int().positive().openapi({
  33. description: '上传用户ID',
  34. example: 1
  35. }),
  36. uploadUser: UserSchema,
  37. uploadTime: z.date().openapi({
  38. description: '上传时间',
  39. example: '2023-01-15T10:30:00Z'
  40. }),
  41. lastUpdated: z.date().nullable().openapi({
  42. description: '最后更新时间',
  43. example: '2023-01-16T14:20:00Z'
  44. }),
  45. createdAt: z.date().openapi({
  46. description: '创建时间',
  47. example: '2023-01-15T10:30:00Z'
  48. }),
  49. updatedAt: z.date().openapi({
  50. description: '更新时间',
  51. example: '2023-01-16T14:20:00Z'
  52. })
  53. });
  54. export const CreateFileDto = z.object({
  55. name: z.string().max(255).openapi({
  56. description: '文件名称',
  57. example: '项目计划书.pdf'
  58. }),
  59. type: z.string().max(50).nullable().optional().openapi({
  60. description: '文件类型',
  61. example: 'application/pdf'
  62. }),
  63. size: z.coerce.number().int().positive().nullable().optional().openapi({
  64. description: '文件大小,单位字节',
  65. example: 102400
  66. }),
  67. path: z.string().max(512).openapi({
  68. description: '文件存储路径',
  69. example: '/uploads/documents/2023/project-plan.pdf'
  70. }),
  71. description: z.string().nullable().optional().openapi({
  72. description: '文件描述',
  73. example: '2023年度项目计划书'
  74. }),
  75. lastUpdated: z.coerce.date().nullable().optional().openapi({
  76. description: '最后更新时间',
  77. example: '2023-01-16T14:20:00Z'
  78. })
  79. });
  80. export const UpdateFileDto = z.object({
  81. name: z.string().max(255).optional().openapi({
  82. description: '文件名称',
  83. example: '项目计划书_v2.pdf'
  84. }),
  85. type: z.string().max(50).nullable().optional().openapi({
  86. description: '文件类型',
  87. example: 'application/pdf'
  88. }),
  89. size: z.coerce.number().int().positive().nullable().optional().openapi({
  90. description: '文件大小,单位字节',
  91. example: 153600
  92. }),
  93. path: z.string().max(512).optional().openapi({
  94. description: '文件存储路径',
  95. example: '/uploads/documents/2023/project-plan_v2.pdf'
  96. }),
  97. description: z.string().nullable().optional().openapi({
  98. description: '文件描述',
  99. example: '2023年度项目计划书(修订版)'
  100. }),
  101. uploadUserId: z.number().int().positive().optional().openapi({
  102. description: '上传用户ID',
  103. example: 1
  104. }),
  105. uploadTime: z.coerce.date().optional().openapi({
  106. description: '上传时间',
  107. example: '2023-01-15T10:30:00Z'
  108. }),
  109. lastUpdated: z.coerce.date().nullable().optional().openapi({
  110. description: '最后更新时间',
  111. example: '2023-01-16T14:20:00Z'
  112. })
  113. });
  114. export type FileType = z.infer<typeof FileSchema>