use serde::Serialize;
use crate::backup::{self, BackupEnvelope, ImportResult};
use crate::error::TaskError;
use crate::keys::seed_store::create_secret_store;
use crate::server::AppState;
use crate::store::keyspaces;
use vti_common::audit::{AuditEvent, BackupData};
use vti_common::error::AppError;
#[derive(Debug, Serialize, utoipa::ToSchema)]
#[schema(as = BackupExportResponse)]
pub struct ExportResponse {
pub envelope: BackupEnvelope,
}
pub(crate) async fn export_inner(
state: &AppState,
actor_did: &str,
password: &str,
include_audit: bool,
) -> Result<ExportResponse, TaskError> {
let Some(writer) = state.audit_writer.as_ref() else {
return Err(TaskError::App(AppError::Internal(
"the backup was not exported: this VTC has no audit trail to record it in, and an \
unrecorded export is not permitted"
.into(),
)));
};
let store = create_secret_store(&*state.config.read().await)?;
let envelope = backup::export_backup(state, store.as_ref(), password, include_audit).await?;
writer
.write(
actor_did,
None,
AuditEvent::BackupExported(BackupData {
keyspace_count: keyspaces::BACKED_UP.len() as u32,
vtc_did: envelope.source_did.clone(),
}),
)
.await?;
Ok(ExportResponse { envelope })
}
pub(crate) async fn import_inner(
state: &AppState,
actor_did: &str,
envelope: &BackupEnvelope,
password: &str,
confirm: bool,
) -> Result<ImportResult, TaskError> {
let store = create_secret_store(&*state.config.read().await)?;
let result = backup::import_backup(state, store.as_ref(), envelope, password, confirm).await?;
if result.status == "imported"
&& let Some(writer) = state.audit_writer.as_ref()
{
writer
.write(
actor_did,
None,
AuditEvent::BackupImported(BackupData {
keyspace_count: result.counts.len() as u32,
vtc_did: result.source_did.clone(),
}),
)
.await?;
}
Ok(result)
}