post.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';
  2. import { FileService } from '@/server/modules/files/file.service';
  3. import { FileSchema, CreateFileDto } from '@/server/modules/files/file.schema';
  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 app = new OpenAPIHono<AuthContext>().openapi(createUploadPolicyRoute, async (c) => {
  54. try {
  55. const data = await c.req.json();
  56. const user = c.get('user');
  57. console.debug('user', user)
  58. // 创建文件服务实例
  59. const fileService = new FileService(AppDataSource);
  60. // 添加用户ID到文件数据
  61. const fileData = {
  62. ...data,
  63. uploadUserId: user.id,
  64. uploadTime: new Date()
  65. };
  66. const result = await fileService.createFile(fileData);
  67. console.debug('result', result)
  68. // 手动转换日期类型并处理可选字段
  69. const formattedFile = {
  70. ...result.file,
  71. description: result.file.description ?? null,
  72. type: result.file.type ?? null,
  73. size: result.file.size ?? null,
  74. lastUpdated: result.file.lastUpdated ? result.file.lastUpdated.toISOString() : null,
  75. createdAt: result.file.createdAt.toISOString(),
  76. uploadTime: result.file.uploadTime.toISOString()
  77. };
  78. const typedResult = {
  79. file: formattedFile,
  80. uploadPolicy: result.uploadPolicy
  81. };
  82. return c.json(typedResult, 200);
  83. } catch (error) {
  84. const message = error instanceof Error ? error.message : '生成上传策略失败';
  85. return c.json({ code: 500, message }, 500);
  86. }
  87. });
  88. export default app;