From 818e4eae1c643fb7d44803c7647941cfe95ffc55 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 20 Apr 2024 01:47:43 -0400 Subject: [PATCH] add feature flags to moderator field of get profile --- .../user_profiles/get_user_profile_by_username.rs | 4 ++++ .../users/src/endpoints/get_profile_handler.rs | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/crates/lib/mysql_queries/src/queries/users/user_profiles/get_user_profile_by_username.rs b/crates/lib/mysql_queries/src/queries/users/user_profiles/get_user_profile_by_username.rs index 7f0ba0e015..0f0cb8b70b 100644 --- a/crates/lib/mysql_queries/src/queries/users/user_profiles/get_user_profile_by_username.rs +++ b/crates/lib/mysql_queries/src/queries/users/user_profiles/get_user_profile_by_username.rs @@ -52,6 +52,7 @@ pub struct UserProfileModeratorFields { pub is_banned: bool, pub maybe_mod_comments: Option, pub maybe_mod_user_token: Option, + pub maybe_feature_flags: Option, } struct RawUserProfileRecord { @@ -78,6 +79,7 @@ struct RawUserProfileRecord { // Mod fields is_banned: i8, + maybe_feature_flags: Option, maybe_mod_comments: Option, maybe_mod_user_token: Option, } @@ -119,6 +121,7 @@ SELECT is_banned, maybe_mod_comments, maybe_mod_user_token, + maybe_feature_flags, created_at FROM users WHERE @@ -170,6 +173,7 @@ WHERE is_banned: i8_to_bool(profile_record.is_banned), maybe_mod_comments: profile_record.maybe_mod_comments, maybe_mod_user_token: profile_record.maybe_mod_user_token, + maybe_feature_flags: profile_record.maybe_feature_flags, }) }; diff --git a/crates/service/plugins/users/src/endpoints/get_profile_handler.rs b/crates/service/plugins/users/src/endpoints/get_profile_handler.rs index ad5a1a9c3b..914d3408fb 100644 --- a/crates/service/plugins/users/src/endpoints/get_profile_handler.rs +++ b/crates/service/plugins/users/src/endpoints/get_profile_handler.rs @@ -3,6 +3,7 @@ #![forbid(unused_mut)] #![forbid(unused_variables)] +use std::collections::BTreeSet; use std::fmt; use actix_web::{HttpRequest, HttpResponse, web}; @@ -17,6 +18,7 @@ use r2d2_redis::redis::Commands; use sqlx::MySqlPool; use utoipa::ToSchema; +use enums::by_table::users::user_feature_flag::UserFeatureFlag; use enums::common::visibility::Visibility; use http_server_common::request::get_request_header_optional::get_request_header_optional; use http_server_common::response::serialize_as_json_error::serialize_as_json_error; @@ -29,6 +31,7 @@ use tokens::tokens::users::UserToken; use crate::common_responses::user_avatars::default_avatar_color_from_username::default_avatar_color_from_username; use crate::common_responses::user_avatars::default_avatar_from_username::default_avatar_from_username; use crate::common_responses::user_details_lite::UserDetailsLight; +use crate::session::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::session::session_checker::SessionChecker; // TODO: This is duplicated in query_user_profile @@ -67,6 +70,10 @@ pub struct UserProfileModeratorFields { pub is_banned: bool, pub maybe_mod_comments: Option, pub maybe_mod_user_token: Option, + + // Collection of feature / rollout flags + // NB: The BTreeSet maintains order so React doesn't introduce re-render state bugs when order changes + pub maybe_feature_flags: BTreeSet, } #[derive(Serialize, Deserialize, Clone, ToSchema)] @@ -273,10 +280,14 @@ pub async fn get_profile_handler( website_url: user_data.user_profile.website_url, created_at: user_data.user_profile.created_at, maybe_moderator_fields: user_data.user_profile.maybe_moderator_fields.map(|mod_fields| { + let feature_flags = + UserSessionFeatureFlags::new(mod_fields.maybe_feature_flags.as_deref()); + UserProfileModeratorFields { is_banned: mod_fields.is_banned, maybe_mod_comments: mod_fields.maybe_mod_comments, maybe_mod_user_token: mod_fields.maybe_mod_user_token, + maybe_feature_flags: feature_flags.clone_flags(), } }), badges: user_data.badges