From d90df6f8b883c22699e0943fc47e7fa51da5daa3 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Wed, 25 Oct 2023 00:55:54 -0400 Subject: [PATCH] change billing token to typed token --- crates/_types/tokens/src/prefixes.rs | 4 +++- crates/_types/tokens/src/tokens/mod.rs | 3 ++- .../_types/tokens/src/tokens/user_subscriptions.rs | 14 ++++++++++++++ .../{vocoder_model_token.rs => vocoder_models.rs} | 0 .../upsert_user_subscription_by_stripe_id.rs | 5 ++--- .../src/queries/vocoder/insert_vocoder_model.rs | 2 +- crates/lib/mysql_queries/src/tokens.rs | 6 ------ 7 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 crates/_types/tokens/src/tokens/user_subscriptions.rs rename crates/_types/tokens/src/tokens/{vocoder_model_token.rs => vocoder_models.rs} (100%) diff --git a/crates/_types/tokens/src/prefixes.rs b/crates/_types/tokens/src/prefixes.rs index e9b05ed59a..9e59a5cc43 100644 --- a/crates/_types/tokens/src/prefixes.rs +++ b/crates/_types/tokens/src/prefixes.rs @@ -32,6 +32,7 @@ pub(crate) enum EntityType { TwitchOauthInternal, User, UserSession, + UserSubscription, VocoderModel, VoiceConversionModel, VoiceConversionResult, @@ -67,6 +68,7 @@ impl EntityType { Self::TwitchOauthInternal => "TOI:", // NB: Old-style prefix, do not use for future tokens. Self::User => "user_", Self::UserSession => "session_", + Self::UserSubscription => "SUB:", // NB: Old-style prefix, do not use for future tokens. Self::VocoderModel => "VM:", // NB: Old-style prefix, do not use for future tokens. Self::VoiceConversionModel => "vcm_", Self::VoiceConversionResult => "vcr_", @@ -127,7 +129,7 @@ mod tests { #[test] fn test_all_prefixes_end_with_separator_length_one() { for prefix in EntityType::iter().map(|entity| entity.prefix()) { - if prefix == "news_story_" || prefix == "tts_task_" { + if prefix == "news_story_" || prefix == "tts_task_" || prefix == "INT_API:" { // TODO/FIXME: I'm too tired at 5AM to replacen from the left. Make this test valid. // These tokens are from the AIChatBot sidecar, so asserting their validity is less important. continue; diff --git a/crates/_types/tokens/src/tokens/mod.rs b/crates/_types/tokens/src/tokens/mod.rs index 201611db77..a3f4620b12 100644 --- a/crates/_types/tokens/src/tokens/mod.rs +++ b/crates/_types/tokens/src/tokens/mod.rs @@ -15,8 +15,9 @@ pub mod twitch_event_rule; pub mod twitch_oauth_tokens_grouping; pub mod twitch_oauth_tokens_internal; pub mod user_sessions; +pub mod user_subscriptions; pub mod users; -pub mod vocoder_model_token; +pub mod vocoder_models; pub mod voice_conversion_models; pub mod voice_conversion_results; pub mod w2l_results; diff --git a/crates/_types/tokens/src/tokens/user_subscriptions.rs b/crates/_types/tokens/src/tokens/user_subscriptions.rs new file mode 100644 index 0000000000..8f629582e5 --- /dev/null +++ b/crates/_types/tokens/src/tokens/user_subscriptions.rs @@ -0,0 +1,14 @@ +use std::fmt::Debug; + +use serde::Deserialize; +use serde::Serialize; + +use crate::prefixes::EntityType; + +/// Primary key for the `user_subscriptions` table. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, sqlx::Type, Debug, Serialize, Deserialize)] +#[sqlx(transparent)] +pub struct UserSubscriptionToken(pub String); + +impl_string_token!(UserSubscriptionToken); +impl_crockford_generator!(UserSubscriptionToken, 32usize, EntityType::UserSubscription, CrockfordLower); diff --git a/crates/_types/tokens/src/tokens/vocoder_model_token.rs b/crates/_types/tokens/src/tokens/vocoder_models.rs similarity index 100% rename from crates/_types/tokens/src/tokens/vocoder_model_token.rs rename to crates/_types/tokens/src/tokens/vocoder_models.rs diff --git a/crates/lib/mysql_queries/src/queries/users/user_subscriptions/upsert_user_subscription_by_stripe_id.rs b/crates/lib/mysql_queries/src/queries/users/user_subscriptions/upsert_user_subscription_by_stripe_id.rs index 6b47bc33c5..3dc76a6c71 100644 --- a/crates/lib/mysql_queries/src/queries/users/user_subscriptions/upsert_user_subscription_by_stripe_id.rs +++ b/crates/lib/mysql_queries/src/queries/users/user_subscriptions/upsert_user_subscription_by_stripe_id.rs @@ -5,8 +5,7 @@ use sqlx::MySqlPool; use errors::AnyhowResult; use reusable_types::stripe::stripe_recurring_interval::StripeRecurringInterval; use reusable_types::stripe::stripe_subscription_status::StripeSubscriptionStatus; - -use crate::tokens::Tokens; +use tokens::tokens::user_subscriptions::UserSubscriptionToken; // TODO: Make a trait with default impls to handle common query concerns. @@ -54,7 +53,7 @@ pub struct UpsertUserSubscription<'a> { impl <'a> UpsertUserSubscription<'a> { pub async fn upsert(&'a self, mysql_pool: &MySqlPool) -> AnyhowResult<()> { - let token = Tokens::new_subscription_token()?; + let token = UserSubscriptionToken::generate().to_string(); // NB: The following behaviors are intentional // - We only set the "token" initially. diff --git a/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs b/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs index 1505cdbad3..18ea02426c 100644 --- a/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs +++ b/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs @@ -11,7 +11,7 @@ use sqlx::MySqlPool; use enums::common::visibility::Visibility; use enums::common::vocoder_type::VocoderType; use errors::AnyhowResult; -use tokens::tokens::vocoder_model_token::VocoderModelToken; +use tokens::tokens::vocoder_models::VocoderModelToken; pub struct Args<'a, P: AsRef> { pub vocoder_type: VocoderType, diff --git a/crates/lib/mysql_queries/src/tokens.rs b/crates/lib/mysql_queries/src/tokens.rs index 0d4686e1ea..b04a379c18 100644 --- a/crates/lib/mysql_queries/src/tokens.rs +++ b/crates/lib/mysql_queries/src/tokens.rs @@ -37,10 +37,4 @@ impl Tokens { pub fn new_category() -> AnyhowResult { random_prefix_crockford_token("CAT:", 15, false) } - - // ========== [Billing] Tokens not typically visible to users ========== - - pub fn new_subscription_token() -> AnyhowResult { - random_prefix_crockford_token("SUB:", 32, false) - } }