use std::sync::Arc;
use async_trait::async_trait;
use backbone_core::trigger::{
ActionExecutor, TriggerContext, TriggerContextMut, TriggerEvent, TriggerHandler, TriggerRegistry,
};
use crate::domain::entity::ConversionJob;
pub type ConversionJobTriggerEvent = TriggerEvent;
pub type ConversionJobTriggerContext = TriggerContext<ConversionJob>;
pub type ConversionJobTriggerContextMut = TriggerContextMut<ConversionJob>;
pub type ConversionJobActionExecutor = ActionExecutor;
pub type ConversionJobTriggerRegistry = TriggerRegistry<ConversionJob>;
pub type ConversionJobTriggerHandlerObj =
dyn TriggerHandler<TriggerContext<ConversionJob>, TriggerEvent>;
pub struct ConversionJobAfterCreateHandler1 {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
pub action_executor: Option<Arc<ConversionJobActionExecutor>>,
}
impl ConversionJobAfterCreateHandler1 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::ConversionJobEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<ConversionJobActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobAfterCreateHandler1 {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
if let Some(publisher) = &self.event_publisher {
publisher.publish_created(ctx.entity.clone(), ctx.user_id.clone()).await?;
}
Ok(())
}
}
pub struct ConversionJobAfterCreateHandler2 {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
pub action_executor: Option<Arc<ConversionJobActionExecutor>>,
}
impl ConversionJobAfterCreateHandler2 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::ConversionJobEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<ConversionJobActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobAfterCreateHandler2 {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct ConversionJobAfterCreateHandler3 {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
pub action_executor: Option<Arc<ConversionJobActionExecutor>>,
}
impl ConversionJobAfterCreateHandler3 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::ConversionJobEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<ConversionJobActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobAfterCreateHandler3 {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct ConversionJobAfterCreateHandler4 {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
pub action_executor: Option<Arc<ConversionJobActionExecutor>>,
}
impl ConversionJobAfterCreateHandler4 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::ConversionJobEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<ConversionJobActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobAfterCreateHandler4 {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct ConversionJobAfterCreateHandler5 {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
pub action_executor: Option<Arc<ConversionJobActionExecutor>>,
}
impl ConversionJobAfterCreateHandler5 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::ConversionJobEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<ConversionJobActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobAfterCreateHandler5 {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct ConversionJobOnEnterPendingHandler {}
impl ConversionJobOnEnterPendingHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobOnEnterPendingHandler {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::OnEnterState("pending".to_string())]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct ConversionJobOnEnterProcessingHandler {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
}
impl ConversionJobOnEnterProcessingHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobOnEnterProcessingHandler {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::OnEnterState("processing".to_string())]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
Ok(())
}
}
pub struct ConversionJobOnEnterCompletedHandler {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
}
impl ConversionJobOnEnterCompletedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobOnEnterCompletedHandler {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::OnEnterState("completed".to_string())]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct ConversionJobOnEnterFailedHandler {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
}
impl ConversionJobOnEnterFailedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobOnEnterFailedHandler {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::OnEnterState("failed".to_string())]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct ConversionJobOnEnterCancelledHandler {
pub event_publisher: Option<Arc<crate::domain::event::ConversionJobEventPublisher>>,
}
impl ConversionJobOnEnterCancelledHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<ConversionJobTriggerContext, ConversionJobTriggerEvent> for ConversionJobOnEnterCancelledHandler {
fn events(&self) -> Vec<ConversionJobTriggerEvent> {
vec![TriggerEvent::OnEnterState("cancelled".to_string())]
}
async fn handle(&self, ctx: &ConversionJobTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub fn conversion_job_trigger_registry() -> ConversionJobTriggerRegistry {
TriggerRegistry::build(|r| {
r.register(Arc::new(ConversionJobAfterCreateHandler1::new()));
r.register(Arc::new(ConversionJobAfterCreateHandler2::new()));
r.register(Arc::new(ConversionJobAfterCreateHandler3::new()));
r.register(Arc::new(ConversionJobAfterCreateHandler4::new()));
r.register(Arc::new(ConversionJobAfterCreateHandler5::new()));
r.register(Arc::new(ConversionJobOnEnterPendingHandler::new()));
r.register(Arc::new(ConversionJobOnEnterProcessingHandler::new()));
r.register(Arc::new(ConversionJobOnEnterCompletedHandler::new()));
r.register(Arc::new(ConversionJobOnEnterFailedHandler::new()));
r.register(Arc::new(ConversionJobOnEnterCancelledHandler::new()));
})
}