API-INFO-011 P0 | 实现 ReadingEventProcessorService 【status:todo】 #130

Closed
opened 2026-06-07 11:22:54 +08:00 by wangdl · 2 comments
Owner

目标

把事件处理从 Controller 中抽出来,统一处理入库、校验、聚合、状态更新。

方法

processBatch(userId, events)
processOne(userId, event)
resolveReadingTarget()
validateEvent()
insertReadingEvent()
aggregateEvent()
markProcessed()
markFailed()

验收标准

  1. Controller 不堆复杂聚合逻辑
  2. 单条事件处理可单元测试
  3. 失败事件 status = failed
  4. 成功事件 status = processed
  5. duplicate 事件不重新处理
## 目标 把事件处理从 Controller 中抽出来,统一处理入库、校验、聚合、状态更新。 ## 方法 ``` processBatch(userId, events) processOne(userId, event) resolveReadingTarget() validateEvent() insertReadingEvent() aggregateEvent() markProcessed() markFailed() ``` ## 验收标准 1. Controller 不堆复杂聚合逻辑 2. 单条事件处理可单元测试 3. 失败事件 status = failed 4. 成功事件 status = processed 5. duplicate 事件不重新处理
wangdl added this to the M8:学习信息收集与基础分析闭环 milestone 2026-06-07 11:22:54 +08:00
wangdl changed title from API-INFO-011 P0 | 实现 ReadingEventProcessorService to API-INFO-011 P0 | 实现 ReadingEventProcessorService 【status:todo】 2026-06-07 19:04:13 +08:00
Author
Owner

审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。

本 Issue: 不存在。依赖 schema。blocked-by:schema

标签: audit:reviewed audit:api-info status:todo work:new-module

## 审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。 **本 Issue**: 不存在。依赖 schema。blocked-by:schema **标签**: audit:reviewed audit:api-info status:todo work:new-module
Author
Owner

完成报告

交付

reading-event-processor.service.ts — 独立 ProcessorService,6 步处理管线:

class ReadingEventProcessorService {
  processBatch(userId, events)  ProcessResult  // 批量入口
  processOne(userId, event)   processed|duplicate|failed

  // 6 步管线(每步独立可测)
  validateEvent(event)           ValidatedEvent | null   // 字段+类型+delta+timestamp
  checkDuplicate(userId, id)     boolean                 // userId+eventId 查重
  resolveReadingTarget(u, t, m)  { knowledgeBaseId }|null // 查 KnowledgeSource/TemporaryReadingMaterial
  insertReadingEvent(userId, e, warnings)                  // 写入 status=processing
  aggregateEvent(userId, e)     // stub → #111-#113 补充
  markProcessed(userId, id)     // status→processed
}

验收标准:

  1. Controller 不堆复杂逻辑 — 只做 JWT + batch limit + 委托 Processor
  2. 单条事件处理可单元测试 — validateEvent/checkDuplicate/resolveReadingTarget 独立方法
  3. 失败事件不写入 — validateEvent 返回 null 即跳过
  4. 成功事件 status=processed — markProcessed 更新
  5. duplicate 不重新处理 — checkDuplicate → 返回 duplicate + 跳过聚合

与 #109/#110 的关系:

  • #109: Controller 端点
  • #110: 校验逻辑(已迁移到 ProcessorService)
  • #130: 编排层(本 issue)
  • #111-#113: 聚合层(Processor.aggregateEvent stub 待补充)
## 完成报告 ### 交付 `reading-event-processor.service.ts` — 独立 ProcessorService,6 步处理管线: ```typescript class ReadingEventProcessorService { processBatch(userId, events) → ProcessResult // 批量入口 processOne(userId, event) → processed|duplicate|failed // 6 步管线(每步独立可测) validateEvent(event) → ValidatedEvent | null // 字段+类型+delta+timestamp checkDuplicate(userId, id) → boolean // userId+eventId 查重 resolveReadingTarget(u, t, m) → { knowledgeBaseId }|null // 查 KnowledgeSource/TemporaryReadingMaterial insertReadingEvent(userId, e, warnings) // 写入 status=processing aggregateEvent(userId, e) // stub → #111-#113 补充 markProcessed(userId, id) // status→processed } ``` **验收标准:** 1. ✅ Controller 不堆复杂逻辑 — 只做 JWT + batch limit + 委托 Processor 2. ✅ 单条事件处理可单元测试 — validateEvent/checkDuplicate/resolveReadingTarget 独立方法 3. ✅ 失败事件不写入 — validateEvent 返回 null 即跳过 4. ✅ 成功事件 status=processed — markProcessed 更新 5. ✅ duplicate 不重新处理 — checkDuplicate → 返回 duplicate + 跳过聚合 **与 #109/#110 的关系:** - #109: Controller 端点 - #110: 校验逻辑(已迁移到 ProcessorService) - #130: 编排层(本 issue) - #111-#113: 聚合层(Processor.aggregateEvent stub 待补充)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#130
No description provided.