Skip to main content

openapp_sdk_core/resources/
billing.rs

1//! `Billing` resource group.
2
3use std::sync::Arc;
4
5use reqwest::Method;
6
7use super::types;
8use crate::{
9    error::SdkError,
10    transport::{RequestSpec, Transport},
11};
12
13#[derive(Debug, Clone)]
14pub struct BillingClient {
15    transport: Arc<Transport>,
16}
17
18impl BillingClient {
19    pub(crate) fn new(transport: Arc<Transport>) -> Self {
20        Self { transport }
21    }
22
23    pub async fn checkout(
24        &self,
25        org_id: &str,
26        body: &types::CheckoutRequest,
27    ) -> Result<types::SubscriptionRef, SdkError> {
28        let path = format!("/orgs/{org_id}/billing/checkout");
29        self.transport
30            .request_json::<types::CheckoutRequest, types::SubscriptionRef>(RequestSpec {
31                method: Method::POST,
32                path: &path,
33                body: Some(body),
34                ..Default::default()
35            })
36            .await
37    }
38
39    pub async fn plan(&self, org_id: &str) -> Result<types::BillingPlanResponse, SdkError> {
40        let path = format!("/orgs/{org_id}/billing/plan");
41        self.transport
42            .request_json::<(), types::BillingPlanResponse>(RequestSpec {
43                method: Method::GET,
44                path: &path,
45                ..Default::default()
46            })
47            .await
48    }
49
50    pub async fn portal(
51        &self,
52        org_id: &str,
53        body: &types::PortalRequest,
54    ) -> Result<types::PortalResponse, SdkError> {
55        let path = format!("/orgs/{org_id}/billing/portal");
56        self.transport
57            .request_json::<types::PortalRequest, types::PortalResponse>(RequestSpec {
58                method: Method::POST,
59                path: &path,
60                body: Some(body),
61                ..Default::default()
62            })
63            .await
64    }
65
66    pub async fn upgrade_options(&self, org_id: &str) -> Result<types::PlansResponse, SdkError> {
67        let path = format!("/orgs/{org_id}/billing/upgrade-options");
68        self.transport
69            .request_json::<(), types::PlansResponse>(RequestSpec {
70                method: Method::GET,
71                path: &path,
72                ..Default::default()
73            })
74            .await
75    }
76
77    pub async fn usage(&self, org_id: &str) -> Result<types::QuotaReport, SdkError> {
78        let path = format!("/orgs/{org_id}/billing/usage");
79        self.transport
80            .request_json::<(), types::QuotaReport>(RequestSpec {
81                method: Method::GET,
82                path: &path,
83                ..Default::default()
84            })
85            .await
86    }
87}