Merge pull request #591 from buster-so/devin/BUS-1477-1753139868

Add consistent ordering to individual_permissions queries
This commit is contained in:
Nate Kelley 2025-07-22 09:07:12 -06:00 committed by GitHub
commit 1334594b43
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 33 additions and 16 deletions

View File

@ -47,6 +47,7 @@ mockito = "1.2.0"
mockall = "0.12.1"
bb8-redis = "0.18.0"
indexmap = { version = "2.2.6", features = ["serde"] }
itertools = "0.14"
once_cell = "1.20.2"
rustls = { version = "0.23", features = ["ring"] }
rustls-native-certs = "0.8"

View File

@ -37,6 +37,7 @@ semantic_layer = { path = "../semantic_layer" }
# Add any handler-specific dependencies here
dashmap = "5.5.3"
itertools = { workspace = true }
# Add stored_values dependency
stored_values = { path = "../stored_values" }

View File

@ -11,6 +11,7 @@ use database::{
};
use diesel::{ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl, Queryable};
use diesel_async::RunQueryDsl;
use itertools::Itertools;
use middleware::AuthenticatedUser;
use sharing::{check_permission_access, compute_effective_permission};
use tracing;
@ -156,7 +157,10 @@ pub async fn get_collection_handler(
name: p.name,
avatar_url: p.avatar_url,
})
.collect::<Vec<BusterShareIndividual>>(),
.collect::<Vec<BusterShareIndividual>>()
.into_iter()
.sorted_by(|a, b| a.email.to_lowercase().cmp(&b.email.to_lowercase()))
.collect(),
)
}
}

View File

@ -5,6 +5,7 @@ use chrono::{DateTime, Utc};
use diesel::{BoolExpressionMethods, ExpressionMethods, JoinOnDsl, QueryDsl, Queryable, Selectable};
use diesel_async::RunQueryDsl;
use futures::future::join_all;
use itertools::Itertools;
use middleware::AuthenticatedUser;
use serde_json::Value;
use serde_yaml;
@ -390,7 +391,10 @@ pub async fn get_dashboard_handler(
name: p.name,
avatar_url: p.avatar_url,
})
.collect::<Vec<BusterShareIndividual>>(),
.collect::<Vec<BusterShareIndividual>>()
.into_iter()
.sorted_by(|a, b| a.email.to_lowercase().cmp(&b.email.to_lowercase()))
.collect(),
)
}
}

View File

@ -2,6 +2,7 @@ use anyhow::{anyhow, Result};
use diesel::{BoolExpressionMethods, ExpressionMethods, JoinOnDsl, QueryDsl, Queryable};
use diesel_async::RunQueryDsl;
use futures::future::join;
use itertools::Itertools;
use middleware::AuthenticatedUser;
use serde_yaml;
use sharing::asset_access_checks::check_metric_collection_access;
@ -464,7 +465,10 @@ pub async fn get_metric_handler(
name: p.name,
avatar_url: p.avatar_url,
})
.collect::<Vec<crate::metrics::types::BusterShareIndividual>>(),
.collect::<Vec<crate::metrics::types::BusterShareIndividual>>()
.into_iter()
.sorted_by(|a, b| a.email.to_lowercase().cmp(&b.email.to_lowercase()))
.collect(),
)
}
}

View File

@ -182,7 +182,7 @@ export const useShareCollection = () => {
draft.individual_permissions = [
...params.map((p) => ({ ...p })),
...(draft.individual_permissions || [])
];
].sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -208,7 +208,8 @@ export const useUnshareCollection = () => {
if (!previousData) return previousData;
return create(previousData, (draft: BusterCollection) => {
draft.individual_permissions =
draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [];
(draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [])
.sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -231,11 +232,11 @@ export const useUpdateCollectionShare = () => {
if (!previousData) return previousData;
return create(previousData, (draft) => {
draft.individual_permissions =
draft.individual_permissions?.map((t) => {
(draft.individual_permissions?.map((t) => {
const found = params.users?.find((v) => v.email === t.email);
if (found) return { ...t, ...found };
return t;
}) || [];
}) || []).sort((a, b) => a.email.localeCompare(b.email));
if (params.publicly_accessible !== undefined) {
draft.publicly_accessible = params.publicly_accessible;

View File

@ -368,7 +368,7 @@ export const useShareDashboard = () => {
avatar_url: p.avatar_url || null
})),
...(draft.individual_permissions || [])
];
].sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -398,7 +398,8 @@ export const useUnshareDashboard = () => {
if (!previousData) return previousData;
return create(previousData, (draft) => {
draft.individual_permissions =
draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [];
(draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [])
.sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -419,11 +420,11 @@ export const useUpdateDashboardShare = () => {
if (!previousData) return previousData;
return create(previousData, (draft) => {
draft.individual_permissions =
draft.individual_permissions?.map((t) => {
(draft.individual_permissions?.map((t) => {
const found = params.users?.find((v) => v.email === t.email);
if (found) return { ...t, ...found };
return t;
}) || [];
}) || []).sort((a, b) => a.email.localeCompare(b.email));
if (params.publicly_accessible !== undefined) {
draft.publicly_accessible = params.publicly_accessible;

View File

@ -233,7 +233,7 @@ export const useShareMetric = () => {
avatar_url: p.avatar_url || null
})),
...(draft.individual_permissions || [])
];
].sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -264,7 +264,8 @@ export const useUnshareMetric = () => {
if (!previousData) return previousData;
return create(previousData, (draft: BusterMetric) => {
draft.individual_permissions =
draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [];
(draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || [])
.sort((a, b) => a.email.localeCompare(b.email));
});
});
},
@ -297,11 +298,11 @@ export const useUpdateMetricShare = () => {
if (!previousData) return previousData;
return create(previousData, (draft: BusterMetric) => {
draft.individual_permissions =
draft.individual_permissions?.map((t) => {
(draft.individual_permissions?.map((t) => {
const found = variables.params.users?.find((v) => v.email === t.email);
if (found) return { ...t, ...found };
return t;
}) || [];
}) || []).sort((a, b) => a.email.localeCompare(b.email));
if (variables.params.publicly_accessible !== undefined) {
draft.publicly_accessible = variables.params.publicly_accessible;