use std::sync::Arc;
use async_trait::async_trait;
use backbone_core::trigger::{
ActionExecutor, TriggerContext, TriggerContextMut, TriggerEvent, TriggerHandler, TriggerRegistry,
};
use crate::domain::entity::StoredFile;
pub type StoredFileTriggerEvent = TriggerEvent;
pub type StoredFileTriggerContext = TriggerContext<StoredFile>;
pub type StoredFileTriggerContextMut = TriggerContextMut<StoredFile>;
pub type StoredFileActionExecutor = ActionExecutor;
pub type StoredFileTriggerRegistry = TriggerRegistry<StoredFile>;
pub type StoredFileTriggerHandlerObj =
dyn TriggerHandler<TriggerContext<StoredFile>, TriggerEvent>;
pub struct StoredFileAfterCreateHandler1 {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileAfterCreateHandler1 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::StoredFileEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<StoredFileActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileAfterCreateHandler1 {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> 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 StoredFileAfterCreateHandler2 {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileAfterCreateHandler2 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::StoredFileEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<StoredFileActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileAfterCreateHandler2 {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct StoredFileAfterCreateHandler3 {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileAfterCreateHandler3 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::StoredFileEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<StoredFileActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileAfterCreateHandler3 {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
Ok(())
}
}
pub struct StoredFileBeforeDeleteHandler4 {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileBeforeDeleteHandler4 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::StoredFileEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<StoredFileActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileBeforeDeleteHandler4 {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::BeforeDelete]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct StoredFileAfterDeleteHandler5 {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileAfterDeleteHandler5 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::StoredFileEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<StoredFileActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileAfterDeleteHandler5 {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::AfterDelete]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct StoredFileOnEnterUploadingHandler {}
impl StoredFileOnEnterUploadingHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterUploadingHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("uploading".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct StoredFileOnEnterProcessingHandler {}
impl StoredFileOnEnterProcessingHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterProcessingHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("processing".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct StoredFileOnEnterActiveHandler {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
}
impl StoredFileOnEnterActiveHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterActiveHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("active".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
Ok(())
}
}
pub struct StoredFileOnEnterQuarantinedHandler {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
pub action_executor: Option<Arc<StoredFileActionExecutor>>,
}
impl StoredFileOnEnterQuarantinedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterQuarantinedHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("quarantined".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(_publisher) = &self.event_publisher {
}
if let Some(executor) = &self.action_executor {
executor.notify(ctx, "default").await?;
}
Ok(())
}
}
pub struct StoredFileOnEnterDeletedHandler {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
}
impl StoredFileOnEnterDeletedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterDeletedHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("deleted".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> 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 struct StoredFileOnEnterPurgedHandler {
pub event_publisher: Option<Arc<crate::domain::event::StoredFileEventPublisher>>,
}
impl StoredFileOnEnterPurgedHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
}
}
}
#[async_trait]
impl TriggerHandler<StoredFileTriggerContext, StoredFileTriggerEvent> for StoredFileOnEnterPurgedHandler {
fn events(&self) -> Vec<StoredFileTriggerEvent> {
vec![TriggerEvent::OnEnterState("purged".to_string())]
}
async fn handle(&self, ctx: &StoredFileTriggerContext) -> 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 stored_file_trigger_registry() -> StoredFileTriggerRegistry {
TriggerRegistry::build(|r| {
r.register(Arc::new(StoredFileAfterCreateHandler1::new()));
r.register(Arc::new(StoredFileAfterCreateHandler2::new()));
r.register(Arc::new(StoredFileAfterCreateHandler3::new()));
r.register(Arc::new(StoredFileBeforeDeleteHandler4::new()));
r.register(Arc::new(StoredFileAfterDeleteHandler5::new()));
r.register(Arc::new(StoredFileOnEnterUploadingHandler::new()));
r.register(Arc::new(StoredFileOnEnterProcessingHandler::new()));
r.register(Arc::new(StoredFileOnEnterActiveHandler::new()));
r.register(Arc::new(StoredFileOnEnterQuarantinedHandler::new()));
r.register(Arc::new(StoredFileOnEnterDeletedHandler::new()));
r.register(Arc::new(StoredFileOnEnterPurgedHandler::new()));
})
}