use std::collections::HashMap;
use crate::engine::{payloads, BpmEngine, EngineContext, EngineEvent};
use crate::model::ProcessInstance;
pub struct ProcessService;
impl ProcessService {
pub fn start_process(
process_id: &str,
instance_id: Option<String>,
engine: &BpmEngine,
ctx: &mut EngineContext,
) -> Result<String, Box<dyn std::error::Error + Send + Sync>> {
let instance_id = instance_id.unwrap_or_else(|| uuid::Uuid::new_v4().to_string());
engine.run(
EngineEvent::ProcessStarted(payloads::ProcessStarted {
process_id: process_id.to_string(),
instance_id: instance_id.clone(),
}),
ctx,
);
Ok(instance_id)
}
pub fn get_process(
instance_id: &str,
ctx: &EngineContext,
) -> Option<ProcessInstance> {
ctx.process_repo.as_ref().and_then(|r| r.load(instance_id))
}
}
pub struct TaskService;
impl TaskService {
pub fn complete_task(
instance_id: &str,
node_id: &str,
task_id: &str,
variables: HashMap<String, String>,
engine: &BpmEngine,
ctx: &mut EngineContext,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
engine.run(
EngineEvent::UserTaskCompleted(payloads::UserTaskCompleted {
task_id: task_id.to_string(),
instance_id: instance_id.to_string(),
node_id: node_id.to_string(),
variables,
}),
ctx,
);
Ok(())
}
}