import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne, JoinColumn } from 'typeorm'; import { z } from '@hono/zod-openapi'; import { UserEntity, UserSchema } from '@/server/modules/users/user.entity'; @Entity('file') export class File { @PrimaryGeneratedColumn({ name: 'id', type: 'int', unsigned: true }) id!: number; @Column({ name: 'name', type: 'varchar', length: 255 }) name!: string; @Column({ name: 'type', type: 'varchar', length: 50, nullable: true, comment: '文件类型' }) type!: string | null; @Column({ name: 'size', type: 'int', unsigned: true, nullable: true, comment: '文件大小,单位字节' }) size!: number | null; @Column({ name: 'path', type: 'varchar', length: 512, comment: '文件存储路径' }) path!: string; @Column({ name: 'description', type: 'text', nullable: true, comment: '文件描述' }) description!: string | null; @Column({ name: 'upload_user_id', type: 'int', unsigned: true }) uploadUserId!: number; @ManyToOne(() => UserEntity) @JoinColumn({ name: 'upload_user_id', referencedColumnName: 'id' }) uploadUser!: UserEntity; @Column({ name: 'upload_time', type: 'datetime' }) uploadTime!: Date; @Column({ name: 'last_updated', type: 'datetime', nullable: true, comment: '最后更新时间' }) lastUpdated!: Date | null; @Column({ name: 'created_at', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) createdAt!: Date; @Column({ name: 'updated_at', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', onUpdate: 'CURRENT_TIMESTAMP' }) updatedAt!: Date; } export const FileSchema = z.object({ id: z.number().int().positive().openapi({ description: '文件ID', example: 1 }), name: z.string().max(255).openapi({ description: '文件名称', example: '项目计划书.pdf' }), type: z.string().max(50).nullable().openapi({ description: '文件类型', example: 'application/pdf' }), size: z.number().int().positive().nullable().openapi({ description: '文件大小,单位字节', example: 102400 }), path: z.string().max(512).openapi({ description: '文件存储路径', example: '/uploads/documents/2023/project-plan.pdf' }), description: z.string().nullable().openapi({ description: '文件描述', example: '2023年度项目计划书' }), uploadUserId: z.number().int().positive().openapi({ description: '上传用户ID', example: 1 }), uploadUser: UserSchema, uploadTime: z.date().openapi({ description: '上传时间', example: '2023-01-15T10:30:00Z' }), lastUpdated: z.date().nullable().openapi({ description: '最后更新时间', example: '2023-01-16T14:20:00Z' }), createdAt: z.date().openapi({ description: '创建时间', example: '2023-01-15T10:30:00Z' }), updatedAt: z.date().openapi({ description: '更新时间', example: '2023-01-16T14:20:00Z' }) }); export const CreateFileDto = z.object({ name: z.string().max(255).openapi({ description: '文件名称', example: '项目计划书.pdf' }), type: z.string().max(50).nullable().optional().openapi({ description: '文件类型', example: 'application/pdf' }), size: z.coerce.number().int().positive().nullable().optional().openapi({ description: '文件大小,单位字节', example: 102400 }), path: z.string().max(512).openapi({ description: '文件存储路径', example: '/uploads/documents/2023/project-plan.pdf' }), description: z.string().nullable().optional().openapi({ description: '文件描述', example: '2023年度项目计划书' }), lastUpdated: z.coerce.date().nullable().optional().openapi({ description: '最后更新时间', example: '2023-01-16T14:20:00Z' }) }); export const UpdateFileDto = z.object({ name: z.string().max(255).optional().openapi({ description: '文件名称', example: '项目计划书_v2.pdf' }), type: z.string().max(50).nullable().optional().openapi({ description: '文件类型', example: 'application/pdf' }), size: z.coerce.number().int().positive().nullable().optional().openapi({ description: '文件大小,单位字节', example: 153600 }), path: z.string().max(512).optional().openapi({ description: '文件存储路径', example: '/uploads/documents/2023/project-plan_v2.pdf' }), description: z.string().nullable().optional().openapi({ description: '文件描述', example: '2023年度项目计划书(修订版)' }), uploadUserId: z.number().int().positive().optional().openapi({ description: '上传用户ID', example: 1 }), uploadTime: z.coerce.date().optional().openapi({ description: '上传时间', example: '2023-01-15T10:30:00Z' }), lastUpdated: z.coerce.date().nullable().optional().openapi({ description: '最后更新时间', example: '2023-01-16T14:20:00Z' }) });