use gunnar_grpc::sso::scim::{ImportJob, ImportOrder, Imported};
use crate::job_queue::{Job, JobKind, JobQueue, JobState, Reporter};
#[derive(Debug, Clone, Default)]
pub struct ImportReport {
pub outcome: Imported,
}
pub struct SsoImport;
impl JobKind for SsoImport {
const NAME: &'static str = "sso-import";
type Order = ImportOrder;
type Report = ImportReport;
fn key(order: &ImportOrder) -> &str {
&order.account
}
fn run(&self, order: &ImportOrder, report: &Reporter<SsoImport>) -> Result<(), String> {
let progress = |done: u64, total: u64| report.progress(done, total);
let done = gunnar_grpc::sso::scim::run_import(order, crate::job_queue::now_ms(), &progress);
(order.finished)(&done);
let done = done?;
report.report(|r| r.outcome = done);
Ok(())
}
}
pub type SsoImportQueue = JobQueue<SsoImport>;
pub fn job_out(job: Job<SsoImport>) -> ImportJob {
let (done_rows, total_rows) = job.progress.unwrap_or((0, 0));
let mut outcome = job.report.outcome.clone();
outcome.dry_run = job.order.dry_run;
ImportJob {
job_id: job.job_id.clone(),
state: match job.state {
JobState::Queued => "queued",
JobState::Running => "running",
JobState::Done => "done",
JobState::Failed => "failed",
},
error: job.error.clone().unwrap_or_default(),
done_rows,
total_rows,
outcome,
}
}