Просмотр исходного кода

✨ feat(printer): 为飞鹅打印模块路由添加响应格式验证

- 在多个路由文件中导入并使用 `parseWithAwait` 工具函数
- 对 API 响应数据应用 Zod Schema 验证,确保数据格式正确性
- 更新打印机类型枚举值从 `['RECEIPT', 'LABEL']` 改为 `['58mm', '80mm']`

🔧 chore(scripts): 添加批量更新脚本

- 新增 `update_files.sh` shell 脚本用于批量更新路由文件
- 新增 `update_parse_with_await.py` Python 脚本用于智能更新导入和响应验证
- 脚本自动检测并更新包含 ResponseSchema 定义的文件
yourname 1 месяц назад
Родитель
Сommit
190920531e

+ 6 - 3
packages/feie-printer-module-mt/src/routes/config/list.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { ConfigService } from '../../services/config.service';
@@ -64,12 +64,15 @@ const app = new OpenAPIHono<AuthContext>()
         updatedAt: config.updatedAt.toISOString()
       }));
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(PrintConfigListResponseSchema, {
         success: true,
         data: {
           data: transformedConfigs
         }
-      }, 200);
+      });
+
+      return c.json(validatedResponse, 200);
     } catch (error) {
       console.error(`[租户${tenantId}] 获取打印配置失败:`, error);
       return c.json({ success: false, message: '获取打印配置失败' }, 500);

+ 9 - 5
packages/feie-printer-module-mt/src/routes/printers/create.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -11,7 +11,7 @@ const PrinterCreateRequestSchema = z.object({
   printerSn: z.string().min(1, '打印机SN不能为空'),
   printerKey: z.string().min(1, '打印机密钥不能为空'),
   printerName: z.string().optional(),
-  printerType: z.enum(['RECEIPT', 'LABEL']).default('RECEIPT'),
+  printerType: z.enum(['58mm', '80mm']).default('58mm'),
   isDefault: z.boolean().default(false)
 });
 
@@ -82,10 +82,14 @@ const app = new OpenAPIHono<AuthContext>()
       const printerService = new PrinterService(AppDataSource, feieConfig);
       const printer = await printerService.addPrinter(tenantId, body);
 
-      return c.json({
-        success: true,
+      // 验证响应格式
+      const response = {
+        success: true as const,
         data: printer
-      });
+      };
+      const validatedResponse = await parseWithAwait(PrinterCreateResponseSchema, response);
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 添加打印机失败:`, error);
       const errorMessage = error instanceof Error ? error.message : '添加打印机失败';

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/delete.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -66,10 +66,13 @@ const app = new OpenAPIHono<AuthContext>()
       const printerService = new PrinterService(AppDataSource, feieConfig);
       await printerService.deletePrinter(tenantId, printerSn);
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(PrinterDeleteResponseSchema, {
         success: true,
         message: '打印机删除成功'
       });
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 删除打印机失败,打印机SN: ${printerSn}:`, error);
       const errorMessage = error instanceof Error ? error.message : '删除打印机失败';

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/detail.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -82,10 +82,13 @@ const app = new OpenAPIHono<AuthContext>()
       return c.json({ success: false, message: '打印机不存在' }, 404);
     }
 
-    return c.json({
+    // 验证响应格式
+    const validatedResponse = await parseWithAwait(PrinterDetailResponseSchema, {
       success: true,
       data: printer
     });
+
+    return c.json(validatedResponse);
   });
 
 export default app;

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/list.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -120,7 +120,8 @@ const app = new OpenAPIHono<AuthContext>()
 
     console.debug(`返回打印机列表,总数: ${total}, 分页: ${page}/${Math.ceil(total/pageSize)}, 数量: ${paginatedPrinters.length}`);
 
-    return c.json({
+    // 验证响应格式
+    const validatedResponse = await parseWithAwait(PrinterListResponseSchema, {
       success: true,
       data: {
         data: paginatedPrinters,
@@ -129,6 +130,8 @@ const app = new OpenAPIHono<AuthContext>()
         pageSize
       }
     });
+
+    return c.json(validatedResponse);
   });
 
 export default app;

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/set-default.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -77,10 +77,13 @@ const app = new OpenAPIHono<AuthContext>()
       const printerService = new PrinterService(AppDataSource, feieConfig);
       const printer = await printerService.setDefaultPrinter(tenantId, printerSn);
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(SetDefaultPrinterResponseSchema, {
         success: true,
         data: printer
       });
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 设置默认打印机失败,打印机SN: ${printerSn}:`, error);
       const errorMessage = error instanceof Error ? error.message : '设置默认打印机失败';

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/status.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -75,10 +75,13 @@ const app = new OpenAPIHono<AuthContext>()
       const printerService = new PrinterService(AppDataSource, feieConfig);
       const status = await printerService.getPrinterStatus(tenantId, printerSn);
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(PrinterStatusResponseSchema, {
         success: true,
         data: status
       });
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 查询打印机状态失败,打印机SN: ${printerSn}:`, error);
       const errorMessage = error instanceof Error ? error.message : '查询打印机状态失败';

+ 5 - 2
packages/feie-printer-module-mt/src/routes/printers/update.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrinterService } from '../../services/printer.service';
@@ -92,10 +92,13 @@ const app = new OpenAPIHono<AuthContext>()
       const printerService = new PrinterService(AppDataSource, feieConfig);
       const printer = await printerService.updatePrinter(tenantId, printerSn, body);
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(PrinterUpdateResponseSchema, {
         success: true,
         data: printer
       });
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 更新打印机失败,打印机SN: ${printerSn}:`, error);
       const errorMessage = error instanceof Error ? error.message : '更新打印机失败';

+ 5 - 2
packages/feie-printer-module-mt/src/routes/tasks/create.mt.ts

@@ -1,6 +1,6 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from 'zod';
-import { AppDataSource } from '@d8d/shared-utils';
+import { AppDataSource, parseWithAwait } from '@d8d/shared-utils';
 import { authMiddleware } from '@d8d/auth-module-mt';
 import { AuthContext } from '@d8d/shared-types';
 import { PrintTaskService } from '../../services/print-task.service';
@@ -85,10 +85,13 @@ const app = new OpenAPIHono<AuthContext>()
       const printTaskService = new PrintTaskService(AppDataSource, feieConfig);
       const task = await printTaskService.createPrintTask(tenantId, body);
 
-      return c.json({
+      // 验证响应格式
+      const validatedResponse = await parseWithAwait(PrintTaskCreateResponseSchema, {
         success: true,
         data: task
       });
+
+      return c.json(validatedResponse);
     } catch (error) {
       console.error(`[租户${tenantId}] 创建打印任务失败:`, error);
       const errorMessage = error instanceof Error ? error.message : '创建打印任务失败';