From 673f20fca5c2edb2b684e072763e1b5e6838c615 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Wed, 13 May 2026 19:47:43 -0400 Subject: [PATCH] token, add another field --- .../up.sql | 6 ++++-- .../user_tables/user_referral_codes.sql | 5 ++++- crates/schema/public/tokens/src/prefixes.rs | 2 ++ crates/schema/public/tokens/src/tokens/mod.rs | 1 + .../tokens/src/tokens/user_referral_codes.rs | 15 +++++++++++++++ 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 crates/schema/public/tokens/src/tokens/user_referral_codes.rs diff --git a/_database/sql/migrations/2026-05-13-225037-0000_user_referral_codes/up.sql b/_database/sql/migrations/2026-05-13-225037-0000_user_referral_codes/up.sql index 8bcbfec60a..14b23dab05 100644 --- a/_database/sql/migrations/2026-05-13-225037-0000_user_referral_codes/up.sql +++ b/_database/sql/migrations/2026-05-13-225037-0000_user_referral_codes/up.sql @@ -10,9 +10,11 @@ CREATE TABLE user_referral_codes ( -- The human-readable referral code (e.g. a username or custom code). -- This can be changed. - -- These must be unique. code VARCHAR(32) NOT NULL, + -- Lowercased version of `code` for case-insensitive uniqueness lookups. + code_lowercase VARCHAR(32) NOT NULL, + -- The user who owns this referral code. owner_user_token VARCHAR(32) NOT NULL, @@ -25,7 +27,7 @@ CREATE TABLE user_referral_codes ( -- INDICES -- PRIMARY KEY (id), UNIQUE KEY unique_token (token), - UNIQUE KEY unique_code (code), + UNIQUE KEY unique_code_lowercase (code_lowercase), KEY index_owner_user_token (owner_user_token) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/_database/sql/migrations_squashed/user_tables/user_referral_codes.sql b/_database/sql/migrations_squashed/user_tables/user_referral_codes.sql index f75c5bd7d8..4c259f4757 100644 --- a/_database/sql/migrations_squashed/user_tables/user_referral_codes.sql +++ b/_database/sql/migrations_squashed/user_tables/user_referral_codes.sql @@ -11,6 +11,9 @@ CREATE TABLE user_referral_codes ( -- The human-readable referral code (e.g. a username or custom code). code VARCHAR(32) NOT NULL, + -- Lowercased version of `code` for case-insensitive uniqueness lookups. + code_lowercase VARCHAR(32) NOT NULL, + -- The user who owns this referral code. owner_user_token VARCHAR(32) NOT NULL, @@ -23,7 +26,7 @@ CREATE TABLE user_referral_codes ( -- INDICES -- PRIMARY KEY (id), UNIQUE KEY unique_token (token), - UNIQUE KEY unique_code (code), + UNIQUE KEY unique_code_lowercase (code_lowercase), KEY index_owner_user_token (owner_user_token) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/crates/schema/public/tokens/src/prefixes.rs b/crates/schema/public/tokens/src/prefixes.rs index ae884e6feb..1019a0e65d 100644 --- a/crates/schema/public/tokens/src/prefixes.rs +++ b/crates/schema/public/tokens/src/prefixes.rs @@ -47,6 +47,7 @@ pub(crate) enum TokenPrefix { User, UserImpersonationRequest, UserBookmark, + UserReferralCode, UserSession, UserSubscription, VoiceConversionModel, @@ -134,6 +135,7 @@ impl PrefixGenerator for TokenPrefix { Self::User => "user_", // NB: Previously "U:" Self::UserImpersonationRequest => "uimpr_", Self::UserBookmark => "ub_", + Self::UserReferralCode => "urc_", Self::UserSession => "session_", Self::UserSubscription => "subscription_", // NB: Previously "SUB:" Self::VoiceConversionModel => "vcm_", diff --git a/crates/schema/public/tokens/src/tokens/mod.rs b/crates/schema/public/tokens/src/tokens/mod.rs index c80accb6d2..8a105ddc4d 100644 --- a/crates/schema/public/tokens/src/tokens/mod.rs +++ b/crates/schema/public/tokens/src/tokens/mod.rs @@ -31,6 +31,7 @@ pub mod twitch_oauth_tokens_grouping; pub mod twitch_oauth_tokens_internal; pub mod user_bookmarks; pub mod user_impersonation_requests; +pub mod user_referral_codes; pub mod user_sessions; pub mod user_subscriptions; pub mod users; diff --git a/crates/schema/public/tokens/src/tokens/user_referral_codes.rs b/crates/schema/public/tokens/src/tokens/user_referral_codes.rs new file mode 100644 index 0000000000..4e7815bc99 --- /dev/null +++ b/crates/schema/public/tokens/src/tokens/user_referral_codes.rs @@ -0,0 +1,15 @@ +use serde::Deserialize; +use serde::Serialize; +use utoipa::ToSchema; + +use crate::prefixes::TokenPrefix; + +/// The primary key for user referral codes. +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Default, ToSchema)] +#[cfg_attr(feature = "database", derive(sqlx::Type))] +#[cfg_attr(feature = "database", sqlx(transparent))] +pub struct UserReferralCodeToken(pub String); + +impl_mysql_token_from_row!(UserReferralCodeToken); +impl_string_token!(UserReferralCodeToken); +impl_crockford_generator!(UserReferralCodeToken, 18usize, TokenPrefix::UserReferralCode, CrockfordLower);