Sfoglia il codice sorgente

🔒 feat(geo-areas-mt): 实现基于认证的租户ID获取机制

- 移除所有接口查询参数中的tenantId字段
- 集成authMiddleware认证中间件,从认证上下文获取租户ID
- 调整OpenAPIHono类型为AuthContext以支持上下文数据获取
- 修改所有路由处理逻辑,从c.get('tenantId')获取租户ID
- 更新测试查询工厂,移除默认tenantId参数

♻️ refactor(geo-areas-mt): 优化地区查询参数处理

- 在getTownsRoute路由添加authMiddleware认证中间件
- 为districtId和cityId参数添加非空断言,确保类型安全
- 统一所有接口的租户ID获取方式,提升代码一致性
yourname 1 mese fa
parent
commit
04e9caf623

+ 14 - 23
packages/geo-areas-mt/src/api/areas/index.mt.ts

@@ -3,13 +3,11 @@ import { z } from '@hono/zod-openapi';
 import { AreaServiceMt } from '../../modules/areas/area.service.mt';
 import { AreaLevel } from '../../modules/areas/area.entity.mt';
 import { AppDataSource } from '@d8d/shared-utils';
+import { authMiddleware } from '@d8d/auth-module-mt';
+import { AuthContext } from '@d8d/shared-types';
 
 // 省份查询参数Schema(多租户)
 const getProvincesSchema = z.object({
-  tenantId: z.coerce.number<number>().int().positive('租户ID必须为正整数').openapi({
-    example: 1,
-    description: '租户ID'
-  }),
   page: z.coerce.number<number>().int().min(1).default(1).openapi({
     example: 1,
     description: '页码'
@@ -22,10 +20,6 @@ const getProvincesSchema = z.object({
 
 // 城市查询参数Schema(多租户)
 const getCitiesSchema = z.object({
-  tenantId: z.coerce.number<number>().int().positive('租户ID必须为正整数').openapi({
-    example: 1,
-    description: '租户ID'
-  }),
   provinceId: z.coerce.number<number>().int().positive('省份ID必须为正整数').openapi({
     example: 1,
     description: '省份ID'
@@ -42,10 +36,6 @@ const getCitiesSchema = z.object({
 
 // 区县查询参数Schema(多租户)
 const getDistrictsSchema = z.object({
-  tenantId: z.coerce.number<number>().int().positive('租户ID必须为正整数').openapi({
-    example: 1,
-    description: '租户ID'
-  }),
   cityId: z.coerce.number<number>().int().positive('城市ID必须为正整数').openapi({
     example: 34,
     description: '城市ID'
@@ -62,10 +52,6 @@ const getDistrictsSchema = z.object({
 
 // 街道查询参数Schema(多租户)
 const getTownsSchema = z.object({
-  tenantId: z.coerce.number<number>().int().positive('租户ID必须为正整数').openapi({
-    example: 1,
-    description: '租户ID'
-  }),
   districtId: z.coerce.number<number>().int().positive('区县ID必须为正整数').openapi({
     example: 3401,
     description: '区县ID'
@@ -234,6 +220,7 @@ const getDistrictsRoute = createRoute({
 const getTownsRoute = createRoute({
   method: 'get',
   path: '/towns',
+  middleware: [ authMiddleware ],
   request: {
     query: getTownsSchema
   },
@@ -255,10 +242,11 @@ const getTownsRoute = createRoute({
   }
 });
 
-const app = new OpenAPIHono()
+const app = new OpenAPIHono<AuthContext>()
   .openapi(getProvincesRoute, async (c) => {
     try {
-      const { tenantId, page, pageSize } = c.req.valid('query');
+      const { page, pageSize } = c.req.valid('query');
+      const tenantId = c.get('tenantId')!;
       const areaService = new AreaServiceMt(AppDataSource);
 
       // 使用高效查询方法获取指定租户的省份数据
@@ -292,7 +280,8 @@ const app = new OpenAPIHono()
   })
   .openapi(getCitiesRoute, async (c) => {
     try {
-      const { tenantId, provinceId, page, pageSize } = c.req.valid('query');
+      const { provinceId, page, pageSize } = c.req.valid('query');
+      const tenantId = c.get('tenantId')!;
       const areaService = new AreaServiceMt(AppDataSource);
 
       // 使用高效查询方法获取指定租户和省份下的城市数据
@@ -326,11 +315,12 @@ const app = new OpenAPIHono()
   })
   .openapi(getDistrictsRoute, async (c) => {
     try {
-      const { tenantId, cityId, page, pageSize } = c.req.valid('query');
+      const { cityId, page, pageSize } = c.req.valid('query');
+      const tenantId = c.get('tenantId')!;
       const areaService = new AreaServiceMt(AppDataSource);
 
       // 使用高效查询方法获取指定租户和城市下的区县数据
-      const districts = await areaService.getAreasByLevelAndParent(tenantId, AreaLevel.DISTRICT, cityId);
+      const districts = await areaService.getAreasByLevelAndParent(tenantId, AreaLevel.DISTRICT, cityId!);
 
       // 分页
       const startIndex = (page - 1) * pageSize;
@@ -360,11 +350,12 @@ const app = new OpenAPIHono()
   })
   .openapi(getTownsRoute, async (c) => {
     try {
-      const { tenantId, districtId, page, pageSize } = c.req.valid('query');
+      const { districtId, page, pageSize } = c.req.valid('query');
+      const tenantId = c.get('tenantId')!;
       const areaService = new AreaServiceMt(AppDataSource);
 
       // 使用高效查询方法获取指定租户和区县下的街道数据
-      const towns = await areaService.getAreasByLevelAndParent(tenantId, AreaLevel.TOWN, districtId);
+      const towns = await areaService.getAreasByLevelAndParent(tenantId, AreaLevel.TOWN, districtId!);
 
       // 分页
       const startIndex = (page - 1) * pageSize;

+ 0 - 8
packages/geo-areas-mt/tests/utils/test-query-factory.ts

@@ -7,7 +7,6 @@ export class TestQueryFactory {
    */
   static createProvincesQuery(overrides: any = {}): any {
     return {
-      tenantId: 1,
       page: 1,
       pageSize: 50,
       ...overrides
@@ -19,7 +18,6 @@ export class TestQueryFactory {
    */
   static createCitiesQuery(provinceId: number, overrides: any = {}): any {
     return {
-      tenantId: 1,
       provinceId,
       page: 1,
       pageSize: 50,
@@ -32,7 +30,6 @@ export class TestQueryFactory {
    */
   static createDistrictsQuery(cityId: number, overrides: any = {}): any {
     return {
-      tenantId: 1,
       cityId,
       page: 1,
       pageSize: 50,
@@ -45,7 +42,6 @@ export class TestQueryFactory {
    */
   static createTreeQuery(overrides: any = {}): any {
     return {
-      tenantId: 1,
       ...overrides
     };
   }
@@ -55,7 +51,6 @@ export class TestQueryFactory {
    */
   static createTreeByLevelQuery(level: number, overrides: any = {}): any {
     return {
-      tenantId: 1,
       ...overrides
     };
   }
@@ -65,7 +60,6 @@ export class TestQueryFactory {
    */
   static createSubTreeQuery(id: number, overrides: any = {}): any {
     return {
-      tenantId: 1,
       ...overrides
     };
   }
@@ -75,7 +69,6 @@ export class TestQueryFactory {
    */
   static createAreaPathQuery(id: number, overrides: any = {}): any {
     return {
-      tenantId: 1,
       ...overrides
     };
   }
@@ -85,7 +78,6 @@ export class TestQueryFactory {
    */
   static createPaginationQuery(page: number = 1, pageSize: number = 50, overrides: any = {}): any {
     return {
-      tenantId: 1,
       page,
       pageSize,
       ...overrides