Explorar o código

✨ feat(activity): 完善活动获取Schema
- 新增name、description、type等字段的验证规则
- 添加startDate、endDate等日期字段的类型转换

✨ feat(route): 完善路线获取Schema
- 新增name、startPoint、endPoint等字段的验证规则
- 添加price、seatCount等数值字段的范围限制

✅ test(activities): 更新活动管理测试用例
- 使用ActivityType枚举替代字符串字面量
- 修复筛选查询参数的格式问题

✅ test(routes): 更新路线管理测试用例
- 修复筛选查询参数的格式问题

yourname hai 4 meses
pai
achega
b7155900af

+ 12 - 0
src/server/modules/activities/activity.schema.ts

@@ -39,6 +39,18 @@ export const updateActivitySchema = z.object({
 // 活动获取Schema
 export const getActivitySchema = z.object({
   id: z.number().int().positive('ID必须为正整数'),
+  name: z.string().min(1, '活动名称不能为空').max(255, '活动名称不能超过255个字符'),
+  description: z.string().max(1000, '活动描述不能超过1000个字符').optional().nullable(),
+  type: z.nativeEnum(ActivityType, {
+    message: '活动类型必须是departure(去程)或return(返程)'
+  }),
+  startDate: z.coerce.date(),
+  endDate: z.coerce.date(),
+  isDisabled: z.nativeEnum(DisabledStatus),
+  createdAt: z.coerce.date(),
+  updatedAt: z.coerce.date(),
+  createdBy: z.number().int().optional(),
+  updatedBy: z.number().int().optional(),
 });
 
 // 活动列表查询Schema

+ 17 - 0
src/server/modules/routes/route.schema.ts

@@ -38,6 +38,23 @@ export const updateRouteSchema = z.object({
 // 路线获取Schema
 export const getRouteSchema = z.object({
   id: z.number().int().positive('ID必须为正整数'),
+  name: z.string().min(1, '路线名称不能为空').max(255, '路线名称不能超过255个字符'),
+  description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
+  startPoint: z.string().min(1, '出发地不能为空').max(255, '出发地不能超过255个字符'),
+  endPoint: z.string().min(1, '目的地不能为空').max(255, '目的地不能超过255个字符'),
+  pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
+  dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
+  departureTime: z.coerce.date(),
+  vehicleType: z.string().min(1, '车型不能为空').max(50, '车型不能超过50个字符'),
+  price: z.coerce.number().min(0, '价格不能为负数').max(99999999.99, '价格不能超过99999999.99'),
+  seatCount: z.number().int().min(1, '座位数至少为1').max(1000, '座位数不能超过1000'),
+  availableSeats: z.number().int().min(0, '可用座位数不能为负数').max(1000, '可用座位数不能超过1000'),
+  activityId: z.number().int().positive('活动ID必须为正整数'),
+  isDisabled: z.nativeEnum(DisabledStatus),
+  createdAt: z.coerce.date(),
+  updatedAt: z.coerce.date(),
+  createdBy: z.number().int().optional(),
+  updatedBy: z.number().int().optional(),
 });
 
 // 路线列表查询Schema

+ 6 - 6
tests/integration/server/admin/activities.integration.test.ts

@@ -122,8 +122,8 @@ describe('活动管理API集成测试', () => {
       if (!dataSource) throw new Error('Database not initialized');
 
       // 创建几个测试活动
-      await TestDataFactory.createTestActivity(dataSource, { name: '活动1', type: 'departure' as const });
-      await TestDataFactory.createTestActivity(dataSource, { name: '活动2', type: 'return' as const });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动1', type: ActivityType.DEPARTURE });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动2', type: ActivityType.RETURN });
 
       const response = await client.activities.$get({
         query: {}
@@ -416,12 +416,12 @@ describe('活动管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       if (!dataSource) throw new Error('Database not initialized');
 
-      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动1', type: 'departure' as const });
-      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动2', type: 'departure' as const });
-      await TestDataFactory.createTestActivity(dataSource, { name: '返程活动1', type: 'return' as const });
+      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动1', type: ActivityType.DEPARTURE });
+      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动2', type: ActivityType.DEPARTURE });
+      await TestDataFactory.createTestActivity(dataSource, { name: '返程活动1', type: ActivityType.RETURN });
 
       const response = await client.activities.$get({
-        query: { filters: { type: 'departure' } }
+        query: { filters: JSON.stringify({ type: ActivityType.DEPARTURE }) }
       },
       {
         headers: {

+ 1 - 1
tests/integration/server/admin/routes.integration.test.ts

@@ -460,7 +460,7 @@ describe('路线管理API集成测试', () => {
       await TestDataFactory.createTestRoute(dataSource, { name: '中巴路线', vehicleType: 'van' });
 
       const response = await client.routes.$get({
-        query: { filters: { vehicleType: 'bus' } }
+        query: { filters: JSON.stringify({ vehicleType: 'bus' }) }
       },
       {
         headers: {