Skip to main content

systemprompt_cloud/api_client/
endpoints.rs

1//! Top-level API endpoints not specific to tenants.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use chrono::Utc;
7use systemprompt_identifiers::{PriceId, UserId};
8use systemprompt_models::modules::ApiPaths;
9
10use super::CloudApiClient;
11use super::types::{
12    ActivityData, ActivityRequest, CheckoutRequest, CheckoutResponse, ListResponse, Plan, Tenant,
13    UserMeResponse,
14};
15use crate::error::CloudResult;
16
17impl CloudApiClient {
18    pub async fn get_user(&self) -> CloudResult<UserMeResponse> {
19        self.get(ApiPaths::AUTH_ME).await
20    }
21
22    pub async fn list_tenants(&self) -> CloudResult<Vec<Tenant>> {
23        let response: ListResponse<Tenant> = self.get(ApiPaths::CLOUD_TENANTS).await?;
24        Ok(response.data)
25    }
26
27    pub async fn get_plans(&self) -> CloudResult<Vec<Plan>> {
28        let plans: Vec<Plan> = self.get(ApiPaths::CLOUD_CHECKOUT_PLANS).await?;
29        Ok(plans)
30    }
31
32    pub async fn create_checkout(
33        &self,
34        price_id: &PriceId,
35        region: &str,
36        redirect_uri: Option<&str>,
37    ) -> CloudResult<CheckoutResponse> {
38        let request = CheckoutRequest {
39            price_id: price_id.clone(),
40            region: region.to_owned(),
41            redirect_uri: redirect_uri.map(String::from),
42        };
43        self.post(ApiPaths::CLOUD_CHECKOUT, &request).await
44    }
45
46    pub async fn report_activity(&self, event_type: &str, user_id: &UserId) -> CloudResult<()> {
47        let request = ActivityRequest {
48            event: event_type.to_owned(),
49            timestamp: Utc::now().to_rfc3339(),
50            data: ActivityData {
51                user_id: user_id.clone(),
52            },
53        };
54        self.post_no_response(ApiPaths::CLOUD_ACTIVITY, &request)
55            .await
56    }
57}