diff --git a/crates/schema/database/mysql_queries/src/queries/mod.rs b/crates/schema/database/mysql_queries/src/queries/mod.rs index c88e234c1e..0900d62715 100644 --- a/crates/schema/database/mysql_queries/src/queries/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/mod.rs @@ -29,6 +29,7 @@ pub mod tags; pub mod trending_model_analytics; pub mod tts; pub mod twitch; +pub mod unsubscribe_reason; pub mod users; pub mod vocoder; pub mod voice_clone_requests; diff --git a/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/insert_unsubscribe_reason.rs b/crates/schema/database/mysql_queries/src/queries/unsubscribe_reason/insert_unsubscribe_reason.rs similarity index 100% rename from crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/insert_unsubscribe_reason.rs rename to crates/schema/database/mysql_queries/src/queries/unsubscribe_reason/insert_unsubscribe_reason.rs diff --git a/crates/schema/database/mysql_queries/src/queries/unsubscribe_reason/mod.rs b/crates/schema/database/mysql_queries/src/queries/unsubscribe_reason/mod.rs new file mode 100644 index 0000000000..bff35bfad3 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/unsubscribe_reason/mod.rs @@ -0,0 +1 @@ +pub mod insert_unsubscribe_reason; diff --git a/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/mod.rs b/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/mod.rs index b218ae40c4..c45cfca08d 100644 --- a/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/mod.rs @@ -1,5 +1,4 @@ pub mod get_user_subscription_by_stripe_subscription_id; pub mod get_user_subscription_by_stripe_subscription_id_transactional; -pub mod insert_unsubscribe_reason; pub mod list_active_user_subscriptions; pub mod upsert_user_subscription_by_stripe_id; diff --git a/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/subscriptions/mark_subscription_as_paid.rs b/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/subscriptions/mark_subscription_as_paid.rs index 979e439a0d..e60e04254e 100644 --- a/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/subscriptions/mark_subscription_as_paid.rs +++ b/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/subscriptions/mark_subscription_as_paid.rs @@ -1,12 +1,68 @@ +use log::{info, warn}; +use enums::common::subscription_namespace::SubscriptionNamespace; +use mysql_queries::queries::users::user_subscriptions::get_user_subscription_by_stripe_subscription_id_transactional::get_user_subscription_by_stripe_subscription_id_transactional; +use mysql_queries::queries::users::user_subscriptions::upsert_user_subscription_by_stripe_id::UpsertUserSubscription; +use reusable_types::stripe::stripe_subscription_status::StripeSubscriptionStatus; use crate::billing_action_fulfillment::artcraft_billing_action::SubscriptionPaidEvent; +use crate::billing_action_fulfillment::subscriptions::upsert_subscription_details::CrudType; pub async fn mark_subscription_as_paid( details: &SubscriptionPaidEvent, transaction: &mut sqlx::Transaction<'_, sqlx::MySql>, ) -> anyhow::Result<()> { + + let maybe_existing_subscription = get_user_subscription_by_stripe_subscription_id_transactional( + &details.stripe_subscription_id, + transaction, + ).await?; + + // NB: It's possible to receive events out of order. + // Entirely possible that the subscription object doesn't exist yet. + if let Some(existing_sub) = maybe_existing_subscription { + match existing_sub.maybe_stripe_subscription_status { + Some(StripeSubscriptionStatus::Canceled) => { + // TODO: We have to mark paid, but this is tricky... + warn!("Existing subscription record already in terminal state..."); + return Ok(()); // Turn this into a no-op. This is stale info. + } + _ => {} // Fall-through + } + } + + /* + + let upsert = UpsertUserSubscription { + // This is the primary key + stripe_subscription_id: &details.stripe_subscription_id, + + // Artcraft product foreign keys + user_token: details.owner_user_token.as_str(), + subscription_namespace: SubscriptionNamespace::Artcraft, + subscription_product_slug: details.subscription.slug.to_str(), + + // Stripe object foreign keys + maybe_stripe_customer_id: Some(&details.stripe_customer_id), + maybe_stripe_product_id: Some(&details.stripe_product_id), + maybe_stripe_price_id: Some(&details.stripe_price_id), + + // Core subscription metadata + maybe_stripe_recurring_interval: Some(details.stripe_recurring_interval), + maybe_stripe_subscription_status: Some(details.stripe_subscription_status), + maybe_stripe_is_production: Some(details.stripe_is_production), + + // Timing data + maybe_stripe_billing_cycle_anchor: Some(details.stripe_billing_cycle_anchor), + subscription_start_at: details.subscription_start_at, + current_billing_period_start_at: details.current_billing_period_start_at, + current_billing_period_end_at: details.current_billing_period_end_at, + subscription_expires_at: details.calculated_subscription_expires_at, + maybe_cancel_at: details.maybe_cancel_at, + maybe_canceled_at: details.maybe_canceled_at, + }; + + upsert.upsert_with_transaction(transaction).await?; - - - + */ + Ok(()) } diff --git a/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/transactionally_fulfill_artcraft_billing_action.rs b/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/transactionally_fulfill_artcraft_billing_action.rs index 989adbce74..d89383e2f6 100644 --- a/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/transactionally_fulfill_artcraft_billing_action.rs +++ b/crates/service/plugins/billing_artcraft/src/billing_action_fulfillment/transactionally_fulfill_artcraft_billing_action.rs @@ -18,7 +18,7 @@ pub async fn transactionally_fulfill_artcraft_billing_action( return Ok(()) } ArtcraftBillingAction::WalletCreditsPurchase(purchase) => { - info!("Completing credits pack purchase for user: {} ... ", purchase.owner_user_token.as_str()); + info!("Completing credits pack purchase for user: {:?} ... ", purchase.owner_user_token); complete_credits_pack_purchase( &purchase.owner_user_token, &purchase.pack, @@ -27,15 +27,19 @@ pub async fn transactionally_fulfill_artcraft_billing_action( ).await?; } ArtcraftBillingAction::SubscriptionCreated(subscription_details) => { + info!("Upserting subscription details (sub created) for user {:?}", subscription_details.owner_user_token); upsert_subscription_details(subscription_details, CrudType::Create, transaction).await?; } ArtcraftBillingAction::SubscriptionUpdated(subscription_details) => { + info!("Upserting subscription details (sub updated) for user {:?}", subscription_details.owner_user_token); upsert_subscription_details(subscription_details, CrudType::Update, transaction).await?; } ArtcraftBillingAction::SubscriptionDeleted(subscription_details) => { + info!("Upserting subscription details (sub deleted) for user {:?}", subscription_details.owner_user_token); upsert_subscription_details(subscription_details, CrudType::Delete, transaction).await?; } ArtcraftBillingAction::SubscriptionPaid(paid_details) => { + info!("Completing subscription paid event for user: {:?}", paid_details.owner_user_token); mark_subscription_as_paid(paid_details, transaction).await?; } _ => { diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_enrichment/invoice/invoice_paid_handler.rs b/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_enrichment/invoice/invoice_paid_handler.rs index 57172fc713..b664f6d548 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_enrichment/invoice/invoice_paid_handler.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_enrichment/invoice/invoice_paid_handler.rs @@ -75,7 +75,7 @@ pub async fn invoice_paid_handler( }; info!("Calling Stripe to look up subscription info..."); - + let subscription = lookup_subscription_from_subscription_id( &subscription_id, stripe_client).await?; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/subscriptions/unsubscribe_reason.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/subscriptions/unsubscribe_reason.rs index ee3a0361dd..79c4a7333f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/subscriptions/unsubscribe_reason.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/subscriptions/unsubscribe_reason.rs @@ -6,7 +6,7 @@ use log::{error, info}; use http_server_common::request::get_request_ip::get_request_ip; use http_server_common::response::serialize_as_json_error::serialize_as_json_error; -use mysql_queries::queries::users::user_subscriptions::insert_unsubscribe_reason::UnsubscribeReasonInsertBuilder; +use mysql_queries::queries::unsubscribe_reason::insert_unsubscribe_reason::UnsubscribeReasonInsertBuilder; use crate::state::server_state::ServerState;