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}