use super::{HttpClient, PaginatedResponse};
use crate::verify::NucleusError;
use serde::Deserialize;
use std::sync::Arc;
#[derive(Debug, Clone, Deserialize)]
pub struct NucleusOrg {
pub id: String,
pub name: String,
pub slug: String,
pub logo_url: Option<String>,
pub metadata: serde_json::Value,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Default)]
pub struct ListOrgsParams {
pub limit: Option<u32>,
pub cursor: Option<String>,
}
#[derive(Clone)]
pub struct OrgsApi {
http: Arc<HttpClient>,
}
impl OrgsApi {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub async fn get(&self, org_id: &str) -> Result<NucleusOrg, NucleusError> {
self.http.get(&format!("/orgs/{org_id}")).await
}
pub async fn list(
&self,
params: Option<ListOrgsParams>,
) -> Result<PaginatedResponse<NucleusOrg>, NucleusError> {
let mut query_parts: Vec<String> = Vec::new();
if let Some(p) = ¶ms {
if let Some(limit) = p.limit {
query_parts.push(format!("limit={limit}"));
}
if let Some(cursor) = &p.cursor {
query_parts.push(format!("cursor={cursor}"));
}
}
let path = if query_parts.is_empty() {
"/orgs".to_string()
} else {
format!("/orgs?{}", query_parts.join("&"))
};
self.http.get(&path).await
}
}