Skip to content

Commit 4975343

Browse files
committed
feat(photo-session): sessions.kind 会话类型字段与残留清扫(ADR-020)
1 parent b9146aa commit 4975343

22 files changed

Lines changed: 136 additions & 26 deletions

‎app/src-tauri/src/analysis_tests.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ fn detail(segments: Vec<(&str, u64, u64)>, ocr: Vec<(&str, u64)>) -> SessionDeta
1515
ended_at: Some(100),
1616
status: "finished".into(),
1717
profile: None,
18+
kind: None,
1819
};
1920
let segments = segments
2021
.into_iter()

‎app/src-tauri/src/artifact_templates_tests.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ fn detail(segments: Vec<(&str, u64, u64)>, ocr: Vec<(&str, u64)>) -> SessionDeta
1616
ended_at: Some(100),
1717
status: "finished".into(),
1818
profile: None,
19+
kind: None,
1920
};
2021
let segments = segments
2122
.into_iter()

‎app/src-tauri/src/commands_refine_inner_tests.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fn mem_db_with_session() -> (Db, i64) {
2020
title: "精修幂等测试".to_string(),
2121
source_window: None,
2222
profile: None,
23+
kind: None,
2324
})
2425
.expect("会话创建成功");
2526
(db, session.id)

‎app/src-tauri/src/commands_session.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ pub async fn create_session(
4141
title: normalize_title(title, "未命名会话"),
4242
source_window: source_window.map(|s| s.chars().take(TITLE_MAX_CHARS).collect()),
4343
profile: profile.map(|p| p.chars().take(30).collect()),
44+
// v0.11.7:命令级建会话默认视频类(图文会话走 commands_photo::start_photo_session)
45+
kind: None,
4446
};
4547
state.db.create_session(&new).map_err(|e| e.to_string())
4648
}

‎app/src-tauri/src/commands_session_batch_tests.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ fn finished_session(db: &Db, title: &str) -> i64 {
2222
title: title.into(),
2323
source_window: None,
2424
profile: None,
25+
kind: None,
2526
})
2627
.expect("create session");
2728
db.finish_session(s.id).expect("finish session");
@@ -47,6 +48,7 @@ fn recording_session(db: &Db, title: &str) -> i64 {
4748
title: title.into(),
4849
source_window: None,
4950
profile: None,
51+
kind: None,
5052
})
5153
.expect("create session")
5254
.id

‎app/src-tauri/src/commands_session_glossary_tests.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ fn lecture_detail() -> SessionDetail {
1919
ended_at: Some(5000),
2020
status: "finished".to_string(),
2121
profile: Some("lecture".to_string()),
22+
kind: None,
2223
};
2324
let ocr_blocks: Vec<SessionOcrBlock> = [1000u64, 2000, 3000]
2425
.into_iter()

‎app/src-tauri/src/db_artifacts_tests.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn replace_and_get_artifact_roundtrip() {
3636
// Arrange
3737
let db = mem_db();
3838
let session = db
39-
.create_session(&NewSession { title: "产物会话".into(), source_window: None, profile: Some("lecture".into()) })
39+
.create_session(&NewSession { title: "产物会话".into(), source_window: None, profile: Some("lecture".into()), kind: None })
4040
.unwrap();
4141
let artifact = artifact(session.id);
4242
// Act
@@ -58,7 +58,7 @@ fn replace_and_get_artifact_roundtrip() {
5858
fn replace_artifact_overwrites() {
5959
// Arrange:可重算语义——第二次构建覆盖旧产物
6060
let db = mem_db();
61-
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None }).unwrap();
61+
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None, kind: None }).unwrap();
6262
let first = artifact(session.id);
6363
db.replace_artifact(&first).unwrap();
6464
// Act:第二次(少一块)
@@ -78,7 +78,7 @@ fn replace_artifact_overwrites() {
7878
fn get_artifact_none_when_empty() {
7979
// Arrange:无产物
8080
let db = mem_db();
81-
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None }).unwrap();
81+
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None, kind: None }).unwrap();
8282
// Act/Assert:None(不报错)
8383
assert!(db.get_artifact(session.id).unwrap().is_none());
8484
}
@@ -87,7 +87,7 @@ fn get_artifact_none_when_empty() {
8787
fn delete_session_cascades_artifact() {
8888
// Arrange:产物随会话级联删除(外键)
8989
let db = mem_db();
90-
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None }).unwrap();
90+
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None, kind: None }).unwrap();
9191
db.replace_artifact(&artifact(session.id)).unwrap();
9292
// Act
9393
db.delete_session(session.id).unwrap();
@@ -99,7 +99,7 @@ fn delete_session_cascades_artifact() {
9999
fn empty_artifact_blocks_ok() {
100100
// Arrange:空块产物(模板可产出空)
101101
let db = mem_db();
102-
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None }).unwrap();
102+
let session = db.create_session(&NewSession { title: "x".into(), source_window: None, profile: None, kind: None }).unwrap();
103103
let empty = SessionArtifact { session_id: session.id, profile: "meeting".into(), blocks: Vec::new() };
104104
// Act
105105
db.replace_artifact(&empty).unwrap();

‎app/src-tauri/src/db_migrations.rs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ pub(crate) fn init_schema(conn: &Connection) -> Result<()> {
3333
ended_at INTEGER,
3434
status TEXT NOT NULL DEFAULT 'recording',
3535
-- v0.5.0 M1(REQ-043):视频类型档案标识(kebab-case;NULL=默认档案)
36-
profile TEXT
36+
profile TEXT,
37+
-- v0.11.7(图文会话,ADR-020):会话类型(NULL=实时/视频导入等视频类;'photo'=图文截屏会话)
38+
kind TEXT
3739
);
3840
-- 会话转写段(ASR final / 字幕 / 融合统一落库)
3941
CREATE TABLE IF NOT EXISTS session_segments (
@@ -167,6 +169,9 @@ CREATE TABLE IF NOT EXISTS contracts (
167169
)?;
168170
// v0.5.0 M1(REQ-043):旧库迁移——sessions 表补 profile 列(兼容既有数据库)
169171
ensure_column(conn, "sessions", "profile", "ALTER TABLE sessions ADD COLUMN profile TEXT")?;
172+
// v0.11.7(图文会话,ADR-020):旧库迁移——sessions 表补 kind 列
173+
// (NULL=视频类会话零回归;'photo'=图文截屏会话;列表徽标/残留清扫依赖此列)
174+
ensure_column(conn, "sessions", "kind", "ALTER TABLE sessions ADD COLUMN kind TEXT")?;
170175
// v0.5.0 M4(REQ-048):旧库迁移——ocr_blocks 表补 region_kind 列
171176
ensure_column(
172177
conn,

‎app/src-tauri/src/db_notes_tests.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ fn create_note_roundtrips_rule_metadata() {
167167
title: "会话".into(),
168168
source_window: None,
169169
profile: None,
170+
kind: None,
170171
})
171172
.expect("create session");
172173
let new = NewNote {
@@ -195,6 +196,7 @@ fn delete_session_keeps_note_and_breaks_link() { // Arrange
195196
title: "待删会话".into(),
196197
source_window: None,
197198
profile: None,
199+
kind: None,
198200
}).expect("create session");
199201
let note = db.create_note(&NewNote {
200202
title: "关联笔记".into(),
@@ -224,6 +226,7 @@ fn find_note_by_session_picks_latest() {
224226
title: "会话".into(),
225227
source_window: None,
226228
profile: None,
229+
kind: None,
227230
}).expect("create session");
228231
let older = db.create_note(&NewNote {
229232
title: "第一版".into(),

‎app/src-tauri/src/db_ocr_search.rs‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ mod tests {
157157
// Arrange:full 区含关键词 + subtitle 区含关键词(不应命中)
158158
let db = Db::open(":memory:").unwrap();
159159
let s = db.create_session(&NewSession {
160-
title: "PPT 课".into(), source_window: None, profile: None,
160+
title: "PPT 课".into(), source_window: None, profile: None, kind: None,
161161
}).unwrap();
162162
add_block(&db, s.id, 1000, "梯度下降算法详解", "full", None);
163163
add_block(&db, s.id, 2000, "梯度下降(字幕)", "subtitle", None);
@@ -181,7 +181,7 @@ mod tests {
181181
// Arrange:英文关键词大小写不敏感(LIKE ASCII 口径)
182182
let db = Db::open(":memory:").unwrap();
183183
let s = db.create_session(&NewSession {
184-
title: "t".into(), source_window: None, profile: None,
184+
title: "t".into(), source_window: None, profile: None, kind: None,
185185
}).unwrap();
186186
add_block(&db, s.id, 500, "Python 教程", "full", None);
187187
// Act & Assert
@@ -194,7 +194,7 @@ mod tests {
194194
// Arrange:关键词含 % 应作字面量(escape_like 口径)
195195
let db = Db::open(":memory:").unwrap();
196196
let s = db.create_session(&NewSession {
197-
title: "t".into(), source_window: None, profile: None,
197+
title: "t".into(), source_window: None, profile: None, kind: None,
198198
}).unwrap();
199199
add_block(&db, s.id, 100, "50%off 促销", "full", None);
200200
add_block(&db, s.id, 200, "普通内容", "full", None);
@@ -209,7 +209,7 @@ mod tests {
209209
// Arrange:多命中 → 结果有界
210210
let db = Db::open(":memory:").unwrap();
211211
let s = db.create_session(&NewSession {
212-
title: "t".into(), source_window: None, profile: None,
212+
title: "t".into(), source_window: None, profile: None, kind: None,
213213
}).unwrap();
214214
for i in 0..5 {
215215
add_block(&db, s.id, i * 100, &format!("关键词{}", i), "full", None);
@@ -224,7 +224,7 @@ mod tests {
224224
// 屏区间应取全部块的 min/max(与旧实现口径一致)
225225
let db = Db::open(":memory:").unwrap();
226226
let s = db.create_session(&NewSession {
227-
title: "t".into(), source_window: None, profile: None,
227+
title: "t".into(), source_window: None, profile: None, kind: None,
228228
}).unwrap();
229229
add_block(&db, s.id, 500, "字幕行一", "subtitle", Some(7));
230230
add_block(&db, s.id, 2000, "画面要点目标", "full", Some(7));
@@ -244,7 +244,7 @@ mod tests {
244244
let db = Db::open(":memory:").unwrap();
245245
let dir = tempfile::tempdir().unwrap();
246246
let s = db.create_session(&NewSession {
247-
title: "t".into(), source_window: None, profile: None,
247+
title: "t".into(), source_window: None, profile: None, kind: None,
248248
}).unwrap();
249249
add_block(&db, s.id, 1000, "有图画面", "full", None);
250250
add_block(&db, s.id, 2000, "无图画面", "full", None);

0 commit comments

Comments
 (0)