Skip to main content

mini_chat/infra/plugins/static_audit/
module.rs

1use std::sync::{Arc, OnceLock};
2
3use async_trait::async_trait;
4use modkit::Module;
5use modkit::client_hub::ClientScope;
6use modkit::context::ModuleCtx;
7use modkit::gts::BaseModkitPluginV1;
8use tracing::info;
9use types_registry_sdk::{RegisterResult, TypesRegistryClient};
10
11use mini_chat_sdk::{MiniChatAuditPluginClientV1, MiniChatAuditPluginSpecV1};
12
13use super::config::StaticMiniChatAuditPluginConfig;
14use super::service::Service;
15
16const VENDOR: &str = "cyber-fabric";
17const PRIORITY: i16 = 100;
18
19/// Static audit plugin module for mini-chat.
20///
21/// Logs all audit events via `tracing` for development and testing.
22/// When `enabled: false` in config, the plugin registers normally but
23/// all emit methods return immediately without logging.
24#[modkit::module(
25    name = "static-mini-chat-audit-plugin",
26    deps = ["types-registry"]
27)]
28pub struct StaticMiniChatAuditPlugin {
29    service: OnceLock<Arc<Service>>,
30}
31
32impl Default for StaticMiniChatAuditPlugin {
33    fn default() -> Self {
34        Self {
35            service: OnceLock::new(),
36        }
37    }
38}
39
40#[async_trait]
41impl Module for StaticMiniChatAuditPlugin {
42    async fn init(&self, ctx: &ModuleCtx) -> anyhow::Result<()> {
43        let cfg: StaticMiniChatAuditPluginConfig = ctx.config()?;
44        info!(
45            enabled = cfg.enabled,
46            "Loaded static mini-chat audit plugin configuration"
47        );
48
49        let service = Arc::new(Service {
50            enabled: cfg.enabled,
51        });
52        self.service
53            .set(service.clone())
54            .map_err(|_| anyhow::anyhow!("{} module already initialized", Self::MODULE_NAME))?;
55
56        let instance_id =
57            MiniChatAuditPluginSpecV1::gts_make_instance_id("x.core._.static_mini_chat_audit.v1");
58
59        let registry = ctx.client_hub().get::<dyn TypesRegistryClient>()?;
60        let instance = BaseModkitPluginV1::<MiniChatAuditPluginSpecV1> {
61            id: instance_id.clone(),
62            vendor: VENDOR.to_owned(),
63            priority: PRIORITY,
64            properties: MiniChatAuditPluginSpecV1,
65        };
66        let instance_json = serde_json::to_value(&instance)?;
67
68        let results = registry.register(vec![instance_json]).await?;
69        RegisterResult::ensure_all_ok(&results)?;
70
71        let api: Arc<dyn MiniChatAuditPluginClientV1> = service;
72        ctx.client_hub()
73            .register_scoped::<dyn MiniChatAuditPluginClientV1>(
74                ClientScope::gts_id(&instance_id),
75                api,
76            );
77
78        info!(instance_id = %instance_id, "Static mini-chat audit plugin registered");
79        Ok(())
80    }
81}