feat(history): add Tauri commands for transcript persistence and FTS5 search

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
jake
2026-03-21 12:47:28 +00:00
parent d79ad40b33
commit 13456e1fb6
7 changed files with 341 additions and 6 deletions

View File

@@ -114,6 +114,64 @@ pub async fn delete_transcript(pool: &SqlitePool, id: &str) -> Result<()> {
Ok(())
}
// --- Segment CRUD ---
/// Batch insert segments for a transcript.
pub async fn insert_segments(
pool: &SqlitePool,
transcript_id: &str,
segments: &[(f64, f64, &str)],
) -> Result<()> {
for (start, end, text) in segments {
sqlx::query(
"INSERT INTO segments (transcript_id, start_time, end_time, text) VALUES (?, ?, ?, ?)",
)
.bind(transcript_id)
.bind(start)
.bind(end)
.bind(text)
.execute(pool)
.await
.map_err(|e| KonError::StorageError(format!("Insert segment failed: {e}")))?;
}
Ok(())
}
/// Row type for segment query results.
#[derive(Debug, Clone)]
pub struct SegmentRow {
pub id: i64,
pub transcript_id: String,
pub start_time: f64,
pub end_time: f64,
pub text: String,
}
/// Retrieve all segments for a transcript, ordered by start time.
pub async fn get_segments(
pool: &SqlitePool,
transcript_id: &str,
) -> Result<Vec<SegmentRow>> {
let rows = sqlx::query(
"SELECT id, transcript_id, start_time, end_time, text FROM segments WHERE transcript_id = ? ORDER BY start_time ASC",
)
.bind(transcript_id)
.fetch_all(pool)
.await
.map_err(|e| KonError::StorageError(format!("Get segments failed: {e}")))?;
Ok(rows
.into_iter()
.map(|r| SegmentRow {
id: r.get("id"),
transcript_id: r.get("transcript_id"),
start_time: r.get("start_time"),
end_time: r.get("end_time"),
text: r.get("text"),
})
.collect())
}
// --- Task CRUD ---
pub async fn insert_task(

View File

@@ -3,10 +3,10 @@ pub mod file_storage;
pub mod migrations;
pub use database::{
clear_timer_state, complete_task, delete_task, delete_transcript, get_setting,
get_timer_state, get_transcript, init, insert_task, insert_task_v2, insert_transcript,
list_tasks, list_tasks_by_status, list_transcripts, log_error, reorder_tasks,
save_timer_state, search_transcripts, set_setting, update_task_v2,
InsertTranscriptParams, TaskRow, TimerStateRow, TranscriptRow,
clear_timer_state, complete_task, delete_task, delete_transcript, get_segments,
get_setting, get_timer_state, get_transcript, init, insert_segments, insert_task,
insert_task_v2, insert_transcript, list_tasks, list_tasks_by_status, list_transcripts,
log_error, reorder_tasks, save_timer_state, search_transcripts, set_setting,
update_task_v2, InsertTranscriptParams, SegmentRow, TaskRow, TimerStateRow, TranscriptRow,
};
pub use file_storage::{app_data_dir, database_path, recordings_dir};