kontext_dev_sdk/management/
client.rs1use std::sync::Arc;
2
3use crate::http_client::HttpClient;
4
5use super::agent_instances::AgentSessionsResource;
6use super::applications::ApplicationsResource;
7use super::auth::ServiceAccountCredentials;
8use super::auth::TokenManager;
9use super::integrations::IntegrationsResource;
10use super::service_accounts::ServiceAccountsResource;
11use super::traces::EventsResource;
12use super::traces::TracesResource;
13
14#[derive(Clone, Debug)]
15pub struct KontextManagementClientConfig {
16 pub base_url: String,
17 pub credentials: ServiceAccountCredentials,
18 pub token_url: Option<String>,
19 pub api_version: Option<String>,
20 pub scopes: Option<Vec<String>>,
21 pub audience: Option<String>,
22}
23
24pub type ManagementClient = KontextManagementClient;
26
27pub struct KontextManagementClient {
29 pub token_manager: Arc<TokenManager>,
30 pub service_accounts: ServiceAccountsResource,
31 pub applications: ApplicationsResource,
32 pub integrations: IntegrationsResource,
33 pub agent_sessions: AgentSessionsResource,
34 pub agent_instances: AgentSessionsResource,
35 pub traces: TracesResource,
36 pub events: EventsResource,
37}
38
39impl KontextManagementClient {
40 pub fn new(config: KontextManagementClientConfig) -> Self {
41 let base_url = config.base_url.trim_end_matches('/').to_string();
42 let api_version = config.api_version.unwrap_or_else(|| "v1".to_string());
43 let token_url = config
44 .token_url
45 .unwrap_or_else(|| format!("{base_url}/oauth2/token"));
46 let scopes = config
47 .scopes
48 .unwrap_or_else(|| vec!["management:all".to_string()]);
49 let audience = config
50 .audience
51 .unwrap_or_else(|| format!("{base_url}/api/{api_version}"));
52
53 let token_manager = Arc::new(TokenManager::new(
54 token_url,
55 config.credentials,
56 scopes,
57 audience,
58 ));
59
60 let token_for_http = Arc::clone(&token_manager);
61 let http = Arc::new(HttpClient::new(
62 format!("{base_url}/api/{api_version}"),
63 move || {
64 let token_for_http = Arc::clone(&token_for_http);
65 async move { token_for_http.token().await }
66 },
67 ));
68
69 let service_accounts = ServiceAccountsResource::new(Arc::clone(&http));
70 let applications = ApplicationsResource::new(Arc::clone(&http));
71 let integrations = IntegrationsResource::new(Arc::clone(&http));
72 let agent_sessions = AgentSessionsResource::new(Arc::clone(&http));
73 let traces = TracesResource::new(Arc::clone(&http));
74 let events = EventsResource::new(Arc::clone(&http));
75
76 Self {
77 token_manager,
78 service_accounts,
79 applications,
80 integrations,
81 agent_instances: agent_sessions.clone(),
82 agent_sessions,
83 traces,
84 events,
85 }
86 }
87
88 pub async fn refresh_token(&self) -> Result<(), crate::KontextDevError> {
89 self.token_manager.refresh().await
90 }
91
92 pub async fn clear_token(&self) {
93 self.token_manager.clear().await;
94 }
95}