定义本地持久化接口、去重规则、查询最小集合和持久化错误语义。
NewsRepositorytraitSqliteNewsRepository
- 写入对象:
NewsItem - 主键或去重键:
(source_id, title) - 幂等要求:
重复写入相同来源与标题时不新增记录,并保留更优
rank
- 最小读取接口:
list_news() -> Vec<NewsItem> - 查询过滤条件: Wave 1 暂不引入
- 排序与分页需求:
当前固定按
rank ASC, source_id ASC, title ASC
- 首版后端: SQLite
- 远程后端:
已实现基于对象布局契约的最小
S3/OSSadapter,并保留mock-s3文件系统原型用于本地验证 - 连接与初始化方式:
SqliteNewsRepository::in_memory()用于测试与最小闭环 - 远程对象存储入口:
storage.backend = "s3",由provider路由到真实s3/aws-s3/oss/aliyun-oss或本地mock-s3 - schema 管理方式: 由仓储在初始化时建表
- 建库失败:
进入
TrendRadarError::Storage - 写入失败:
进入
TrendRadarError::Storage - 去重冲突行为:
不报错,更新为更优
rank
- fixture:
fixtures/system/storage/news-roundtrip-input.json - 测试:
cargo test -p trendradar-storage - 空仓库边界:
新建仓库时检查
list_news()返回空集合 - 快照: 当前不需要,行为由结构断言覆盖
NewsItem与RssItem是否共表或分表- schema 迁移是否在首版纳入范围
- 远程对象存储的凭证治理、provider 兼容细项和失败回退策略