static_authz_plugin/
module.rs1use std::sync::{Arc, OnceLock};
4
5use async_trait::async_trait;
6use authz_resolver_sdk::{AuthZResolverPluginClient, AuthZResolverPluginSpecV1};
7use modkit::Module;
8use modkit::client_hub::ClientScope;
9use modkit::context::ModuleCtx;
10use modkit::gts::BaseModkitPluginV1;
11use tracing::info;
12use types_registry_sdk::{RegisterResult, TypesRegistryClient};
13
14use crate::config::StaticAuthZPluginConfig;
15use crate::domain::Service;
16
17#[modkit::module(
19 name = "static-authz-plugin",
20 deps = ["types-registry"]
21)]
22pub struct StaticAuthZPlugin {
23 service: OnceLock<Arc<Service>>,
24}
25
26impl Default for StaticAuthZPlugin {
27 fn default() -> Self {
28 Self {
29 service: OnceLock::new(),
30 }
31 }
32}
33
34#[async_trait]
35impl Module for StaticAuthZPlugin {
36 async fn init(&self, ctx: &ModuleCtx) -> anyhow::Result<()> {
37 let cfg: StaticAuthZPluginConfig = ctx.config()?;
38 info!(
39 vendor = %cfg.vendor,
40 priority = cfg.priority,
41 "Loaded plugin configuration"
42 );
43
44 let instance_id = AuthZResolverPluginSpecV1::gts_make_instance_id(
46 "hyperspot.builtin.static_authz_resolver.plugin.v1",
47 );
48
49 let registry = ctx.client_hub().get::<dyn TypesRegistryClient>()?;
51 let instance = BaseModkitPluginV1::<AuthZResolverPluginSpecV1> {
52 id: instance_id.clone(),
53 vendor: cfg.vendor.clone(),
54 priority: cfg.priority,
55 properties: AuthZResolverPluginSpecV1,
56 };
57 let instance_json = serde_json::to_value(&instance)?;
58
59 let results = registry.register(vec![instance_json]).await?;
60 RegisterResult::ensure_all_ok(&results)?;
61
62 let service = Arc::new(Service::new());
64 self.service
65 .set(service.clone())
66 .map_err(|_| anyhow::anyhow!("{} module already initialized", Self::MODULE_NAME))?;
67
68 let api: Arc<dyn AuthZResolverPluginClient> = service;
70 ctx.client_hub()
71 .register_scoped::<dyn AuthZResolverPluginClient>(
72 ClientScope::gts_id(&instance_id),
73 api,
74 );
75
76 info!(instance_id = %instance_id);
77 Ok(())
78 }
79}