pub(crate) mod file;
pub(crate) mod migrations;
mod pages;
pub mod run;
pub mod schema;
mod store;
pub use run::{
find, start, start_inline, Duplicates, ImportJob, Match, Note, NoteKind, OnMatch, Run,
RunError, RunSpec, Status,
};
pub(crate) use pages::ImportFeature;
use laterite_core::queue::{Job, JobFailed};
use laterite_core::{EventCx, EventError, Listener, MigrationSet, Module, ModuleId};
pub const DISK: &str = "private";
pub struct ImportModule;
impl Module for ImportModule {
fn id(&self) -> ModuleId {
ModuleId::new(migrations::MODULE_ID)
}
fn migrations(&self) -> MigrationSet {
migrations::migrations()
}
fn register(&self, registry: &mut laterite_core::Registry) {
registry.listen::<JobFailed>(RunFailed);
}
}
struct RunFailed;
#[laterite_core::strata::async_trait]
impl Listener<JobFailed> for RunFailed {
async fn handle(&self, cx: &EventCx<'_>, event: &JobFailed) -> Result<(), EventError> {
if event.name != run::ImportJob::NAME {
return Ok(());
}
let Some(run_id) = event.payload.get("run_id").and_then(|v| v.as_i64()) else {
return Ok(());
};
if let Ok(Some(found)) = store::find(cx.db(), run_id).await {
if matches!(found.status, run::Status::Queued | run::Status::Running) {
store::fail(cx.db(), run_id, &event.error).await?;
}
}
Ok(())
}
}