post.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';
  2. import { FileService } from '@/server/modules/files/file.service';
  3. import { FileSchema, CreateFileDto, File } from '@/server/modules/files/file.entity';
  4. import { ErrorSchema } from '@/server/utils/errorHandler';
  5. import { AppDataSource } from '@/server/data-source';
  6. import { AuthContext } from '@/server/types/context';
  7. import { authMiddleware } from '@/server/middleware/auth.middleware';
  8. // 创建文件上传策略路由
  9. const createUploadPolicyRoute = createRoute({
  10. method: 'post',
  11. path: '/',
  12. middleware: [authMiddleware],
  13. request: {
  14. body: {
  15. content: {
  16. 'application/json': { schema: CreateFileDto }
  17. }
  18. }
  19. },
  20. responses: {
  21. 200: {
  22. description: '生成文件上传策略成功',
  23. content: {
  24. 'application/json': {
  25. schema: z.object({
  26. file: FileSchema,
  27. uploadPolicy: z.object({
  28. 'x-amz-algorithm': z.string(),
  29. 'x-amz-credential': z.string(),
  30. 'x-amz-date': z.string(),
  31. 'x-amz-security-token': z.string().optional(),
  32. policy: z.string(),
  33. 'x-amz-signature': z.string(),
  34. host: z.string(),
  35. key: z.string(),
  36. bucket: z.string()
  37. })
  38. })
  39. }
  40. }
  41. },
  42. 400: {
  43. description: '请求参数错误',
  44. content: { 'application/json': { schema: ErrorSchema } }
  45. },
  46. 500: {
  47. description: '服务器错误',
  48. content: { 'application/json': { schema: ErrorSchema } }
  49. }
  50. }
  51. });
  52. // 创建文件服务实例
  53. const fileService = new FileService(AppDataSource);
  54. // 创建路由实例
  55. const app = new OpenAPIHono<AuthContext>().openapi(createUploadPolicyRoute, async (c) => {
  56. try {
  57. const data = await c.req.json();
  58. const user = c.get('user');
  59. // 添加用户ID到文件数据
  60. const fileData = {
  61. ...data,
  62. uploadUserId: user.id,
  63. uploadTime: new Date()
  64. };
  65. const result = await fileService.createFile(fileData);
  66. // 手动转换日期类型并处理可选字段
  67. const formattedFile = {
  68. ...result.file,
  69. description: result.file.description ?? null,
  70. type: result.file.type ?? null,
  71. size: result.file.size ?? null,
  72. lastUpdated: result.file.lastUpdated ? result.file.lastUpdated.toISOString() : null,
  73. createdAt: result.file.createdAt.toISOString(),
  74. uploadTime: result.file.uploadTime.toISOString()
  75. };
  76. const typedResult = {
  77. file: formattedFile,
  78. uploadPolicy: result.uploadPolicy
  79. };
  80. return c.json(typedResult, 200);
  81. } catch (error) {
  82. const message = error instanceof Error ? error.message : '生成上传策略失败';
  83. return c.json({ code: 500, message }, 500);
  84. }
  85. });
  86. export default app;