backbone_bucket/application/triggers/
file_lock_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::FileLock;
12
13pub type FileLockTriggerEvent = TriggerEvent;
14pub type FileLockTriggerContext = TriggerContext<FileLock>;
15pub type FileLockTriggerContextMut = TriggerContextMut<FileLock>;
16pub type FileLockActionExecutor = ActionExecutor;
17pub type FileLockTriggerRegistry = TriggerRegistry<FileLock>;
18pub type FileLockTriggerHandlerObj =
19 dyn TriggerHandler<TriggerContext<FileLock>, TriggerEvent>;
20
21pub struct FileLockAfterCreateHandler1 {
25 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
27 pub action_executor: Option<Arc<FileLockActionExecutor>>,
29}
30
31impl FileLockAfterCreateHandler1 {
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::FileLockEventPublisher>) -> Self {
40 self.event_publisher = Some(publisher);
41 self
42 }
43
44 pub fn with_action_executor(mut self, executor: Arc<FileLockActionExecutor>) -> Self {
45 self.action_executor = Some(executor);
46 self
47 }
48}
49
50#[async_trait]
51impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockAfterCreateHandler1 {
52 fn events(&self) -> Vec<FileLockTriggerEvent> {
53 vec![TriggerEvent::AfterCreate]
54 }
55
56 async fn handle(&self, ctx: &FileLockTriggerContext) -> 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(())
64 }
65}
66
67pub struct FileLockAfterCreateHandler2 {
69 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
71 pub action_executor: Option<Arc<FileLockActionExecutor>>,
73}
74
75impl FileLockAfterCreateHandler2 {
76 pub fn new() -> Self {
77 Self {
78 event_publisher: None,
79 action_executor: None,
80 }
81 }
82
83 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileLockEventPublisher>) -> Self {
84 self.event_publisher = Some(publisher);
85 self
86 }
87
88 pub fn with_action_executor(mut self, executor: Arc<FileLockActionExecutor>) -> Self {
89 self.action_executor = Some(executor);
90 self
91 }
92}
93
94#[async_trait]
95impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockAfterCreateHandler2 {
96 fn events(&self) -> Vec<FileLockTriggerEvent> {
97 vec![TriggerEvent::AfterCreate]
98 }
99
100 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
101 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
103 Ok(())
104 }
105}
106
107pub struct FileLockAfterCreateHandler3 {
109 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
111 pub action_executor: Option<Arc<FileLockActionExecutor>>,
113}
114
115impl FileLockAfterCreateHandler3 {
116 pub fn new() -> Self {
117 Self {
118 event_publisher: None,
119 action_executor: None,
120 }
121 }
122
123 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileLockEventPublisher>) -> Self {
124 self.event_publisher = Some(publisher);
125 self
126 }
127
128 pub fn with_action_executor(mut self, executor: Arc<FileLockActionExecutor>) -> Self {
129 self.action_executor = Some(executor);
130 self
131 }
132}
133
134#[async_trait]
135impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockAfterCreateHandler3 {
136 fn events(&self) -> Vec<FileLockTriggerEvent> {
137 vec![TriggerEvent::AfterCreate]
138 }
139
140 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
141 let _ = &ctx; Ok(())
144 }
145}
146
147pub struct FileLockAfterCreateHandler4 {
149 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
151 pub action_executor: Option<Arc<FileLockActionExecutor>>,
153}
154
155impl FileLockAfterCreateHandler4 {
156 pub fn new() -> Self {
157 Self {
158 event_publisher: None,
159 action_executor: None,
160 }
161 }
162
163 pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::FileLockEventPublisher>) -> Self {
164 self.event_publisher = Some(publisher);
165 self
166 }
167
168 pub fn with_action_executor(mut self, executor: Arc<FileLockActionExecutor>) -> Self {
169 self.action_executor = Some(executor);
170 self
171 }
172}
173
174#[async_trait]
175impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockAfterCreateHandler4 {
176 fn events(&self) -> Vec<FileLockTriggerEvent> {
177 vec![TriggerEvent::AfterCreate]
178 }
179
180 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
181 let _ = &ctx; if let Some(executor) = &self.action_executor {
184 executor.notify(ctx, "default").await?;
185 }
186 Ok(())
187 }
188}
189
190pub struct FileLockOnEnterActiveHandler {
194 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
195}
196
197impl FileLockOnEnterActiveHandler {
198 pub fn new() -> Self {
199 Self {
200 event_publisher: None,
201 }
202 }
203}
204
205#[async_trait]
206impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockOnEnterActiveHandler {
207 fn events(&self) -> Vec<FileLockTriggerEvent> {
208 vec![TriggerEvent::OnEnterState("active".to_string())]
209 }
210
211 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
212 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
214 if let Some(_publisher) = &self.event_publisher {
216 }
218 Ok(())
219 }
220}
221
222pub struct FileLockOnEnterExpiredHandler {
224 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
225}
226
227impl FileLockOnEnterExpiredHandler {
228 pub fn new() -> Self {
229 Self {
230 event_publisher: None,
231 }
232 }
233}
234
235#[async_trait]
236impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockOnEnterExpiredHandler {
237 fn events(&self) -> Vec<FileLockTriggerEvent> {
238 vec![TriggerEvent::OnEnterState("expired".to_string())]
239 }
240
241 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
242 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
244 if let Some(_publisher) = &self.event_publisher {
246 }
248 Ok(())
249 }
250}
251
252pub struct FileLockOnEnterReleasedHandler {
254 pub event_publisher: Option<Arc<crate::domain::event::FileLockEventPublisher>>,
255}
256
257impl FileLockOnEnterReleasedHandler {
258 pub fn new() -> Self {
259 Self {
260 event_publisher: None,
261 }
262 }
263}
264
265#[async_trait]
266impl TriggerHandler<FileLockTriggerContext, FileLockTriggerEvent> for FileLockOnEnterReleasedHandler {
267 fn events(&self) -> Vec<FileLockTriggerEvent> {
268 vec![TriggerEvent::OnEnterState("released".to_string())]
269 }
270
271 async fn handle(&self, ctx: &FileLockTriggerContext) -> anyhow::Result<()> {
272 let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
274 if let Some(_publisher) = &self.event_publisher {
276 }
278 Ok(())
279 }
280}
281
282pub fn file_lock_trigger_registry() -> FileLockTriggerRegistry {
284 TriggerRegistry::build(|r| {
285 r.register(Arc::new(FileLockAfterCreateHandler1::new()));
286 r.register(Arc::new(FileLockAfterCreateHandler2::new()));
287 r.register(Arc::new(FileLockAfterCreateHandler3::new()));
288 r.register(Arc::new(FileLockAfterCreateHandler4::new()));
289 r.register(Arc::new(FileLockOnEnterActiveHandler::new()));
290 r.register(Arc::new(FileLockOnEnterExpiredHandler::new()));
291 r.register(Arc::new(FileLockOnEnterReleasedHandler::new()));
292 })
293}
294