use crate::clients::{api::api_client::ApiClient, error::EngineError};
const MESSAGES_ENDPOINT: &str = "/messages";
const SIGNALS_ENDPOINT: &str = "/signals";
enum EventType {
Message,
Signal,
}
#[derive(Clone)]
pub struct EventClient {
api_client: ApiClient,
pub messages_url: String,
pub signals_url: String,
}
impl EventClient {
pub fn new(api_client: ApiClient) -> EventClient {
let messages_url = format!(
"{}{}{}",
api_client.get_engine_url(),
api_client.get_engine_api_endpoint(),
MESSAGES_ENDPOINT
);
let signals_url = format!(
"{}{}{}",
api_client.get_engine_url(),
api_client.get_engine_api_endpoint(),
SIGNALS_ENDPOINT
);
EventClient {
api_client,
messages_url,
signals_url,
}
}
async fn trigger_event(
&self,
event_type: &EventType,
event_name: &str,
process_instance_id: Option<&str>,
payload: Option<&str>,
) -> Result<(), EngineError> {
let url_base = match event_type {
EventType::Message => &self.messages_url,
EventType::Signal => &self.signals_url,
};
let url = match process_instance_id {
Some(process_instance_id) => format!(
"{}/{}/trigger?processInstanceId={}",
self.messages_url, event_name, process_instance_id
),
None => format!("{}/{}/trigger", url_base, event_name),
};
let payload_json = match payload {
Some(payload) => serde_json::json!({ "payload": payload }),
None => serde_json::json!({}),
};
self.api_client.post::<()>(&url, Some(&payload_json)).await
}
pub async fn trigger_message(
&self,
message_name: &str,
process_instance_id: Option<&str>,
payload: Option<&str>,
) -> Result<(), EngineError> {
self.trigger_event(
&EventType::Message,
message_name,
process_instance_id,
payload,
)
.await
}
pub async fn trigger_signal(
&self,
signal_name: &str,
process_instance_id: Option<&str>,
payload: Option<&str>,
) -> Result<(), EngineError> {
self.trigger_event(
&EventType::Signal,
signal_name,
process_instance_id,
payload,
)
.await
}
}