(
&self,
discord_user_id: Id<UserMarker>,
tier: PremiumSlotTier,
return_url: &str,
)
| 50 | } |
| 51 | |
| 52 | pub async fn create_checkout_session( |
| 53 | &self, |
| 54 | discord_user_id: Id<UserMarker>, |
| 55 | tier: PremiumSlotTier, |
| 56 | return_url: &str, |
| 57 | ) -> anyhow::Result<String> { |
| 58 | let customer_id = self.init_user_stripe_customer_id(discord_user_id).await?; |
| 59 | |
| 60 | let price = match tier { |
| 61 | PremiumSlotTier::Lite => &self.lite_price_id, |
| 62 | PremiumSlotTier::Premium => &self.premium_price_id, |
| 63 | }; |
| 64 | |
| 65 | let session = CheckoutSession::create( |
| 66 | &self.client, |
| 67 | CreateCheckoutSession { |
| 68 | customer: Some(CustomerId::from_str(&customer_id).unwrap()), |
| 69 | mode: Some(CheckoutSessionMode::Subscription), |
| 70 | success_url: Some(return_url), |
| 71 | cancel_url: Some(return_url), |
| 72 | line_items: Some(vec![CreateCheckoutSessionLineItems { |
| 73 | adjustable_quantity: Some(CreateCheckoutSessionLineItemsAdjustableQuantity { |
| 74 | enabled: true, |
| 75 | minimum: Some(1), |
| 76 | ..Default::default() |
| 77 | }), |
| 78 | price: Some(price.to_owned()), |
| 79 | quantity: Some(1), |
| 80 | ..Default::default() |
| 81 | }]), |
| 82 | ..Default::default() |
| 83 | }, |
| 84 | ) |
| 85 | .await?; |
| 86 | |
| 87 | Ok(session.url.unwrap()) |
| 88 | } |
| 89 | |
| 90 | #[instrument(skip_all)] |
| 91 | pub async fn create_customer_portal_link( |
no test coverage detected