In Progress
As a 开发者, I want 将channel_info模块从allin_system-master移植为独立包@d8d/allin-channel-module,完成技术栈转换并验证功能完整性, so that 我们可以将Allin系统的渠道管理功能集成到当前项目中,遵循现有的模块化架构和编码标准。
allin-packages/channel-module目录结构Channel实体从下划线命名转换为驼峰命名@d8d/allin-channel-module包名,workspace依赖allin-packages/channel-module目录结构 (AC: 1)
allin-packages/channel-module/目录package.json文件,配置包名@d8d/allin-channel-module和workspace依赖packages/advertisements-module/package.json@d8d/allin-channel-module,依赖调整tsconfig.json文件,配置TypeScript编译选项packages/advertisements-module/tsconfig.jsonvitest.config.ts文件,配置测试环境packages/advertisements-module/vitest.config.tssrc/目录结构:entities/, services/, routes/, schemas/, types/packages/advertisements-module/src/目录结构Channel实体从下划线命名转换为驼峰命名 (AC: 2)
allin_system-master/server/src/channel_info/channel.entity.tsallin_system-master/server/src/channel_info/channel.entity.tssrc/entities/channel.entity.tspackages/advertisements-module/src/entities/advertisement.entity.tschannel_id → channelId, channel_name → channelName等@Column({ name: 'channel_name', type: 'varchar', length: 100 })@Entity('channel_info')allin_system-master/server/src/channel_info/channel.service.tsallin_system-master/server/src/channel_info/channel.service.tssrc/services/channel.service.tspackages/advertisements-module/src/services/advertisement.service.tsGenericCrudService<Channel>GenericCrudService<Channel>,配置搜索字段packages/shared-crud/src/services/generic-crud.service.tscreateChannel, deleteChannel, updateChannel, searchByNamecreate方法:添加渠道名称唯一性检查channel_name是否已存在,避免重复创建channel.service.ts:14-37中的重复检查逻辑update方法:添加渠道存在性和名称重复检查channel.service.ts:69-93中的更新验证逻辑delete方法:保持硬删除或改为软删除channel.service.ts:39-42)status字段实现软删除findAll方法:返回{ data: Channel[], total: number }格式channel.service.ts:44-51中的分页查询searchByName方法:按名称模糊搜索Like操作符进行模糊匹配channel.service.ts:53-63中的搜索功能contact_person, contact_phone, channel_type, description, status, create_time, update_timechannel.service.ts:24-33中的默认值设置allin_system-master/server/src/channel_info/channel.controller.tsallin_system-master/server/src/channel_info/channel.controller.tssrc/routes/channel.routes.tspackages/advertisements-module/src/routes/advertisements.tsOpenAPIHono创建路由OpenAPIHono创建路由实例createChannel, deleteChannel, updateChannel, getAllChannels, searchChannels, getChannelpackages/auth-module/src/middleware/auth.middleware.tspackages/core-module/system-config-module/src/routes/system-config.routes.tsnew OpenAPIHono().route()聚合多个路由实例channel-custom.routes.ts(自定义业务逻辑路由)channel-crud.routes.ts(使用createCrudRoutes生成的CRUD路由).route('/', customRoutes).route('/', crudRoutes)src/routes/channel-custom.routes.tspackages/core-module/user-module/src/routes/custom.routes.tspackages/core-module/system-config-module/src/routes/custom/create-system-config.tscreateRoute定义路由,OpenAPIHono实例处理请求POST /createChannel路由:处理布尔返回值{ success: true },失败返回{ success: false, message: "渠道名称已存在" }channel.controller.ts:11-14,channel.service.ts:14-37user-module/custom.routes.ts:11-42中的createUserRoutePOST /deleteChannel路由:处理布尔返回值{ success: true },失败返回{ success: false }channel.controller.ts:16-19,channel.service.ts:39-42user-module/custom.routes.ts:89-118中的deleteUserRoutePOST /updateChannel路由:处理布尔返回值{ success: true },失败返回{ success: false, message: "渠道不存在或名称重复" }channel.controller.ts:21-24,channel.service.ts:69-93user-module/custom.routes.ts:44-87中的updateUserRouteGET /getAllChannels路由:处理分页参数和返回格式skip, take查询参数{ data: Channel[], total: number }channel.controller.ts:26-29,channel.service.ts:44-51system-config-module中的查询模式GET /searchChannels路由:处理搜索功能name(搜索关键词),skip, take(分页参数){ data: Channel[], total: number }channel.controller.ts:31-34,channel.service.ts:53-63shared-crud中的搜索参数处理GET /getChannel/:id路由:处理单个渠道查询id路径参数Channel对象或nullchannel.controller.ts:36-39,channel.service.ts:65-67user-module/custom.routes.ts中的参数验证和错误处理src/routes/channel-crud.routes.tspackages/advertisements-module/src/routes/advertisements.tscreateCrudRoutes生成标准CRUD路由entity, createSchema, updateSchema, getSchema, listSchema, searchFields等参数readOnly: true,因为创建、更新、删除操作通过自定义路由处理allin_system-master/server/src/channel_info/channel.dto.tsallin_system-master/server/src/channel_info/channel.dto.tssrc/schemas/channel.schema.tspackages/advertisements-module/src/schemas/advertisement.schema.tsz.object()定义CreateChannelSchema, UpdateChannelSchema, DeleteChannelSchema@d8d/allin-channel-module包名,workspace依赖 (AC: 6)
package.json中的name字段为@d8d/allin-channel-modulepackages/advertisements-module/package.jsontype: "module"和主入口src/index.ts@d8d/core-module, @d8d/shared-crud, @d8d/shared-utils@hono/zod-openapi, typeorm, zodservices, schemas, routes, entitiestests/integration/channel.integration.test.tspackages/advertisements-module/tests/integration/advertisements.integration.test.tsadvertisements-module的集成测试模式testClient, setupIntegrationDatabaseHooksWithEntitiestestClient创建测试客户端setupIntegrationDatabaseHooksWithEntities设置测试数据库@d8d/shared-test-util中的测试基础设施pnpm typecheck确保无类型错误pnpm test确保所有测试通过pnpm test:integration验证集成测试core-module作为聚合包,移除了多租户相关代码 [Source: docs/stories/006.001.create-core-module-and-update-config.story.md]Channel实体包含以下字段 [Source: allin_system-master/server/src/channel_info/channel.entity.ts]:
channel_id: number (主键,自增)channel_name: string (渠道名称)channel_type: string (渠道类型)contact_person: string (联系人)contact_phone: string (联系电话)description?: string (描述,可选)status: number (状态,默认1)create_time: Date (创建时间)update_time: Date (更新时间)channel_info表名不变需要覆盖GenericCrudService的方法:
create方法:需要添加渠道名称唯一性检查,避免重复创建channel.service.ts:14-37 - 检查channel_name是否已存在contact_person, contact_phone, channel_type, description为空字符串,status为1,create_time和update_time为当前时间update方法:需要检查渠道存在性和名称重复性channel.service.ts:69-93 - 检查渠道是否存在,检查更新后的名称是否与其他渠道重复update_time为当前时间delete方法:当前为硬删除,考虑改为软删除(使用status字段)channel.service.ts:39-42 - 直接删除记录status为0或删除状态findAll方法:需要返回{ data: Channel[], total: number }格式channel.service.ts:44-51 - 使用findAndCount返回数据和总数channel_id降序排列searchByName方法:按名称模糊搜索channel.service.ts:53-63 - 使用Like操作符进行模糊匹配{ data: Channel[], total: number }需要自定义路由处理:
createChannel, deleteChannel, updateChannel返回boolean而非实体对象{ success: true }{ success: false, message: "错误信息" }getAllChannels和searchChannels需要处理skip和take查询参数searchChannels需要处理name搜索参数与GenericCrudService的差异:
POST /channel/createChannel - 创建渠道POST /channel/deleteChannel - 删除渠道POST /channel/updateChannel - 更新渠道GET /channel/getAllChannels - 获取所有渠道(分页)GET /channel/searchChannels - 搜索渠道(按名称)GET /channel/getChannel/:id - 获取单个渠道详情@UseGuards(JwtAuthGuard))createChannel: 检查名称重复,设置默认值,插入数据deleteChannel: 根据ID删除findAll: 分页查询,按ID降序排序searchByName: 按名称模糊搜索,分页查询findOne: 根据ID查询单个updateChannel: 检查存在性,检查名称重复,更新数据GenericCrudService,复用现有CRUD模式,保持业务逻辑CreateChannelDto: channel_name(必填), channel_type(可选), contact_person(可选), contact_phone(可选), description(可选)UpdateChannelDto: channel_id(必填), channel_name(可选), channel_type(可选), contact_person(可选), contact_phone(可选), description(可选)DeleteChannelDto: channel_id(必填)class-validator → Zod Schema,添加详细的验证规则allin-packages/channel-module/ (根据史诗007的目录结构决策)allin_system-master/server/src/channel_info/channel.entity.tsallin_system-master/server/src/channel_info/channel.service.tsallin_system-master/server/src/channel_info/channel.controller.tsallin_system-master/server/src/channel_info/channel.dto.tssrc/entities/channel.entity.tspackages/advertisements-module/src/entities/advertisement.entity.tssrc/services/channel.service.tspackages/advertisements-module/src/services/advertisement.service.tssrc/routes/channel.routes.tspackages/core-module/system-config-module/src/routes/system-config.routes.tssrc/routes/channel-custom.routes.tspackages/core-module/user-module/src/routes/custom.routes.tspackages/core-module/system-config-module/src/routes/custom/create-system-config.tssrc/routes/channel-crud.routes.tspackages/advertisements-module/src/routes/advertisements.tscreateCrudRoutes生成标准CRUD路由,设置readOnly: truesrc/schemas/channel.schema.tspackages/advertisements-module/src/schemas/advertisement.schema.tstests/integration/channel.integration.test.tspackages/advertisements-module/tests/integration/advertisements.integration.test.tspackage.json, tsconfig.json, vitest.config.tspackages/advertisements-module/中的对应配置文件tests/integration/目录 [Source: architecture/testing-strategy.md#测试金字塔策略]advertisements-module的集成测试模式 [Source: packages/advertisements-module/tests/integration/advertisements.integration.test.ts]@d8d/shared-test-util中的测试基础设施 [Source: architecture/testing-strategy.md#包测试架构]src/index.ts统一导出 [Source: architecture/source-tree.md#包结构规范]allin-packages/目录,而非通用的packages/目录@d8d/allin-前缀,-module后缀,非多租户版本@d8d/core-module和其他共享包tests/integration/目录 [Source: architecture/testing-strategy.md#集成测试]| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-02 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
此部分由开发代理在实现过程中填写
Claude Code (d8d-model)
创建的文件:
修改的文件:
Results from QA Agent QA review of the completed story implementation