use std::sync::Arc;
use async_trait::async_trait;
use backbone_core::trigger::{
ActionExecutor, TriggerContext, TriggerContextMut, TriggerEvent, TriggerHandler, TriggerRegistry,
};
use crate::domain::entity::Bucket;
pub type BucketTriggerEvent = TriggerEvent;
pub type BucketTriggerContext = TriggerContext<Bucket>;
pub type BucketTriggerContextMut = TriggerContextMut<Bucket>;
pub type BucketActionExecutor = ActionExecutor;
pub type BucketTriggerRegistry = TriggerRegistry<Bucket>;
pub type BucketTriggerHandlerObj =
dyn TriggerHandler<TriggerContext<Bucket>, TriggerEvent>;
pub struct BucketBeforeCreateHandler1 {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
pub action_executor: Option<Arc<BucketActionExecutor>>,
}
impl BucketBeforeCreateHandler1 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::BucketEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<BucketActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketBeforeCreateHandler1 {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::BeforeCreate]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct BucketAfterCreateHandler2 {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
pub action_executor: Option<Arc<BucketActionExecutor>>,
}
impl BucketAfterCreateHandler2 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::BucketEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<BucketActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketAfterCreateHandler2 {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(publisher) = &self.event_publisher {
publisher.publish_created(ctx.entity.clone(), ctx.user_id.clone()).await?;
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketAfterCreateHandler3 {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
pub action_executor: Option<Arc<BucketActionExecutor>>,
}
impl BucketAfterCreateHandler3 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::BucketEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<BucketActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketAfterCreateHandler3 {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketBeforeDeleteHandler4 {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
pub action_executor: Option<Arc<BucketActionExecutor>>,
}
impl BucketBeforeDeleteHandler4 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::BucketEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<BucketActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketBeforeDeleteHandler4 {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::BeforeDelete]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketAfterDeleteHandler5 {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
pub action_executor: Option<Arc<BucketActionExecutor>>,
}
impl BucketAfterDeleteHandler5 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::BucketEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<BucketActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketAfterDeleteHandler5 {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::AfterDelete]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketOnEnterActiveHandler {}
impl BucketOnEnterActiveHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketOnEnterActiveHandler {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::OnEnterState("active".to_string())]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketOnEnterReadonlyHandler {}
impl BucketOnEnterReadonlyHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketOnEnterReadonlyHandler {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::OnEnterState("readonly".to_string())]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketOnEnterArchivedHandler {}
impl BucketOnEnterArchivedHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketOnEnterArchivedHandler {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::OnEnterState("archived".to_string())]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct BucketOnEnterDeletedHandler {
pub event_publisher: Option<Arc<crate::domain::event::BucketEventPublisher>>,
}
impl BucketOnEnterDeletedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<BucketTriggerContext, BucketTriggerEvent> for BucketOnEnterDeletedHandler {
fn events(&self) -> Vec<BucketTriggerEvent> {
vec![TriggerEvent::OnEnterState("deleted".to_string())]
}
async fn handle(&self, ctx: &BucketTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(publisher) = &self.event_publisher {
publisher.publish_deleted(ctx.entity.id().to_string(), ctx.user_id.clone()).await?;
}
Ok(())
}
}
pub fn bucket_trigger_registry() -> BucketTriggerRegistry {
TriggerRegistry::build(|r| {
r.register(Arc::new(BucketBeforeCreateHandler1::new()));
r.register(Arc::new(BucketAfterCreateHandler2::new()));
r.register(Arc::new(BucketAfterCreateHandler3::new()));
r.register(Arc::new(BucketBeforeDeleteHandler4::new()));
r.register(Arc::new(BucketAfterDeleteHandler5::new()));
r.register(Arc::new(BucketOnEnterActiveHandler::new()));
r.register(Arc::new(BucketOnEnterReadonlyHandler::new()));
r.register(Arc::new(BucketOnEnterArchivedHandler::new()));
r.register(Arc::new(BucketOnEnterDeletedHandler::new()));
})
}