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}