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