Done
作为企业用户, 我希望数据统计API具备完整的企业数据隔离安全性并正确注册到server路由, 以便确保企业数据安全隔离,防止越权访问,并保证API实际可用。
史诗上下文:此故事是史诗012(用人方小程序API补充与数据库扩展)的第15个故事,解决故事012.004已实现的数据统计API中存在的安全漏洞和路由集成缺失问题,确保企业用户数据安全隔离和API实际可用性。
companyId查询参数,企业ID强制从认证用户的JWT token中获取companyId查询参数,强制从认证token获取企业ID/api/v1/yongren/statistics@d8d/allin-statistics-module依赖,并导出EnterpriseStatisticsRoutes类型allin-packages/statistics-module/src/schemas/statistics.schema.ts
StatisticsQuerySchema中的companyId字段定义EnterpriseStatisticsQuerySchema(空的object,仅用于中间件验证)allin-packages/statistics-module/src/routes/statistics.routes.ts
EnterpriseStatisticsQuerySchema作为查询参数schemaquery.companyId || user?.companyId的逻辑user?.companyId(从enterpriseAuthMiddleware验证获取)user?.companyId为空时返回403错误(无企业权限)companyId字段使用从认证用户获取的值allin-packages/statistics-module/src/services/statistics.service.ts
companyId参数(从认证用户获取)allin-packages/statistics-module/tests/integration/statistics.integration.test.ts
companyId查询参数传递companyId参数应被忽略或返回错误allin-packages/order-module/src/routes/order-custom.routes.ts
companyId查询参数字段checkinStatisticsRoute(第582-587行)videoStatisticsRoute(第620-625行)companyOrdersRoute(第665-670行)enterpriseOrderCustomRoutes)
query.companyId || user?.companyId逻辑user?.companyIduser?.companyId为空时返回403错误allin-packages/order-module/src/services/order.service.ts
getCheckinStatistics、getVideoStatistics、getCompanyOrders方法应严格使用传入的companyIdallin-packages/order-module/tests/integration/order.integration.test.ts
companyId查询参数packages/server/package.json
"@d8d/allin-statistics-module": "workspace:*"packages/server/src/index.ts
import { statisticsRoutes } from '@d8d/allin-statistics-module'[ ] 注册路由:在同一文件中添加企业专用统计路由注册
在现有企业路由注册区域(第150-154行附近)添加:
export const enterpriseStatisticsApiRoutes = api.route('/api/v1/yongren/statistics', statisticsRoutes)
[ ] 导出类型:在同一文件的类型导出区域(第169-172行附近)添加:
export type EnterpriseStatisticsRoutes = typeof enterpriseStatisticsApiRoutes
[ ] 验证注册:运行server包集成测试,验证路由正确注册
/api/v1/yongren/statistics/disability-type-distribution等路径可访问docs/stories/011.005.story.md
companyId?查询参数描述docs/prd/epic-012-api-supplement-for-employer-mini-program.md
cd allin-packages/statistics-module && pnpm test
cd allin-packages/order-module && pnpm test
companyId查询参数cd packages/server && pnpm test
在验证故事011.005(数据统计功能实现)的API描述准确性时,发现以下问题:
companyId查询参数,允许覆盖认证用户的企业ID,违反企业数据隔离安全要求。EnterpriseStatisticsRoutes类型,前端无法获得类型安全的API客户端。根据故事012.004第158-162行的企业数据隔离实现细节:
"重要安全要求:所有统计API不接受
companyId查询参数,企业ID强制从认证用户的JWT token中获取,确保企业用户只能访问自己关联的企业数据,防止越权访问。"
当前实现违反此安全要求,必须修复。
statistics-module文件:
allin-packages/statistics-module/src/schemas/statistics.schema.ts - Schema定义allin-packages/statistics-module/src/routes/statistics.routes.ts - 路由定义allin-packages/statistics-module/src/services/statistics.service.ts - 服务层allin-packages/statistics-module/tests/integration/statistics.integration.test.ts - 集成测试order-module文件:
allin-packages/order-module/src/routes/order-custom.routes.ts - 企业统计路由定义allin-packages/order-module/src/services/order.service.ts - 订单服务allin-packages/order-module/tests/integration/order.integration.test.ts - 集成测试server包文件:
packages/server/package.json - 依赖配置packages/server/src/index.ts - 路由注册和类型导出文档文件:
docs/stories/011.005.story.md - 前端数据统计故事docs/prd/epic-012-api-supplement-for-employer-mini-program.md - 史诗012文档认证流程:
enterpriseAuthMiddleware中间件验证companyId并添加到contextc.get('user')获取包含companyId的用户对象数据过滤:
company_id过滤条件employment_order→order_person→disabled_person关联链过滤错误处理:
companyId:返回403(无企业权限)companyId但无关联数据:返回空结果或404companyId查询参数:忽略参数或返回400错误statistics-module:
allin-packages/statistics-module/src/schemas/statistics.schema.tsallin-packages/statistics-module/src/routes/statistics.routes.tsallin-packages/statistics-module/src/services/statistics.service.tsallin-packages/statistics-module/tests/integration/statistics.integration.test.tsorder-module:
allin-packages/order-module/src/routes/order-custom.routes.tsallin-packages/order-module/src/services/order.service.tsallin-packages/order-module/tests/integration/order.integration.test.tsserver包:
packages/server/package.jsonpackages/server/src/index.ts文档:
docs/stories/011.005.story.mddocs/stories/012.015.story.md(本文件)docs/prd/epic-012-api-supplement-for-employer-mini-program.md/api/v1/yongren/statistics前缀enterpriseAuthMiddleware中间件EnterpriseStatisticsRoutes类型供前端使用/api/v1/yongren/statistics/*路径可访问EnterpriseStatisticsRoutes类型可从server包导入| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 2025-12-23 | 1.0 | 初始创建(数据统计API安全修复与路由集成故事) | Claude Code |
实施完成记录 (2025-12-23):
安全漏洞修复:
StatisticsQuerySchema中的companyId字段,创建EnterpriseStatisticsQuerySchema(空对象)EnterpriseStatisticsQuerySchema,移除query.companyId || user?.companyId逻辑,改为强制从JWT token获取企业IDcheckinStatisticsRoute、videoStatisticsRoute、CompanyOrdersQuerySchema中的companyId字段路由集成:
"@d8d/allin-statistics-module": "workspace:*"依赖statisticsRoutes,注册为enterpriseStatisticsApiRoutes,路径前缀/api/v1/yongren/statisticsEnterpriseStatisticsRoutes类型供前端使用类型错误修复:
ageStats类型定义,使用Record<typeof ageGroups[number], number>文档更新:
测试验证:
提交记录:
0828d3d状态:故事所有验收标准已满足,状态更新为Done。