Selaa lähdekoodia

♻️ refactor(crud): 重构CRUD路由服务实例化方式

- 移除内部ConcreteCrudService类定义,改为导入外部ConcreteCrudService
- 在各路由处理函数中动态创建ConcreteCrudService实例,传入entity和配置
- 移除AppDataSource依赖,改为通过ConcreteCrudService构造函数注入
- 清理多余空行,优化代码格式

✨ feat(crud): 增强CRUD服务的灵活性和可维护性

- 实现服务实例的动态创建,避免单例模式限制
- 简化依赖关系,提高代码解耦度
- 统一各路由处理函数中服务实例的创建方式
yourname 2 kuukautta sitten
vanhempi
sitoutus
c08c460218
1 muutettua tiedostoa jossa 51 lisäystä ja 27 poistoa
  1. 51 27
      src/server/utils/generic-crud.routes.ts

+ 51 - 27
src/server/utils/generic-crud.routes.ts

@@ -1,11 +1,11 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from '@hono/zod-openapi';
-import { GenericCrudService, CrudOptions } from './generic-crud.service';
+import { CrudOptions } from './generic-crud.service';
 import { ErrorSchema } from './errorHandler';
 import { AuthContext } from '../types/context';
 import { ObjectLiteral } from 'typeorm';
-import { AppDataSource } from '../data-source';
 import { parseWithAwait } from './parseWithAwait';
+import { ConcreteCrudService } from './concrete-crud.service';
 
 export function createCrudRoutes<
   T extends ObjectLiteral,
@@ -16,15 +16,6 @@ export function createCrudRoutes<
 >(options: CrudOptions<T, CreateSchema, UpdateSchema, GetSchema, ListSchema>) {
   const { entity, createSchema, updateSchema, getSchema, listSchema, searchFields, relations, middleware = [], userTracking, relationFields, readOnly = false } = options;
   
-  // 创建CRUD服务实例
-  // 抽象类不能直接实例化,需要创建具体实现类
-  class ConcreteCrudService extends GenericCrudService<T> {
-    constructor() {
-      super(AppDataSource, entity, { userTracking, relationFields });
-    }
-  }
-  const crudService = new ConcreteCrudService();
-  
   // 创建路由实例
   const app = new OpenAPIHono<AuthContext>();
   
@@ -227,7 +218,7 @@ export function createCrudRoutes<
         try {
           const query = c.req.valid('query') as any;
           const { page, pageSize, keyword, sortBy, sortOrder, filters } = query;
-          
+
           // 构建排序对象
           const order: any = {};
           if (sortBy) {
@@ -235,7 +226,7 @@ export function createCrudRoutes<
           } else {
             order['id'] = 'DESC';
           }
-          
+
           // 解析筛选条件
           let parsedFilters: any = undefined;
           if (filters) {
@@ -245,7 +236,11 @@ export function createCrudRoutes<
               return c.json({ code: 400, message: '筛选条件格式错误' }, 400);
             }
           }
-          
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
+
           const [data, total] = await crudService.getList(
             page,
             pageSize,
@@ -256,7 +251,7 @@ export function createCrudRoutes<
             order,
             parsedFilters
           );
-          
+
           return c.json({
             // data: z.array(listSchema).parse(data),
             data: await parseWithAwait(z.array(listSchema), data),
@@ -276,6 +271,11 @@ export function createCrudRoutes<
         try {
           const data = c.req.valid('json');
           const user = c.get('user');
+
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
           const result = await crudService.create(data, user?.id);
           return c.json(result, 201);
         } catch (error) {
@@ -291,12 +291,17 @@ export function createCrudRoutes<
       .openapi(getRouteDef, async (c: any) => {
         try {
           const { id } = c.req.valid('param');
+
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
           const result = await crudService.getById(id, relations || []);
-          
+
           if (!result) {
             return c.json({ code: 404, message: '资源不存在' }, 404);
           }
-          
+
           // return c.json(await getSchema.parseAsync(result), 200);
           return c.json(await parseWithAwait(getSchema, result), 200);
         } catch (error) {
@@ -314,12 +319,17 @@ export function createCrudRoutes<
           const { id } = c.req.valid('param');
           const data = c.req.valid('json');
           const user = c.get('user');
+
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
           const result = await crudService.update(id, data, user?.id);
-          
+
           if (!result) {
             return c.json({ code: 404, message: '资源不存在' }, 404);
           }
-          
+
           return c.json(result, 200);
         } catch (error) {
           if (error instanceof z.ZodError) {
@@ -334,12 +344,17 @@ export function createCrudRoutes<
       .openapi(deleteRouteDef, async (c: any) => {
         try {
           const { id } = c.req.valid('param');
+
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
           const success = await crudService.delete(id);
-          
+
           if (!success) {
             return c.json({ code: 404, message: '资源不存在' }, 404);
           }
-          
+
           return c.body(null, 204);
         } catch (error) {
           if (error instanceof z.ZodError) {
@@ -360,7 +375,7 @@ export function createCrudRoutes<
         try {
           const query = c.req.valid('query') as any;
           const { page, pageSize, keyword, sortBy, sortOrder, filters } = query;
-          
+
           // 构建排序对象
           const order: any = {};
           if (sortBy) {
@@ -368,7 +383,7 @@ export function createCrudRoutes<
           } else {
             order['id'] = 'DESC';
           }
-          
+
           // 解析筛选条件
           let parsedFilters: any = undefined;
           if (filters) {
@@ -378,7 +393,11 @@ export function createCrudRoutes<
               return c.json({ code: 400, message: '筛选条件格式错误' }, 400);
             }
           }
-          
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
+
           const [data, total] = await crudService.getList(
             page,
             pageSize,
@@ -389,7 +408,7 @@ export function createCrudRoutes<
             order,
             parsedFilters
           );
-          
+
           return c.json({
             data: await parseWithAwait(z.array(listSchema), data),
             pagination: { total, current: page, pageSize }
@@ -407,12 +426,17 @@ export function createCrudRoutes<
       .openapi(getRouteDef, async (c: any) => {
         try {
           const { id } = c.req.valid('param');
+
+          const crudService = new ConcreteCrudService(entity, {
+            userTracking: userTracking,
+            relationFields: relationFields
+          });
           const result = await crudService.getById(id, relations || []);
-          
+
           if (!result) {
             return c.json({ code: 404, message: '资源不存在' }, 404);
           }
-          
+
           return c.json(await parseWithAwait(getSchema, result), 200);
         } catch (error) {
           if (error instanceof z.ZodError) {