diff --git a/crates/context_aware_config/src/api/config/handlers.rs b/crates/context_aware_config/src/api/config/handlers.rs index d6b0a543b..669420c6e 100644 --- a/crates/context_aware_config/src/api/config/handlers.rs +++ b/crates/context_aware_config/src/api/config/handlers.rs @@ -38,7 +38,7 @@ use superposition_types::{ schema::{config_versions::dsl as config_versions, event_log::dsl as event_log}, }, result as superposition, Cac, Condition, Config, Context, DBConnection, Overrides, - PaginatedResponse, TenantConfig, User, + PaginatedResponse, User, }; use uuid::Uuid; @@ -412,7 +412,6 @@ fn construct_new_payload( async fn reduce_config_key( user: User, conn: &mut DBConnection, - tenant_config: &TenantConfig, mut og_contexts: Vec, mut og_overrides: HashMap, check_key: &str, @@ -497,15 +496,8 @@ async fn reduce_config_key( if is_approve { let _ = context::delete(cid.clone(), user.clone(), conn, &tenant); if let Ok(put_req) = construct_new_payload(request_payload) { - let _ = context::put( - put_req, - conn, - false, - &user, - &tenant, - &tenant_config, - false, - ); + let _ = + context::put(put_req, conn, false, &user, &tenant, false); } } @@ -549,7 +541,6 @@ async fn reduce_config( req: HttpRequest, user: User, db_conn: DbConnection, - tenant_config: TenantConfig, tenant: Tenant, ) -> superposition::Result { let DbConnection(mut conn) = db_conn; @@ -570,7 +561,6 @@ async fn reduce_config( config = reduce_config_key( user.clone(), &mut conn, - &tenant_config, contexts.clone(), overrides.clone(), key.as_str(), diff --git a/crates/context_aware_config/src/api/context/handlers.rs b/crates/context_aware_config/src/api/context/handlers.rs index a6a83e260..d0f3d4053 100644 --- a/crates/context_aware_config/src/api/context/handlers.rs +++ b/crates/context_aware_config/src/api/context/handlers.rs @@ -42,8 +42,7 @@ use superposition_types::{ models::cac::Context, schema::contexts::{self, id}, }, - result as superposition, Contextual, Overridden, PaginatedResponse, SortBy, - TenantConfig, User, + result as superposition, Contextual, Overridden, PaginatedResponse, SortBy, User, }; pub fn endpoints() -> Scope { @@ -67,7 +66,6 @@ async fn put_handler( mut db_conn: DbConnection, user: User, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { let tags = parse_config_tags(custom_headers.config_tags)?; @@ -89,7 +87,6 @@ async fn put_handler( true, &user, &tenant, - &tenant_config, false, ) .map_err(|err: superposition::AppError| { @@ -133,7 +130,6 @@ async fn update_override_handler( mut db_conn: DbConnection, user: User, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { let tags = parse_config_tags(custom_headers.config_tags)?; let (override_resp, version_id) = db_conn @@ -152,7 +148,6 @@ async fn update_override_handler( true, &user, &tenant, - &tenant_config, true, ) .map_err(|err: superposition::AppError| { @@ -193,7 +188,6 @@ async fn move_handler( mut db_conn: DbConnection, user: User, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { let tags = parse_config_tags(custom_headers.config_tags)?; let (move_response, version_id) = db_conn @@ -205,7 +199,6 @@ async fn move_handler( true, &user, &tenant, - &tenant_config, ) .map_err(|err| { log::info!("move api failed with error: {:?}", err); @@ -418,7 +411,6 @@ async fn bulk_operations( db_conn: DbConnection, user: User, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { use contexts::dsl::contexts; let DbConnection(mut conn) = db_conn; @@ -438,7 +430,6 @@ async fn bulk_operations( true, &user, &tenant, - &tenant_config, false, ) .map_err(|err| { @@ -515,7 +506,6 @@ async fn bulk_operations( true, &user, &tenant, - &tenant_config, ) .map_err(|err| { log::error!( diff --git a/crates/context_aware_config/src/api/context/helpers.rs b/crates/context_aware_config/src/api/context/helpers.rs index 3e4a94a4e..db6ec595b 100644 --- a/crates/context_aware_config/src/api/context/helpers.rs +++ b/crates/context_aware_config/src/api/context/helpers.rs @@ -16,11 +16,13 @@ use superposition_types::{ models::cac::Context, schema::{contexts, default_configs::dsl, dimensions}, }, - result as superposition, Cac, Condition, DBConnection, Overrides, TenantConfig, User, + result as superposition, Cac, Condition, DBConnection, Overrides, User, }; -use crate::api::functions::helpers::get_published_functions_by_names; use crate::validation_functions::execute_fn; +use crate::{ + api::functions::helpers::get_published_functions_by_names, helpers::get_workspace, +}; use crate::{ api::{ context::types::FunctionsInfo, @@ -213,7 +215,6 @@ pub fn create_ctx_from_put_req( req: Json, conn: &mut DBConnection, user: &User, - tenant_config: &TenantConfig, tenant: &Tenant, ) -> superposition::Result { let ctx_condition = req.context.to_owned().into_inner(); @@ -228,10 +229,13 @@ pub fn create_ctx_from_put_req( .clone() .ok_or_else(|| bad_argument!("Description should not be empty"))? }; + + let workspace_settings = get_workspace(&tenant, conn)?; + let change_reason = req.change_reason.clone(); validate_condition_with_mandatory_dimensions( &ctx_condition, - &tenant_config.mandatory_dimensions, + &workspace_settings.mandatory_dimensions.unwrap_or_default(), )?; validate_override_with_default_configs(conn, &r_override, tenant)?; validate_condition_with_functions(conn, &ctx_condition, tenant)?; diff --git a/crates/context_aware_config/src/api/context/operations.rs b/crates/context_aware_config/src/api/context/operations.rs index f8f20232b..30d868d98 100644 --- a/crates/context_aware_config/src/api/context/operations.rs +++ b/crates/context_aware_config/src/api/context/operations.rs @@ -10,7 +10,7 @@ use service_utils::service::types::Tenant; use superposition_macros::{bad_argument, db_error, not_found, unexpected_error}; use superposition_types::{ database::{models::cac::Context, schema::contexts}, - result, DBConnection, TenantConfig, User, + result, DBConnection, User, }; use crate::{ @@ -25,7 +25,7 @@ use crate::{ }, dimension::{get_dimension_data, get_dimension_data_map}, }, - helpers::calculate_context_weight, + helpers::{calculate_context_weight, get_workspace}, }; use super::{ @@ -39,11 +39,10 @@ pub fn put( already_under_txn: bool, user: &User, tenant: &Tenant, - tenant_config: &TenantConfig, replace: bool, ) -> result::Result { use contexts::dsl::contexts; - let new_ctx = create_ctx_from_put_req(req, conn, user, tenant_config, &tenant)?; + let new_ctx = create_ctx_from_put_req(req, conn, user, &tenant)?; if already_under_txn { diesel::sql_query("SAVEPOINT put_ctx_savepoint").execute(conn)?; @@ -80,7 +79,6 @@ pub fn r#move( already_under_txn: bool, user: &User, tenant: &Tenant, - tenant_config: &TenantConfig, ) -> result::Result { use contexts::dsl; let req = req.into_inner(); @@ -102,9 +100,11 @@ pub fn r#move( let weight = calculate_context_weight(&ctx_condition_value, &dimension_data_map) .map_err(|_| unexpected_error!("Something Went Wrong"))?; + let workspace_settings = get_workspace(&tenant, conn)?; + validate_condition_with_mandatory_dimensions( &req.context.into_inner(), - &tenant_config.mandatory_dimensions, + &workspace_settings.mandatory_dimensions.unwrap_or_default(), )?; if already_under_txn { diff --git a/crates/context_aware_config/src/api/dimension/handlers.rs b/crates/context_aware_config/src/api/dimension/handlers.rs index df2241ff0..53d0ffe54 100644 --- a/crates/context_aware_config/src/api/dimension/handlers.rs +++ b/crates/context_aware_config/src/api/dimension/handlers.rs @@ -14,11 +14,11 @@ use superposition_macros::{bad_argument, db_error, not_found, unexpected_error}; use superposition_types::{ custom_query::PaginationParams, database::{ - models::cac::Dimension, + models::{cac::Dimension, Workspace}, schema::dimensions::{self, dsl::*}, types::DimensionWithMandatory, }, - result as superposition, PaginatedResponse, TenantConfig, User, + result as superposition, PaginatedResponse, User, }; use crate::{ @@ -26,7 +26,7 @@ use crate::{ types::{CreateReq, FunctionNameEnum}, utils::{get_dimension_usage_context_ids, validate_dimension_position}, }, - helpers::validate_jsonschema, + helpers::{get_workspace, validate_jsonschema}, }; use super::types::{DeleteReq, DimensionName, UpdateReq}; @@ -46,7 +46,6 @@ async fn create( user: User, db_conn: DbConnection, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { let DbConnection(mut conn) = db_conn; @@ -101,8 +100,11 @@ async fn create( match insert_resp { Ok(inserted_dimension) => { - let is_mandatory = tenant_config + let workspace_settings: Workspace = + get_workspace(&tenant, transaction_conn)?; + let is_mandatory = workspace_settings .mandatory_dimensions + .unwrap_or_default() .contains(&inserted_dimension.dimension); Ok(HttpResponse::Created().json(DimensionWithMandatory::new( inserted_dimension, @@ -136,7 +138,6 @@ async fn update( user: User, db_conn: DbConnection, tenant: Tenant, - tenant_config: TenantConfig, ) -> superposition::Result { let name: String = path.clone().into(); use dimensions::dsl; @@ -242,8 +243,10 @@ async fn update( .map_err(|err| db_error!(err)) })?; - let is_mandatory = tenant_config + let workspace_settings = get_workspace(&tenant, &mut conn)?; + let is_mandatory = workspace_settings .mandatory_dimensions + .unwrap_or_default() .contains(&result.dimension); Ok(HttpResponse::Ok().json(DimensionWithMandatory::new(result, is_mandatory))) @@ -252,7 +255,6 @@ async fn update( #[get("")] async fn get( db_conn: DbConnection, - tenant_config: TenantConfig, filters: Query, tenant: Tenant, ) -> superposition::Result>> { @@ -285,11 +287,15 @@ async fn get( } }; + let workspace_settings = get_workspace(&tenant, &mut conn)?; + + let mandatory_dimensions = + workspace_settings.mandatory_dimensions.unwrap_or_default(); + let dimensions_with_mandatory: Vec = result .into_iter() .map(|ele| { - let is_mandatory = - tenant_config.mandatory_dimensions.contains(&ele.dimension); + let is_mandatory = mandatory_dimensions.contains(&ele.dimension); DimensionWithMandatory::new(ele, is_mandatory) }) .collect(); diff --git a/crates/context_aware_config/src/helpers.rs b/crates/context_aware_config/src/helpers.rs index e330abc8b..32cd3c427 100644 --- a/crates/context_aware_config/src/helpers.rs +++ b/crates/context_aware_config/src/helpers.rs @@ -22,10 +22,11 @@ use service_utils::{ use superposition_macros::{bad_argument, db_error, unexpected_error, validation_error}; #[cfg(feature = "high-performance-mode")] use superposition_types::database::schema::event_log::dsl as event_log; +use superposition_types::database::superposition_schema::superposition::workspaces; use superposition_types::DBConnection; use superposition_types::{ database::{ - models::cac::ConfigVersion, + models::{cac::ConfigVersion, Workspace}, schema::{ config_versions, contexts::dsl::{self as ctxt}, @@ -320,6 +321,16 @@ pub fn add_config_version( Ok(version_id) } +pub fn get_workspace( + workspace_schema_name: &String, + db_conn: &mut DBConnection, +) -> superposition::Result { + let workspace = workspaces::dsl::workspaces + .filter(workspaces::workspace_schema_name.eq(workspace_schema_name)) + .get_result::(db_conn)?; + Ok(workspace) +} + #[cfg(feature = "high-performance-mode")] pub async fn put_config_in_redis( version_id: i64, diff --git a/crates/superposition_types/src/lib.rs b/crates/superposition_types/src/lib.rs index 80dd4b01f..95b5c6958 100644 --- a/crates/superposition_types/src/lib.rs +++ b/crates/superposition_types/src/lib.rs @@ -148,7 +148,6 @@ impl Display for RegexEnum { #[derive(Clone, Deserialize)] pub struct TenantConfig { - pub mandatory_dimensions: Vec, pub experiments_webhook_config: WebhookConfig, } @@ -173,7 +172,6 @@ impl FromRequest for TenantConfig { impl Default for TenantConfig { fn default() -> Self { Self { - mandatory_dimensions: Default::default(), experiments_webhook_config: WebhookConfig::Disbled, } }