mini_chat/infra/plugins/static_audit/
module.rs1use 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#[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}