Skip to main content

systemprompt_cloud/api_client/
endpoints.rs

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