Skip to main content

cloudillo_action/native_hooks/
mod.rs

1//! Native hook implementations for core action types
2//!
3//! This module contains high-performance, security-hardened implementations of action lifecycle hooks,
4//! replacing DSL versions where higher control and validation are needed.
5//!
6//! Modules:
7//! - aprv: Approval action handling (APRV)
8//! - cmnt: Comment counter management (CMNT)
9//! - conn: Connection lifecycle management (CONN)
10//! - conv: Conversation management (CONV)
11//! - fllw: Follow relationship management (FLLW)
12//! - fshr: File sharing lifecycle management (FSHR)
13//! - idp: Identity provider operations (IDP:REG)
14//! - invt: Invitation management (INVT)
15//! - prinvt: Profile invite notification (PRINVT)
16//! - react: Reaction management (REACT)
17//! - subs: Subscription management (SUBS)
18
19pub mod aprv;
20pub mod cmnt;
21pub mod conn;
22pub mod conv;
23pub mod fllw;
24pub mod fshr;
25pub mod idp;
26pub mod invt;
27pub mod prinvt;
28pub mod react;
29pub mod subs;
30
31use crate::hooks::{ActionTypeHooks, HookRegistry};
32use crate::prelude::*;
33use cloudillo_core::app::App;
34use std::sync::Arc;
35
36/// Register all native hooks into the app's hook registry
37pub async fn register_native_hooks(app: &App) -> ClResult<()> {
38	let hook_registry = app.ext::<Arc<tokio::sync::RwLock<HookRegistry>>>()?;
39	let mut registry = hook_registry.write().await;
40
41	// CONN hooks
42	{
43		let conn_hooks = ActionTypeHooks {
44			on_create: Some(Arc::new(|app, ctx| Box::pin(conn::on_create(app, ctx)))),
45			on_receive: Some(Arc::new(|app, ctx| Box::pin(conn::on_receive(app, ctx)))),
46			on_accept: Some(Arc::new(|app, ctx| Box::pin(conn::on_accept(app, ctx)))),
47			on_reject: Some(Arc::new(|app, ctx| Box::pin(conn::on_reject(app, ctx)))),
48		};
49
50		registry.register_type("CONN", conn_hooks);
51		tracing::info!("Registered native hooks for CONN action type");
52	}
53
54	// FLLW hooks
55	{
56		let fllw_hooks = ActionTypeHooks {
57			on_create: Some(Arc::new(|app, ctx| Box::pin(fllw::on_create(app, ctx)))),
58			on_receive: Some(Arc::new(|app, ctx| Box::pin(fllw::on_receive(app, ctx)))),
59			on_accept: None,
60			on_reject: None,
61		};
62
63		registry.register_type("FLLW", fllw_hooks);
64		tracing::info!("Registered native hooks for FLLW action type");
65	}
66
67	// IDP:REG hooks
68	{
69		let idp_reg_hooks = ActionTypeHooks {
70			on_create: None,
71			on_receive: Some(Arc::new(|app, ctx| Box::pin(idp::idp_reg_on_receive(app, ctx)))),
72			on_accept: None,
73			on_reject: None,
74		};
75
76		registry.register_type("IDP:REG", idp_reg_hooks);
77		tracing::info!("Registered native hooks for IDP:REG action type");
78	}
79
80	// FSHR hooks
81	{
82		let fshr_hooks = ActionTypeHooks {
83			on_create: None,
84			on_receive: Some(Arc::new(|app, ctx| Box::pin(fshr::on_receive(app, ctx)))),
85			on_accept: Some(Arc::new(|app, ctx| Box::pin(fshr::on_accept(app, ctx)))),
86			on_reject: None,
87		};
88
89		registry.register_type("FSHR", fshr_hooks);
90		tracing::info!("Registered native hooks for FSHR action type");
91	}
92
93	// REACT hooks
94	{
95		let react_hooks = ActionTypeHooks {
96			on_create: Some(Arc::new(|app, ctx| Box::pin(react::on_create(app, ctx)))),
97			on_receive: Some(Arc::new(|app, ctx| Box::pin(react::on_receive(app, ctx)))),
98			on_accept: None,
99			on_reject: None,
100		};
101
102		registry.register_type("REACT", react_hooks);
103		tracing::info!("Registered native hooks for REACT action type");
104	}
105
106	// CMNT hooks
107	{
108		let cmnt_hooks = ActionTypeHooks {
109			on_create: Some(Arc::new(|app, ctx| Box::pin(cmnt::on_create(app, ctx)))),
110			on_receive: Some(Arc::new(|app, ctx| Box::pin(cmnt::on_receive(app, ctx)))),
111			on_accept: None,
112			on_reject: None,
113		};
114
115		registry.register_type("CMNT", cmnt_hooks);
116		tracing::info!("Registered native hooks for CMNT action type");
117	}
118
119	// APRV hooks
120	{
121		let aprv_hooks = ActionTypeHooks {
122			on_create: None,
123			on_receive: Some(Arc::new(|app, ctx| Box::pin(aprv::on_receive(app, ctx)))),
124			on_accept: None,
125			on_reject: None,
126		};
127
128		registry.register_type("APRV", aprv_hooks);
129		tracing::info!("Registered native hooks for APRV action type");
130	}
131
132	// SUBS hooks
133	{
134		let subs_hooks = ActionTypeHooks {
135			on_create: Some(Arc::new(|app, ctx| Box::pin(subs::on_create(app, ctx)))),
136			on_receive: Some(Arc::new(|app, ctx| Box::pin(subs::on_receive(app, ctx)))),
137			on_accept: None,
138			on_reject: None,
139		};
140
141		registry.register_type("SUBS", subs_hooks);
142		tracing::info!("Registered native hooks for SUBS action type");
143	}
144
145	// CONV hooks
146	{
147		let conv_hooks = ActionTypeHooks {
148			on_create: Some(Arc::new(|app, ctx| Box::pin(conv::on_create(app, ctx)))),
149			on_receive: Some(Arc::new(|app, ctx| Box::pin(conv::on_receive(app, ctx)))),
150			on_accept: None,
151			on_reject: None,
152		};
153
154		registry.register_type("CONV", conv_hooks);
155		tracing::info!("Registered native hooks for CONV action type");
156	}
157
158	// INVT hooks
159	{
160		let invt_hooks = ActionTypeHooks {
161			on_create: Some(Arc::new(|app, ctx| Box::pin(invt::on_create(app, ctx)))),
162			on_receive: Some(Arc::new(|app, ctx| Box::pin(invt::on_receive(app, ctx)))),
163			on_accept: Some(Arc::new(|app, ctx| Box::pin(invt::on_accept(app, ctx)))),
164			on_reject: None,
165		};
166
167		registry.register_type("INVT", invt_hooks);
168		tracing::info!("Registered native hooks for INVT action type");
169	}
170
171	// PRINVT hooks
172	{
173		let prinvt_hooks = ActionTypeHooks {
174			on_create: None,
175			on_receive: Some(Arc::new(|app, ctx| Box::pin(prinvt::on_receive(app, ctx)))),
176			on_accept: None,
177			on_reject: None,
178		};
179
180		registry.register_type("PRINVT", prinvt_hooks);
181		tracing::info!("Registered native hooks for PRINVT action type");
182	}
183
184	Ok(())
185}
186
187#[cfg(test)]
188mod tests {
189	use super::*;
190
191	#[test]
192	fn test_hook_functions_exist() {
193		// Verify module exports compile correctly
194		let _ = aprv::on_receive;
195		let _ = cmnt::on_create;
196		let _ = cmnt::on_receive;
197		let _ = conn::on_create;
198		let _ = conn::on_receive;
199		let _ = conn::on_accept;
200		let _ = conn::on_reject;
201		let _ = fllw::on_create;
202		let _ = fllw::on_receive;
203		let _ = idp::idp_reg_on_receive;
204		let _ = fshr::on_receive;
205		let _ = fshr::on_accept;
206		let _ = react::on_create;
207		let _ = react::on_receive;
208		let _ = subs::on_create;
209		let _ = subs::on_receive;
210		let _ = conv::on_create;
211		let _ = conv::on_receive;
212		let _ = invt::on_create;
213		let _ = invt::on_receive;
214		let _ = invt::on_accept;
215		let _ = prinvt::on_receive;
216	}
217}
218
219// vim: ts=4