Skip to main content

openrouter_rs/api/
organization.rs

1use reqwest::Client as HttpClient;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    error::OpenRouterError,
6    transport::{request as transport_request, response as transport_response},
7    types::PaginationOptions,
8};
9
10/// One organization member returned by `GET /organization/members`.
11#[derive(Serialize, Deserialize, Debug, Clone)]
12#[non_exhaustive]
13pub struct OrganizationMember {
14    pub id: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub first_name: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub last_name: Option<String>,
19    pub email: String,
20    pub role: String,
21}
22
23/// Paginated organization member list.
24#[derive(Serialize, Deserialize, Debug, Clone)]
25#[non_exhaustive]
26pub struct OrganizationMembersResponse {
27    pub data: Vec<OrganizationMember>,
28    pub total_count: u64,
29}
30
31fn with_pagination(url: String, pagination: Option<PaginationOptions>) -> String {
32    let params = pagination
33        .map(PaginationOptions::to_query_pairs)
34        .unwrap_or_default()
35        .into_iter()
36        .map(|(key, value)| format!("{key}={value}"))
37        .collect::<Vec<_>>();
38
39    if params.is_empty() {
40        url
41    } else {
42        format!("{url}?{}", params.join("&"))
43    }
44}
45
46/// List organization members for the authenticated management key.
47pub async fn list_organization_members(
48    base_url: &str,
49    management_key: &str,
50    pagination: Option<PaginationOptions>,
51) -> Result<OrganizationMembersResponse, OpenRouterError> {
52    let http_client = crate::transport::new_client()?;
53    list_organization_members_with_client(&http_client, base_url, management_key, pagination).await
54}
55
56pub(crate) async fn list_organization_members_with_client(
57    http_client: &HttpClient,
58    base_url: &str,
59    management_key: &str,
60    pagination: Option<PaginationOptions>,
61) -> Result<OrganizationMembersResponse, OpenRouterError> {
62    let url = with_pagination(format!("{base_url}/organization/members"), pagination);
63    let response = transport_request::with_bearer_auth(
64        transport_request::get(http_client, &url),
65        management_key,
66    )
67    .send()
68    .await?;
69
70    if response.status().is_success() {
71        transport_response::parse_json_response(response, "organization members").await
72    } else {
73        transport_response::handle_error(response).await?;
74        unreachable!()
75    }
76}