This commit is contained in:
Brandon Thomas committed 2025-09-12 01:00:04 -04:00
1 parent 294ee0d006
commit 75bc2a98f8
8 files changed
+68 -7

No files matched your search

@@ -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;
@@ -0,0 +1 @@
pub mod insert_unsubscribe_reason;
@@ -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;
@@ -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(())
}
@@ -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?;
}
_ => {
@@ -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?;
@@ -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;