static_tr_plugin/
module.rs1use std::sync::{Arc, OnceLock};
4
5use async_trait::async_trait;
6use modkit::Module;
7use modkit::client_hub::ClientScope;
8use modkit::context::ModuleCtx;
9use modkit::gts::BaseModkitPluginV1;
10use tenant_resolver_sdk::{TenantResolverPluginClient, TenantResolverPluginSpecV1};
11use tracing::info;
12use types_registry_sdk::TypesRegistryClient;
13
14use crate::config::StaticTrPluginConfig;
15use crate::domain::Service;
16
17#[modkit::module(
26 name = "static_tr_plugin",
27 deps = ["types_registry"]
28)]
29pub struct StaticTrPlugin {
30 service: OnceLock<Arc<Service>>,
31}
32
33impl Default for StaticTrPlugin {
34 fn default() -> Self {
35 Self {
36 service: OnceLock::new(),
37 }
38 }
39}
40
41#[async_trait]
42impl Module for StaticTrPlugin {
43 async fn init(&self, ctx: &ModuleCtx) -> anyhow::Result<()> {
44 info!("Initializing static_tr_plugin");
45
46 let cfg: StaticTrPluginConfig = ctx.config()?;
48 info!(
49 vendor = %cfg.vendor,
50 priority = cfg.priority,
51 tenant_count = cfg.tenants.len(),
52 access_rule_count = cfg.access_rules.len(),
53 "Loaded plugin configuration"
54 );
55
56 let instance_id = TenantResolverPluginSpecV1::gts_make_instance_id(
58 "hyperspot.builtin.static_tenant_resolver.plugin.v1",
59 );
60
61 let registry = ctx.client_hub().get::<dyn TypesRegistryClient>()?;
63 let instance = BaseModkitPluginV1::<TenantResolverPluginSpecV1> {
64 id: instance_id.clone(),
65 vendor: cfg.vendor.clone(),
66 priority: cfg.priority,
67 properties: TenantResolverPluginSpecV1,
68 };
69 let instance_json = serde_json::to_value(&instance)?;
70
71 let _ = registry.register(vec![instance_json]).await?;
72
73 let service = Arc::new(Service::from_config(&cfg));
75 self.service
76 .set(service.clone())
77 .map_err(|_| anyhow::anyhow!("Service already initialized"))?;
78
79 let api: Arc<dyn TenantResolverPluginClient> = service;
81 ctx.client_hub()
82 .register_scoped::<dyn TenantResolverPluginClient>(
83 ClientScope::gts_id(&instance_id),
84 api,
85 );
86
87 info!(instance_id = %instance_id, "Static plugin initialized");
88 Ok(())
89 }
90}