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:
@@ -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(
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user