diff --git a/libs/client-api/src/http_billing.rs b/libs/client-api/src/http_billing.rs index 25b76513..3b36fad0 100644 --- a/libs/client-api/src/http_billing.rs +++ b/libs/client-api/src/http_billing.rs @@ -161,4 +161,25 @@ impl Client { .await? .into_data() } + + /// Query all active subscription, minimal information but faster + pub async fn get_active_workspace_subscriptions( + &self, + workspace_id: &str, + ) -> Result, AppResponseError> { + let url = format!( + "{}/billing/api/v1/active-subscription/{}", + self.base_billing_url(), + workspace_id + ); + let resp = self + .http_client_with_auth(Method::GET, &url) + .await? + .send() + .await?; + + AppResponse::>::from_response(resp) + .await? + .into_data() + } } diff --git a/libs/shared-entity/src/dto/billing_dto.rs b/libs/shared-entity/src/dto/billing_dto.rs index bcd7c544..1ce62c49 100644 --- a/libs/shared-entity/src/dto/billing_dto.rs +++ b/libs/shared-entity/src/dto/billing_dto.rs @@ -67,6 +67,21 @@ impl AsRef for SubscriptionPlan { } } +impl TryFrom<&str> for SubscriptionPlan { + type Error = String; + + fn try_from(value: &str) -> Result { + match value { + "free" => Ok(SubscriptionPlan::Free), + "pro" => Ok(SubscriptionPlan::Pro), + "team" => Ok(SubscriptionPlan::Team), + "ai_max" => Ok(SubscriptionPlan::AiMax), + "ai_local" => Ok(SubscriptionPlan::AiLocal), + _ => Err(format!("Invalid SubscriptionPlan value: {}", value)), + } + } +} + #[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] #[serde(rename_all = "snake_case")] pub enum SubscriptionStatus { @@ -80,17 +95,18 @@ pub enum SubscriptionStatus { Unpaid, } -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct WorkspaceSubscriptionStatus { pub workspace_id: String, pub workspace_plan: SubscriptionPlan, pub recurring_interval: RecurringInterval, pub subscription_status: SubscriptionStatus, pub subscription_quantity: u64, - pub canceled_at: Option, + pub cancel_at: Option, + pub current_period_end: i64, } -#[derive(Deserialize)] +#[derive(Serialize, Deserialize)] pub struct WorkspaceUsageAndLimit { pub member_count: i64, pub member_count_limit: i64,