use sqlx::AnyPool; use crate::admin::settings::get_setting; use crate::db::DatabaseBackend; pub struct FeatureFlag; impl FeatureFlag { pub const SPACES_ENABLED: &str = "feature.spaces_enabled"; } pub async fn is_enabled(pool: &AnyPool, key: &str, backend: DatabaseBackend) -> bool { get_setting(pool, key, backend) .await .map(|v| v.eq_ignore_ascii_case("true")) .unwrap_or(false) } #[derive(serde::Serialize)] pub struct FeatureFlagStatus { pub key: String, pub name: String, pub description: String, pub enabled: bool, } pub async fn list_flags(pool: &AnyPool, backend: DatabaseBackend) -> Vec { let all_flags = [( FeatureFlag::SPACES_ENABLED, "Permissioned Spaces", "Collaborative data spaces with granular permissions, membership, and invites.", )]; let mut result = Vec::new(); for (key, name, description) in all_flags { let enabled = is_enabled(pool, key, backend).await; result.push(FeatureFlagStatus { key: key.to_string(), name: name.to_string(), description: description.to_string(), enabled, }); } result }