diff --git a/crates/schema/public/enums/src/by_table/users/user_feature_flag.rs b/crates/schema/public/enums/src/by_table/users/user_feature_flag.rs index 7683e862df..9d6dd57084 100644 --- a/crates/schema/public/enums/src/by_table/users/user_feature_flag.rs +++ b/crates/schema/public/enums/src/by_table/users/user_feature_flag.rs @@ -40,6 +40,10 @@ pub enum UserFeatureFlag { /// Access to Happy Horse (with a rate limit) #[serde(rename = "hh_rl")] HappyHorseRateLimit, + + /// Access to the referrals program + #[serde(rename = "referrals")] + ReferralsProgram, } // TODO(bt, 2022-12-21): This desperately needs MySQL integration tests! @@ -58,6 +62,7 @@ impl UserFeatureFlag { Self::SeedanceWhitelist => "sd_wl", Self::HappyHorse => "hh", Self::HappyHorseRateLimit => "hh_rl", + Self::ReferralsProgram => "referrals", } } @@ -70,6 +75,7 @@ impl UserFeatureFlag { "sd_wl" => Ok(Self::SeedanceWhitelist), "hh" => Ok(Self::HappyHorse), "hh_rl" => Ok(Self::HappyHorseRateLimit), + "referrals" => Ok(Self::ReferralsProgram), _ => Err(format!("invalid value: {:?}", value)), } } @@ -83,6 +89,7 @@ impl UserFeatureFlag { Self::SeedanceWhitelist => "DO NOT USE: Seedance Whitelist (legacy)", Self::HappyHorse => "Happy Horse (no Rate Limit)", Self::HappyHorseRateLimit => "Happy Horse (with Rate Limit)", + Self::ReferralsProgram => "Referrals Program", } } @@ -95,6 +102,7 @@ impl UserFeatureFlag { Self::SeedanceWhitelist => "DO NOT USE THIS. IT WILL BREAK ACCOUNTS.", Self::HappyHorse => "Access to Happy Horse (without a rate limit - dangerous)", Self::HappyHorseRateLimit => "Access to Happy Horse (with a rate limit)", + Self::ReferralsProgram => "Access to the referrals program", } } @@ -109,6 +117,7 @@ impl UserFeatureFlag { Self::SeedanceWhitelist, Self::HappyHorse, Self::HappyHorseRateLimit, + Self::ReferralsProgram, ]) } } @@ -130,6 +139,7 @@ mod tests { assert_serialization(UserFeatureFlag::SeedanceWhitelist, "sd_wl"); assert_serialization(UserFeatureFlag::HappyHorse, "hh"); assert_serialization(UserFeatureFlag::HappyHorseRateLimit, "hh_rl"); + assert_serialization(UserFeatureFlag::ReferralsProgram, "referrals"); } #[test] @@ -141,6 +151,7 @@ mod tests { assert_eq!(UserFeatureFlag::SeedanceWhitelist.to_str(), "sd_wl"); assert_eq!(UserFeatureFlag::HappyHorse.to_str(), "hh"); assert_eq!(UserFeatureFlag::HappyHorseRateLimit.to_str(), "hh_rl"); + assert_eq!(UserFeatureFlag::ReferralsProgram.to_str(), "referrals"); } #[test] @@ -152,13 +163,14 @@ mod tests { assert_eq!(UserFeatureFlag::from_str("sd_wl").unwrap(), UserFeatureFlag::SeedanceWhitelist); assert_eq!(UserFeatureFlag::from_str("hh").unwrap(), UserFeatureFlag::HappyHorse); assert_eq!(UserFeatureFlag::from_str("hh_rl").unwrap(), UserFeatureFlag::HappyHorseRateLimit); + assert_eq!(UserFeatureFlag::from_str("referrals").unwrap(), UserFeatureFlag::ReferralsProgram); assert!(UserFeatureFlag::from_str("foo").is_err()); } #[test] fn all_variants() { let mut variants = UserFeatureFlag::all_variants(); - assert_eq!(variants.len(), 7); + assert_eq!(variants.len(), 8); assert_eq!(variants.pop_first(), Some(UserFeatureFlag::ExploreMedia)); assert_eq!(variants.pop_first(), Some(UserFeatureFlag::Studio)); assert_eq!(variants.pop_first(), Some(UserFeatureFlag::Upload3d)); @@ -166,6 +178,7 @@ mod tests { assert_eq!(variants.pop_first(), Some(UserFeatureFlag::SeedanceWhitelist)); assert_eq!(variants.pop_first(), Some(UserFeatureFlag::HappyHorse)); assert_eq!(variants.pop_first(), Some(UserFeatureFlag::HappyHorseRateLimit)); + assert_eq!(variants.pop_first(), Some(UserFeatureFlag::ReferralsProgram)); assert_eq!(variants.pop_first(), None); } } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs index e01aef6b75..6c2bc87894 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/user_referral_codes/create_referral_code_handler.rs @@ -7,6 +7,7 @@ use utoipa::ToSchema; use artcraft_api_defs::user_referral_codes::create_referral_code::{CreateReferralCodeRequest, CreateReferralCodeResponse}; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; +use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::state::server_state::ServerState; use mysql_queries::errors::database_insert_error::DatabaseInsertError; use mysql_queries::queries::user_referral_codes::create_referral_code::{create_referral_code, CreateReferralCodeArgs}; @@ -49,6 +50,11 @@ pub async fn create_referral_code_handler( _ => return Err(AdvancedCommonWebError::NotAuthorized), }; + let feature_flags = UserSessionFeatureFlags::new(user_session.maybe_feature_flags.as_deref()); + if !feature_flags.can_use_referrals_program() { + return Err(AdvancedCommonWebError::NotAuthorized); + } + let user_token = &user_session.user_token; // Validate code: trim, check length, check characters. diff --git a/crates/service/web/storyteller_web/src/http_server/session/lookup/user_session_feature_flags.rs b/crates/service/web/storyteller_web/src/http_server/session/lookup/user_session_feature_flags.rs index 17fe92c375..ace366d2dc 100644 --- a/crates/service/web/storyteller_web/src/http_server/session/lookup/user_session_feature_flags.rs +++ b/crates/service/web/storyteller_web/src/http_server/session/lookup/user_session_feature_flags.rs @@ -97,6 +97,10 @@ impl UserSessionFeatureFlags { pub fn can_use_happy_horse_rate_limited(&self) -> bool { self.feature_flags.contains(&UserFeatureFlag::HappyHorseRateLimit) } + + pub fn can_use_referrals_program(&self) -> bool { + self.feature_flags.contains(&UserFeatureFlag::ReferralsProgram) + } } #[cfg(test)]