Skip to content

Commit 73fe5af

Browse files
authored
fix: workspace settings usage for change reason validation (#814)
* fix: workspace settings usage for change reason validation * feat: move workspace setting to middleware to add verification * chore: combine workspace settings into workspace context * refactor: rename workspace_request to workspace_context
1 parent 1236863 commit 73fe5af

File tree

31 files changed

+794
-699
lines changed

31 files changed

+794
-699
lines changed

clients/javascript/package-lock.json

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/context_aware_config/src/api/audit_log/handlers.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use actix_web::{get, web::Json, Scope};
22
use chrono::{Duration, Utc};
33
use diesel::{BoolExpressionMethods, ExpressionMethods, QueryDsl, RunQueryDsl};
4-
use service_utils::service::types::{DbConnection, SchemaName};
4+
use service_utils::service::types::{DbConnection, WorkspaceContext};
55
use superposition_derives::authorized;
66
use superposition_types::{
77
api::audit_log::AuditQueryFilters,
@@ -17,10 +17,10 @@ pub fn endpoints() -> Scope {
1717
#[authorized]
1818
#[get("")]
1919
async fn list_handler(
20+
workspace_context: WorkspaceContext,
2021
filters: superposition_query::Query<AuditQueryFilters>,
2122
pagination_params: superposition_query::Query<PaginationParams>,
2223
db_conn: DbConnection,
23-
schema_name: SchemaName,
2424
) -> superposition::Result<Json<PaginatedResponse<EventLog>>> {
2525
let now = Utc::now();
2626
let from_date = filters.from_date.unwrap_or(now - Duration::days(7));
@@ -33,7 +33,9 @@ async fn list_handler(
3333
let DbConnection(mut conn) = db_conn;
3434

3535
let query_builder = |filters: &AuditQueryFilters| {
36-
let mut builder = event_log::event_log.schema_name(&schema_name).into_boxed();
36+
let mut builder = event_log::event_log
37+
.schema_name(&workspace_context.schema_name)
38+
.into_boxed();
3739
if let Some(tables) = filters.table.clone() {
3840
builder = builder.filter(event_log::table_name.eq_any(tables.0));
3941
}

crates/context_aware_config/src/api/config/handlers.rs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use itertools::Itertools;
1616
use serde_json::{json, Map, Value};
1717
#[cfg(feature = "high-performance-mode")]
1818
use service_utils::service::types::{AppHeader, AppState};
19-
use service_utils::service::types::{DbConnection, SchemaName, WorkspaceContext};
19+
use service_utils::service::types::{DbConnection, WorkspaceContext};
2020
use superposition_derives::authorized;
2121
#[cfg(feature = "high-performance-mode")]
2222
use superposition_macros::response_error;
@@ -278,7 +278,7 @@ async fn reduce_config_key(
278278
dimension_schema_map: &HashMap<String, DimensionInfo>,
279279
default_config: Map<String, Value>,
280280
is_approve: bool,
281-
schema_name: &SchemaName,
281+
workspace_context: &WorkspaceContext,
282282
) -> superposition::Result<Config> {
283283
let default_config_val =
284284
default_config
@@ -339,12 +339,22 @@ async fn reduce_config_key(
339339
) => {
340340
if *to_be_deleted {
341341
if is_approve {
342-
let _ = context::delete(cid.clone(), user, conn, schema_name);
342+
let _ = context::delete(
343+
cid.clone(),
344+
user,
345+
conn,
346+
&workspace_context.schema_name,
347+
);
343348
}
344349
og_contexts.retain(|x| x.id != *cid);
345350
} else {
346351
if is_approve {
347-
let _ = context::delete(cid.clone(), user, conn, schema_name);
352+
let _ = context::delete(
353+
cid.clone(),
354+
user,
355+
conn,
356+
&workspace_context.schema_name,
357+
);
348358
if let Ok(put_req) = construct_new_payload(request_payload) {
349359
let description = match put_req.description.clone() {
350360
Some(val) => val,
@@ -353,16 +363,17 @@ async fn reduce_config_key(
353363
put_req.context.clone().into_inner().into(),
354364
),
355365
conn,
356-
schema_name,
366+
&workspace_context.schema_name,
357367
)?,
358368
};
369+
359370
let _ = context::upsert(
360371
put_req,
361372
description,
362373
conn,
363374
false,
364375
user,
365-
schema_name,
376+
workspace_context,
366377
false,
367378
);
368379
}
@@ -417,10 +428,10 @@ async fn reduce_config_key(
417428
#[authorized]
418429
#[put("/reduce")]
419430
async fn reduce_handler(
431+
workspace_context: WorkspaceContext,
420432
req: HttpRequest,
421433
user: User,
422434
db_conn: DbConnection,
423-
schema_name: SchemaName,
424435
) -> superposition::Result<HttpResponse> {
425436
let DbConnection(mut conn) = db_conn;
426437
let is_approve = req
@@ -429,8 +440,9 @@ async fn reduce_handler(
429440
.and_then(|value| value.to_str().ok().and_then(|s| s.parse::<bool>().ok()))
430441
.unwrap_or(false);
431442

432-
let dimensions_info_map = fetch_dimensions_info_map(&mut conn, &schema_name)?;
433-
let mut config = generate_cac(&mut conn, &schema_name)?;
443+
let dimensions_info_map =
444+
fetch_dimensions_info_map(&mut conn, &workspace_context.schema_name)?;
445+
let mut config = generate_cac(&mut conn, &workspace_context.schema_name)?;
434446
let default_config = (config.default_configs).clone();
435447
for (key, _) in default_config {
436448
let contexts = config.contexts;
@@ -445,11 +457,11 @@ async fn reduce_handler(
445457
&dimensions_info_map,
446458
default_config.clone(),
447459
is_approve,
448-
&schema_name,
460+
&workspace_context,
449461
)
450462
.await?;
451463
if is_approve {
452-
config = generate_cac(&mut conn, &schema_name)?;
464+
config = generate_cac(&mut conn, &workspace_context.schema_name)?;
453465
}
454466
}
455467

@@ -459,10 +471,7 @@ async fn reduce_handler(
459471
#[cfg(feature = "high-performance-mode")]
460472
#[authorized]
461473
#[get("/fast")]
462-
async fn get_fast_handler(
463-
schema_name: SchemaName,
464-
state: Data<AppState>,
465-
) -> superposition::Result<HttpResponse> {
474+
async fn get_fast_handler(state: Data<AppState>) -> superposition::Result<HttpResponse> {
466475
use fred::interfaces::MetricsInterface;
467476

468477
log::debug!("Started redis fetch");
@@ -573,8 +582,7 @@ async fn get_handler(
573582
}
574583

575584
let query_filters = query_filters.into_inner();
576-
let mut version =
577-
get_config_version(&query_filters.version, &workspace_context, &mut conn)?;
585+
let mut version = get_config_version(&query_filters.version, &workspace_context)?;
578586

579587
let mut config = generate_config_from_version(
580588
&mut version,
@@ -629,7 +637,7 @@ async fn resolve_handler(
629637
}
630638

631639
let mut config_version =
632-
get_config_version(&query_filters.version, &workspace_context, &mut conn)?;
640+
get_config_version(&query_filters.version, &workspace_context)?;
633641
let mut config = generate_config_from_version(
634642
&mut config_version,
635643
&mut conn,
@@ -656,28 +664,28 @@ async fn resolve_handler(
656664
#[authorized]
657665
#[get("/versions")]
658666
async fn list_version_handler(
667+
workspace_context: WorkspaceContext,
659668
db_conn: DbConnection,
660669
filters: Query<PaginationParams>,
661-
schema_name: SchemaName,
662670
) -> superposition::Result<Json<PaginatedResponse<ConfigVersionListItem>>> {
663671
let DbConnection(mut conn) = db_conn;
664672

665673
if let Some(true) = filters.all {
666674
let config_versions = config_versions::config_versions
667-
.schema_name(&schema_name)
675+
.schema_name(&workspace_context.schema_name)
668676
.select(ConfigVersionListItem::as_select())
669677
.get_results(&mut conn)?;
670678
return Ok(Json(PaginatedResponse::all(config_versions)));
671679
}
672680

673681
let n_version: i64 = config_versions::config_versions
674682
.count()
675-
.schema_name(&schema_name)
683+
.schema_name(&workspace_context.schema_name)
676684
.get_result(&mut conn)?;
677685

678686
let limit = filters.count.unwrap_or(10);
679687
let mut builder = config_versions::config_versions
680-
.schema_name(&schema_name)
688+
.schema_name(&workspace_context.schema_name)
681689
.into_boxed()
682690
.order(config_versions::created_at.desc())
683691
.limit(limit);
@@ -699,14 +707,14 @@ async fn list_version_handler(
699707
#[authorized]
700708
#[get("/version/{version}")]
701709
async fn get_version_handler(
710+
workspace_context: WorkspaceContext,
702711
db_conn: DbConnection,
703712
version: Path<i64>,
704-
schema_name: SchemaName,
705713
) -> superposition::Result<Json<ConfigVersion>> {
706714
let DbConnection(mut conn) = db_conn;
707715

708716
let config_version = config_versions::config_versions
709-
.schema_name(&schema_name)
717+
.schema_name(&workspace_context.schema_name)
710718
.find(version.into_inner())
711719
.get_result::<ConfigVersion>(&mut conn)?;
712720

crates/context_aware_config/src/api/config/helpers.rs

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@ use actix_web::{
77
};
88
use cac_client::{eval_cac, eval_cac_with_reasoning};
99
use chrono::{DateTime, Timelike, Utc};
10-
use diesel::{dsl::max, BoolExpressionMethods, ExpressionMethods, QueryDsl, RunQueryDsl};
10+
use diesel::{dsl::max, ExpressionMethods, QueryDsl, RunQueryDsl};
1111
use serde_json::{Map, Value};
1212
use service_utils::service::types::{AppHeader, SchemaName, WorkspaceContext};
1313
use superposition_macros::{bad_argument, db_error, unexpected_error};
1414
use superposition_types::{
1515
api::config::{ContextPayload, MergeStrategy, ResolveConfigQuery},
1616
custom_query::{DimensionQuery, QueryMap},
17-
database::{
18-
schema::{config_versions::dsl as config_versions, event_log::dsl as event_log},
19-
superposition_schema::superposition::workspaces,
17+
database::schema::{
18+
config_versions::dsl as config_versions, event_log::dsl as event_log,
2019
},
2120
result as superposition, Config, DBConnection,
2221
};
@@ -35,39 +34,12 @@ pub fn apply_prefix_filter_to_config(
3534
Ok(config)
3635
}
3736

38-
fn get_config_version_from_workspace(
39-
workspace_context: &WorkspaceContext,
40-
conn: &mut DBConnection,
41-
) -> Option<i64> {
42-
match workspaces::dsl::workspaces
43-
.select(workspaces::config_version)
44-
.filter(
45-
workspaces::organisation_id
46-
.eq(&workspace_context.organisation_id.0)
47-
.and(workspaces::workspace_name.eq(&workspace_context.workspace_id.0)),
48-
)
49-
.get_result::<Option<i64>>(conn)
50-
{
51-
Ok(version) => version,
52-
Err(e) => {
53-
log::error!(
54-
"Failed to get config_version for org_id: {}, workspace_name: {} — {:?}",
55-
workspace_context.organisation_id.0,
56-
workspace_context.workspace_id.0,
57-
e
58-
);
59-
None
60-
}
61-
}
62-
}
63-
6437
pub fn get_config_version(
6538
version: &Option<String>,
6639
workspace_context: &WorkspaceContext,
67-
conn: &mut DBConnection,
6840
) -> superposition::Result<Option<i64>> {
6941
version.as_ref().map_or_else(
70-
|| Ok(get_config_version_from_workspace(workspace_context, conn)),
42+
|| Ok(workspace_context.settings.config_version),
7143
|version| {
7244
if *version == *"latest" {
7345
log::trace!("latest config request");

0 commit comments

Comments
 (0)