file.entity.ts 4.8 KB

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