billing_subscription.rs

 1use crate::db::{BillingCustomerId, BillingSubscriptionId};
 2use sea_orm::entity::prelude::*;
 3use serde::Serialize;
 4
 5/// A billing subscription.
 6#[derive(Clone, Debug, Default, PartialEq, Eq, DeriveEntityModel)]
 7#[sea_orm(table_name = "billing_subscriptions")]
 8pub struct Model {
 9    #[sea_orm(primary_key)]
10    pub id: BillingSubscriptionId,
11    pub billing_customer_id: BillingCustomerId,
12    pub stripe_subscription_id: String,
13    pub stripe_subscription_status: StripeSubscriptionStatus,
14    pub stripe_cancel_at: Option<DateTime>,
15    pub created_at: DateTime,
16}
17
18#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
19pub enum Relation {
20    #[sea_orm(
21        belongs_to = "super::billing_customer::Entity",
22        from = "Column::BillingCustomerId",
23        to = "super::billing_customer::Column::Id"
24    )]
25    BillingCustomer,
26}
27
28impl Related<super::billing_customer::Entity> for Entity {
29    fn to() -> RelationDef {
30        Relation::BillingCustomer.def()
31    }
32}
33
34impl ActiveModelBehavior for ActiveModel {}
35
36/// The status of a Stripe subscription.
37///
38/// [Stripe docs](https://docs.stripe.com/api/subscriptions/object#subscription_object-status)
39#[derive(
40    Eq, PartialEq, Copy, Clone, Debug, EnumIter, DeriveActiveEnum, Default, Hash, Serialize,
41)]
42#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)")]
43#[serde(rename_all = "snake_case")]
44pub enum StripeSubscriptionStatus {
45    #[default]
46    #[sea_orm(string_value = "incomplete")]
47    Incomplete,
48    #[sea_orm(string_value = "incomplete_expired")]
49    IncompleteExpired,
50    #[sea_orm(string_value = "trialing")]
51    Trialing,
52    #[sea_orm(string_value = "active")]
53    Active,
54    #[sea_orm(string_value = "past_due")]
55    PastDue,
56    #[sea_orm(string_value = "canceled")]
57    Canceled,
58    #[sea_orm(string_value = "unpaid")]
59    Unpaid,
60    #[sea_orm(string_value = "paused")]
61    Paused,
62}
63
64impl StripeSubscriptionStatus {
65    pub fn is_cancelable(&self) -> bool {
66        match self {
67            Self::Trialing | Self::Active | Self::PastDue => true,
68            Self::Incomplete
69            | Self::IncompleteExpired
70            | Self::Canceled
71            | Self::Unpaid
72            | Self::Paused => false,
73        }
74    }
75}