backbone_bucket/application/triggers/
file_comment_triggers.rs1use std::sync::Arc;
6use async_trait::async_trait;
7use backbone_core::trigger::{
8 ActionExecutor, TriggerContext, TriggerContextMut, TriggerEvent, TriggerHandler, TriggerRegistry,
9};
10
11use crate::domain::entity::FileComment;
12
13pub type FileCommentTriggerEvent = TriggerEvent;
14pub type FileCommentTriggerContext = TriggerContext<FileComment>;
15pub type FileCommentTriggerContextMut = TriggerContextMut<FileComment>;
16pub type FileCommentActionExecutor = ActionExecutor;
17pub type FileCommentTriggerRegistry = TriggerRegistry<FileComment>;
18pub type FileCommentTriggerHandlerObj =
19 dyn TriggerHandler<TriggerContext<FileComment>, TriggerEvent>;
20
21pub struct FileCommentAfterCreateHandler1 {
25 pub event_publisher: Option<Arc<crate::domain::event::FileCommentEventPublisher>>,
27 pub action_executor: Option<Arc<FileCommentActionExecutor>>,
29}
30
31impl FileCommentAfterCreateHandler1 {
32 pub fn new() -> Self {
33 Self {
34 event_publisher: None,
35 action_executor: None,
36 }
37 }
38
39 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileCommentEventPublisher>) -> Self {
40 self.event_publisher = Some(publisher);
41 self
42 }
43
44 pub fn with_action_executor(mut self, executor: Arc<FileCommentActionExecutor>) -> Self {
45 self.action_executor = Some(executor);
46 self
47 }
48}
49
50#[async_trait]
51impl TriggerHandler<FileCommentTriggerContext, FileCommentTriggerEvent> for FileCommentAfterCreateHandler1 {
52 fn events(&self) -> Vec<FileCommentTriggerEvent> {
53 vec![TriggerEvent::AfterCreate]
54 }
55
56 async fn handle(&self, ctx: &FileCommentTriggerContext) -> anyhow::Result<()> {
57 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
59 if let Some(publisher) = &self.event_publisher {
61 publisher.publish_created(ctx.entity.clone(), ctx.user_id.clone()).await?;
62 }
63 Ok(())
67 }
68}
69
70pub struct FileCommentAfterCreateHandler2 {
72 pub event_publisher: Option<Arc<crate::domain::event::FileCommentEventPublisher>>,
74 pub action_executor: Option<Arc<FileCommentActionExecutor>>,
76}
77
78impl FileCommentAfterCreateHandler2 {
79 pub fn new() -> Self {
80 Self {
81 event_publisher: None,
82 action_executor: None,
83 }
84 }
85
86 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileCommentEventPublisher>) -> Self {
87 self.event_publisher = Some(publisher);
88 self
89 }
90
91 pub fn with_action_executor(mut self, executor: Arc<FileCommentActionExecutor>) -> Self {
92 self.action_executor = Some(executor);
93 self
94 }
95}
96
97#[async_trait]
98impl TriggerHandler<FileCommentTriggerContext, FileCommentTriggerEvent> for FileCommentAfterCreateHandler2 {
99 fn events(&self) -> Vec<FileCommentTriggerEvent> {
100 vec![TriggerEvent::AfterCreate]
101 }
102
103 async fn handle(&self, ctx: &FileCommentTriggerContext) -> anyhow::Result<()> {
104 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
106 Ok(())
107 }
108}
109
110pub struct FileCommentAfterDeleteHandler3 {
112 pub event_publisher: Option<Arc<crate::domain::event::FileCommentEventPublisher>>,
114 pub action_executor: Option<Arc<FileCommentActionExecutor>>,
116}
117
118impl FileCommentAfterDeleteHandler3 {
119 pub fn new() -> Self {
120 Self {
121 event_publisher: None,
122 action_executor: None,
123 }
124 }
125
126 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileCommentEventPublisher>) -> Self {
127 self.event_publisher = Some(publisher);
128 self
129 }
130
131 pub fn with_action_executor(mut self, executor: Arc<FileCommentActionExecutor>) -> Self {
132 self.action_executor = Some(executor);
133 self
134 }
135}
136
137#[async_trait]
138impl TriggerHandler<FileCommentTriggerContext, FileCommentTriggerEvent> for FileCommentAfterDeleteHandler3 {
139 fn events(&self) -> Vec<FileCommentTriggerEvent> {
140 vec![TriggerEvent::AfterDelete]
141 }
142
143 async fn handle(&self, ctx: &FileCommentTriggerContext) -> anyhow::Result<()> {
144 let _ = &ctx; if let Some(publisher) = &self.event_publisher {
147 publisher.publish_deleted(ctx.entity.id().to_string(), ctx.user_id.clone()).await?;
148 }
149 tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
150 Ok(())
151 }
152}
153
154pub fn file_comment_trigger_registry() -> FileCommentTriggerRegistry {
158 TriggerRegistry::build(|r| {
159 r.register(Arc::new(FileCommentAfterCreateHandler1::new()));
160 r.register(Arc::new(FileCommentAfterCreateHandler2::new()));
161 r.register(Arc::new(FileCommentAfterDeleteHandler3::new()));
162 })
163}
164