file.entity.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { Entity, PrimaryColumn, Column, Index } from 'typeorm';
  2. import { z } from '@hono/zod-openapi';
  3. @Entity('file')
  4. export class File {
  5. @PrimaryColumn({ name: 'id', type: 'varchar', length: 50 })
  6. id!: string;
  7. @Column({ name: 'name', type: 'varchar', length: 255 })
  8. name!: string;
  9. @Column({ name: 'type', type: 'varchar', length: 50, nullable: true })
  10. type?: string;
  11. @Column({ name: 'size', type: 'int', unsigned: true, nullable: true })
  12. size?: number;
  13. @Column({ name: 'path', type: 'varchar', length: 512 })
  14. path!: string;
  15. @Column({ name: 'description', type: 'text', nullable: true })
  16. description?: string;
  17. @Column({ name: 'upload_user_id', type: 'varchar', length: 50 })
  18. uploadUserId!: string;
  19. @Column({ name: 'upload_time', type: 'datetime' })
  20. uploadTime!: Date;
  21. @Column({ name: 'last_updated', type: 'datetime', nullable: true })
  22. lastUpdated?: Date;
  23. @Column({ name: 'created_at', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  24. createdAt!: Date;
  25. @Column({
  26. name: 'updated_at',
  27. type: 'timestamp',
  28. default: () => 'CURRENT_TIMESTAMP',
  29. onUpdate: 'CURRENT_TIMESTAMP'
  30. })
  31. updatedAt!: Date;
  32. }
  33. export const FileSchema = z.object({
  34. id: z.string().max(50).openapi({
  35. description: '文件ID',
  36. example: 'FILE20230001'
  37. }),
  38. name: z.string().max(255).openapi({
  39. description: '文件名称',
  40. example: '项目计划书.pdf'
  41. }),
  42. type: z.string().max(50).nullable().openapi({
  43. description: '文件类型',
  44. example: 'application/pdf'
  45. }),
  46. size: z.number().int().positive().nullable().openapi({
  47. description: '文件大小,单位字节',
  48. example: 102400
  49. }),
  50. path: z.string().max(512).openapi({
  51. description: '文件存储路径',
  52. example: '/uploads/documents/2023/project-plan.pdf'
  53. }),
  54. description: z.string().nullable().openapi({
  55. description: '文件描述',
  56. example: '2023年度项目计划书'
  57. }),
  58. uploadUserId: z.string().max(50).openapi({
  59. description: '上传用户ID',
  60. example: 'U1001'
  61. }),
  62. uploadTime: z.date().openapi({
  63. description: '上传时间',
  64. example: '2023-01-15T10:30:00Z'
  65. }),
  66. lastUpdated: z.date().nullable().openapi({
  67. description: '最后更新时间',
  68. example: '2023-01-16T14:20:00Z'
  69. }),
  70. createdAt: z.date().openapi({
  71. description: '创建时间',
  72. example: '2023-01-15T10:30:00Z'
  73. }),
  74. updatedAt: z.date().openapi({
  75. description: '更新时间',
  76. example: '2023-01-16T14:20:00Z'
  77. })
  78. });
  79. export const CreateFileDto = z.object({
  80. id: z.string().max(50).openapi({
  81. description: '文件ID',
  82. example: 'FILE20230001'
  83. }),
  84. name: z.string().max(255).openapi({
  85. description: '文件名称',
  86. example: '项目计划书.pdf'
  87. }),
  88. type: z.string().max(50).nullable().optional().openapi({
  89. description: '文件类型',
  90. example: 'application/pdf'
  91. }),
  92. size: z.coerce.number().int().positive().nullable().optional().openapi({
  93. description: '文件大小,单位字节',
  94. example: 102400
  95. }),
  96. path: z.string().max(512).openapi({
  97. description: '文件存储路径',
  98. example: '/uploads/documents/2023/project-plan.pdf'
  99. }),
  100. description: z.string().nullable().optional().openapi({
  101. description: '文件描述',
  102. example: '2023年度项目计划书'
  103. }),
  104. uploadUserId: z.string().max(50).openapi({
  105. description: '上传用户ID',
  106. example: 'U1001'
  107. }),
  108. uploadTime: z.coerce.date().openapi({
  109. description: '上传时间',
  110. example: '2023-01-15T10:30:00Z'
  111. }),
  112. lastUpdated: z.coerce.date().nullable().optional().openapi({
  113. description: '最后更新时间',
  114. example: '2023-01-16T14:20:00Z'
  115. })
  116. });
  117. export const UpdateFileDto = z.object({
  118. name: z.string().max(255).optional().openapi({
  119. description: '文件名称',
  120. example: '项目计划书_v2.pdf'
  121. }),
  122. type: z.string().max(50).nullable().optional().openapi({
  123. description: '文件类型',
  124. example: 'application/pdf'
  125. }),
  126. size: z.coerce.number().int().positive().nullable().optional().openapi({
  127. description: '文件大小,单位字节',
  128. example: 153600
  129. }),
  130. path: z.string().max(512).optional().openapi({
  131. description: '文件存储路径',
  132. example: '/uploads/documents/2023/project-plan_v2.pdf'
  133. }),
  134. description: z.string().nullable().optional().openapi({
  135. description: '文件描述',
  136. example: '2023年度项目计划书(修订版)'
  137. }),
  138. uploadUserId: z.string().max(50).optional().openapi({
  139. description: '上传用户ID',
  140. example: 'U1001'
  141. }),
  142. uploadTime: z.coerce.date().optional().openapi({
  143. description: '上传时间',
  144. example: '2023-01-15T10:30:00Z'
  145. }),
  146. lastUpdated: z.coerce.date().nullable().optional().openapi({
  147. description: '最后更新时间',
  148. example: '2023-01-16T14:20:00Z'
  149. })
  150. });