Skip to main content

rustauth_core/plugin/db/
handler.rs

1use std::fmt;
2use std::future::Future;
3use std::pin::Pin;
4use std::sync::Arc;
5
6use crate::db::DbAdapter;
7use crate::env::logger::Logger;
8use crate::error::RustAuthError;
9use crate::plugin::{
10    PluginDatabaseAfterInput, PluginDatabaseBeforeAction, PluginDatabaseBeforeInput,
11};
12
13use super::PluginDatabaseOperation;
14
15/// Runtime metadata passed to executable database hooks.
16pub struct PluginDatabaseHookContext<'a> {
17    pub plugin_id: String,
18    pub hook_name: String,
19    pub operation: PluginDatabaseOperation,
20    pub model: String,
21    pub adapter: &'a dyn DbAdapter,
22    pub request_path: Option<String>,
23    /// Application logger (same instance as [`crate::context::AuthContext::logger`]).
24    pub logger: &'a Logger,
25}
26
27impl fmt::Debug for PluginDatabaseHookContext<'_> {
28    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
29        formatter
30            .debug_struct("PluginDatabaseHookContext")
31            .field("plugin_id", &self.plugin_id)
32            .field("hook_name", &self.hook_name)
33            .field("operation", &self.operation)
34            .field("model", &self.model)
35            .field("adapter", &self.adapter.id())
36            .field("request_path", &self.request_path)
37            .finish()
38    }
39}
40
41pub type PluginDatabaseBeforeHookFuture<'a> =
42    Pin<Box<dyn Future<Output = Result<PluginDatabaseBeforeAction, RustAuthError>> + Send + 'a>>;
43pub type PluginDatabaseAfterHookFuture<'a> =
44    Pin<Box<dyn Future<Output = Result<(), RustAuthError>> + Send + 'a>>;
45
46pub type PluginDatabaseBeforeHookHandler = Arc<
47    dyn for<'a> Fn(
48            PluginDatabaseHookContext<'a>,
49            PluginDatabaseBeforeInput,
50        ) -> PluginDatabaseBeforeHookFuture<'a>
51        + Send
52        + Sync,
53>;
54
55pub type PluginDatabaseAfterHookHandler = Arc<
56    dyn for<'a> Fn(
57            PluginDatabaseHookContext<'a>,
58            PluginDatabaseAfterInput,
59        ) -> PluginDatabaseAfterHookFuture<'a>
60        + Send
61        + Sync,
62>;