feat: Add endpoint to delete recordings

This commit introduces a new API endpoint for deleting recordings. The
endpoint
handles the removal of the audio file and its associated sidecar files
(transcript,
duration). It also invalidates derived artifacts like oneliner.json,
document.md,
and analysis_input.json. Additionally, it includes checks for path
traversal,
correct file extensions, and case ownership to ensure security and data
integrity.
A new `RecordingDeleted` event is also added to the `CaseEventKind`
enum.
This commit is contained in:
2026-04-20 15:48:34 +02:00
parent 424330aad4
commit 5effa7c96e
11 changed files with 567 additions and 34 deletions
+17
View File
@@ -20,6 +20,7 @@ use axum::extract::FromRef;
use analyze::AnalyzeSender;
use config::Config;
use gazetteer::Gazetteer;
use magic_link::MagicLinkStore;
use transcribe::TranscribeSender;
use web_session::SessionStore;
@@ -80,6 +81,8 @@ pub struct AppState {
pub analyze_busy: AnalyzeBusy,
pub transcribe_busy: TranscribeBusy,
pub events_tx: events::EventSender,
pub http_client: reqwest::Client,
pub vocab: Arc<Gazetteer>,
}
impl FromRef<AppState> for Arc<Config> {
@@ -141,6 +144,18 @@ impl FromRef<AppState> for events::EventSender {
}
}
impl FromRef<AppState> for reqwest::Client {
fn from_ref(state: &AppState) -> Self {
state.http_client.clone()
}
}
impl FromRef<AppState> for Arc<Gazetteer> {
fn from_ref(state: &AppState) -> Self {
state.vocab.clone()
}
}
/// Test/simple entrypoint: jobs pushed into either channel are dropped
/// because the receivers are not retained. Use [`create_router_with_state`]
/// from `main.rs` where real workers own the receivers.
@@ -156,6 +171,8 @@ pub fn create_router(config: Arc<Config>) -> Router {
analyze_busy: AnalyzeBusy(Arc::new(AtomicBool::new(false))),
transcribe_busy: TranscribeBusy(Arc::new(AtomicBool::new(false))),
events_tx: events::channel(),
http_client: reqwest::Client::new(),
vocab: Arc::new(Gazetteer::empty()),
})
}