diff --git a/crates/context_aware_config/src/api/dimension/handlers.rs b/crates/context_aware_config/src/api/dimension/handlers.rs index bb3ad8a17..8026a40bf 100644 --- a/crates/context_aware_config/src/api/dimension/handlers.rs +++ b/crates/context_aware_config/src/api/dimension/handlers.rs @@ -592,6 +592,19 @@ async fn delete_handler( .schema_name(&workspace_context.schema_name) .get_result(&mut conn)?; + let is_mandatory = workspace_context + .settings + .mandatory_dimensions + .as_ref() + .map_or(false, |dims| dims.contains(&dimension_data.dimension)); + + if is_mandatory { + return Err(bad_argument!( + "Dimension `{}` is mandatory and cannot be deleted", + name + )); + } + let context_ids = get_dimension_usage_context_ids( &name, &mut conn, diff --git a/crates/superposition/src/workspace/handlers.rs b/crates/superposition/src/workspace/handlers.rs index d28447bfb..760f4079e 100644 --- a/crates/superposition/src/workspace/handlers.rs +++ b/crates/superposition/src/workspace/handlers.rs @@ -36,7 +36,7 @@ use superposition_types::{ custom_query::PaginationParams, database::{ models::{Organisation, Workspace, WorkspaceStatus}, - schema::config_versions::dsl as config_versions, + schema::{config_versions::dsl as config_versions, dimensions}, superposition_schema::superposition::{organisations, workspaces}, }, result as superposition, @@ -182,9 +182,31 @@ async fn update_handler( let workspace_name = workspace_name.into_inner(); let timestamp = Utc::now(); let schema_name = SchemaName(format!("{}_{}", *org_id, workspace_name)); - // TODO: mandatory dimensions updation needs to be validated - // for the existance of the dimensions in the workspace let DbConnection(mut conn) = db_conn; + + if let Some(ref mandatory_dims) = request.mandatory_dimensions { + let existing_dimensions: Vec = dimensions::dsl::dimensions + .select(dimensions::dimension) + .schema_name(&schema_name) + .load::(&mut conn) + .map_err(|err| { + log::error!("failed to fetch dimensions: {}", err); + db_error!(err) + })?; + + let missing: Vec<&String> = mandatory_dims + .iter() + .filter(|d| !existing_dimensions.contains(d)) + .collect(); + + if !missing.is_empty() { + return Err(bad_argument!( + "The following mandatory dimensions do not exist in the workspace: {:?}", + missing + )); + } + } + if let Some(I64Update::Add(version)) = request.config_version { let _ = config_versions::config_versions .select(config_versions::id)