use crate::admin::{OrgsApi, UsersApi};
use crate::claims::NucleusClaims;
use crate::verify::{JwksVerifier, NucleusError};
use std::sync::Arc;
const DEFAULT_BASE_URL: &str = "https://api.nucleus.dev";
#[derive(Debug, Clone)]
pub struct NucleusConfig {
pub secret_key: String,
pub base_url: Option<String>,
pub jwks_cache_ttl_secs: Option<u64>,
}
#[derive(Clone)]
pub struct NucleusClient {
pub(crate) config: NucleusConfig,
pub(crate) verifier: Arc<JwksVerifier>,
pub users: UsersApi,
pub orgs: OrgsApi,
}
impl NucleusClient {
pub fn new(config: NucleusConfig) -> Self {
let base_url = config
.base_url
.clone()
.unwrap_or_else(|| DEFAULT_BASE_URL.to_string());
let ttl_secs = config.jwks_cache_ttl_secs.unwrap_or(3600);
let verifier = Arc::new(JwksVerifier::new(&base_url, ttl_secs));
let http = Arc::new(crate::admin::HttpClient::new(
base_url,
config.secret_key.clone(),
));
Self {
config,
verifier,
users: UsersApi::new(Arc::clone(&http)),
orgs: OrgsApi::new(Arc::clone(&http)),
}
}
pub async fn verify_token(&self, token: &str) -> Result<NucleusClaims, NucleusError> {
self.verifier.verify(token).await
}
pub fn base_url(&self) -> &str {
self.config
.base_url
.as_deref()
.unwrap_or(DEFAULT_BASE_URL)
}
}