implement transparent mode

This commit is contained in:
mbecker20
2024-05-23 02:19:42 -07:00
parent ec47bb11ee
commit e8cfc13342
16 changed files with 75 additions and 135 deletions

View File

@@ -13,8 +13,7 @@ use mungos::{
use resolver_api::Resolve;
use crate::{
helpers::query::get_resource_ids_for_non_admin,
state::{db_client, State},
config::core_config, helpers::query::get_resource_ids_for_non_admin, state::{db_client, State}
};
const NUM_ALERTS_PER_PAGE: u64 = 100;
@@ -26,7 +25,7 @@ impl Resolve<ListAlerts, User> for State {
user: User,
) -> anyhow::Result<ListAlertsResponse> {
let mut query = query.unwrap_or_default();
if !user.admin {
if !user.admin && !core_config().transparent_mode {
let server_ids = get_resource_ids_for_non_admin(
&user.id,
ResourceTargetVariant::Server,

View File

@@ -14,9 +14,7 @@ use mungos::mongodb::bson::{doc, oid::ObjectId};
use resolver_api::Resolve;
use crate::{
helpers::query::get_resource_ids_for_non_admin,
resource,
state::{db_client, State},
config::core_config, helpers::query::get_resource_ids_for_non_admin, resource, state::{db_client, State}
};
impl Resolve<GetAlerter, User> for State {
@@ -50,7 +48,7 @@ impl Resolve<GetAlertersSummary, User> for State {
GetAlertersSummary {}: GetAlertersSummary,
user: User,
) -> anyhow::Result<GetAlertersSummaryResponse> {
let query = if user.admin {
let query = if user.admin || core_config().transparent_mode {
None
} else {
let ids = get_resource_ids_for_non_admin(

View File

@@ -1,6 +1,5 @@
use std::{
collections::{HashMap, HashSet},
str::FromStr,
sync::OnceLock,
};
@@ -12,23 +11,19 @@ use monitor_client::{
entities::{
build::{Build, BuildActionState, BuildListItem, BuildState},
permission::PermissionLevel,
update::{ResourceTargetVariant, UpdateStatus},
update::UpdateStatus,
user::User,
Operation,
},
};
use mungos::{
find::find_collect,
mongodb::{
bson::{doc, oid::ObjectId},
options::FindOptions,
},
mongodb::{bson::doc, options::FindOptions},
};
use resolver_api::{Resolve, ResolveToString};
use crate::{
config::core_config,
helpers::query::get_resource_ids_for_non_admin,
resource,
state::{action_states, build_state_cache, db_client, State},
};
@@ -86,31 +81,18 @@ impl Resolve<GetBuildsSummary, User> for State {
GetBuildsSummary {}: GetBuildsSummary,
user: User,
) -> anyhow::Result<GetBuildsSummaryResponse> {
let query = if user.admin {
None
} else {
let ids = get_resource_ids_for_non_admin(
&user.id,
ResourceTargetVariant::Build,
)
.await?
.into_iter()
.flat_map(|id| ObjectId::from_str(&id))
.collect::<Vec<_>>();
let query = doc! {
"_id": { "$in": ids }
};
Some(query)
};
let builds = resource::list_full_for_user::<Build>(
Default::default(),
&user,
)
.await
.context("failed to get all builds")?;
let builds = find_collect(&db_client().await.builds, query, None)
.await
.context("failed to find all build documents")?;
let mut res = GetBuildsSummaryResponse::default();
let cache = build_state_cache();
let action_states = action_states();
for build in builds {
res.total += 1;
@@ -241,9 +223,7 @@ impl Resolve<GetBuildVersions, User> for State {
let versions = find_collect(
&db_client().await.updates,
filter,
FindOptions::builder()
.sort(doc! { "_id": -1 })
.build(),
FindOptions::builder().sort(doc! { "_id": -1 }).build(),
)
.await
.context("failed to pull versions from mongo")?

View File

@@ -51,7 +51,7 @@ impl Resolve<GetBuildersSummary, User> for State {
GetBuildersSummary {}: GetBuildersSummary,
user: User,
) -> anyhow::Result<GetBuildersSummaryResponse> {
let query = if user.admin {
let query = if user.admin || core_config().transparent_mode {
None
} else {
let ids = get_resource_ids_for_non_admin(

View File

@@ -1,4 +1,4 @@
use std::{cmp, collections::HashSet, str::FromStr};
use std::{cmp, collections::HashSet};
use anyhow::{anyhow, Context};
use monitor_client::{
@@ -10,23 +10,17 @@ use monitor_client::{
},
permission::PermissionLevel,
server::Server,
update::{Log, ResourceTargetVariant},
update::Log,
user::User,
},
};
use mungos::{
find::find_collect,
mongodb::bson::{doc, oid::ObjectId},
};
use periphery_client::api;
use resolver_api::Resolve;
use crate::{
helpers::{
periphery_client, query::get_resource_ids_for_non_admin,
},
helpers::periphery_client,
resource,
state::{action_states, db_client, deployment_status_cache, State},
state::{action_states, deployment_status_cache, State},
};
impl Resolve<GetDeployment, User> for State {
@@ -200,27 +194,12 @@ impl Resolve<GetDeploymentsSummary, User> for State {
GetDeploymentsSummary {}: GetDeploymentsSummary,
user: User,
) -> anyhow::Result<GetDeploymentsSummaryResponse> {
let query = if user.admin {
None
} else {
let ids = get_resource_ids_for_non_admin(
&user.id,
ResourceTargetVariant::Deployment,
)
.await?
.into_iter()
.flat_map(|id| ObjectId::from_str(&id))
.collect::<Vec<_>>();
let query = doc! {
"_id": { "$in": ids }
};
Some(query)
};
let deployments =
find_collect(&db_client().await.deployments, query, None)
.await
.context("failed to find all deployment documents")?;
let deployments = resource::list_full_for_user::<Deployment>(
Default::default(),
&user,
)
.await
.context("failed to get deployments from db")?;
let mut res = GetDeploymentsSummaryResponse::default();
let status_cache = deployment_status_cache();
for deployment in deployments {

View File

@@ -211,6 +211,7 @@ impl Resolve<GetCoreInfo, User> for State {
.github_webhook_base_url
.clone()
.unwrap_or_else(|| config.host.clone()),
transparent_mode: config.transparent_mode,
})
}
}

View File

@@ -1,5 +1,3 @@
use std::str::FromStr;
use anyhow::Context;
use monitor_client::{
api::read::{
@@ -11,20 +9,14 @@ use monitor_client::{
entities::{
permission::PermissionLevel,
procedure::{Procedure, ProcedureState},
update::ResourceTargetVariant,
user::User,
},
};
use mungos::{
find::find_collect,
mongodb::bson::{doc, oid::ObjectId},
};
use resolver_api::Resolve;
use crate::{
helpers::query::get_resource_ids_for_non_admin,
resource,
state::{action_states, db_client, procedure_state_cache, State},
state::{action_states, procedure_state_cache, State},
};
impl Resolve<GetProcedure, User> for State {
@@ -58,27 +50,12 @@ impl Resolve<GetProceduresSummary, User> for State {
GetProceduresSummary {}: GetProceduresSummary,
user: User,
) -> anyhow::Result<GetProceduresSummaryResponse> {
let query = if user.admin {
None
} else {
let ids = get_resource_ids_for_non_admin(
&user.id,
ResourceTargetVariant::Procedure,
)
.await?
.into_iter()
.flat_map(|id| ObjectId::from_str(&id))
.collect::<Vec<_>>();
let query = doc! {
"_id": { "$in": ids }
};
Some(query)
};
let procedures =
find_collect(&db_client().await.procedures, query, None)
.await
.context("failed to find all procedure documents")?;
let procedures = resource::list_full_for_user::<Procedure>(
Default::default(),
&user,
)
.await
.context("failed to get procedures from db")?;
let mut res = GetProceduresSummaryResponse::default();

View File

@@ -1,25 +1,17 @@
use std::str::FromStr;
use anyhow::Context;
use monitor_client::{
api::read::*,
entities::{
permission::PermissionLevel,
repo::{Repo, RepoActionState, RepoListItem, RepoState},
update::ResourceTargetVariant,
user::User,
},
};
use mungos::{
find::find_collect,
mongodb::bson::{doc, oid::ObjectId},
};
use resolver_api::Resolve;
use crate::{
helpers::query::get_resource_ids_for_non_admin,
resource,
state::{action_states, db_client, repo_state_cache, State},
state::{action_states, repo_state_cache, State},
};
impl Resolve<GetRepo, User> for State {
@@ -75,26 +67,11 @@ impl Resolve<GetReposSummary, User> for State {
GetReposSummary {}: GetReposSummary,
user: User,
) -> anyhow::Result<GetReposSummaryResponse> {
let query = if user.admin {
None
} else {
let ids = get_resource_ids_for_non_admin(
&user.id,
ResourceTargetVariant::Alerter,
)
.await?
.into_iter()
.flat_map(|id| ObjectId::from_str(&id))
.collect::<Vec<_>>();
let query = doc! {
"_id": { "$in": ids }
};
Some(query)
};
let repos =
resource::list_full_for_user::<Repo>(Default::default(), &user)
.await
.context("failed to get repos from db")?;
let repos = find_collect(&db_client().await.repos, query, None)
.await
.context("failed to find all repo documents")?;
let mut res = GetReposSummaryResponse::default();
let cache = repo_state_cache();

View File

@@ -68,10 +68,10 @@ impl Resolve<GetServerTemplatesSummary, User> for State {
};
let total = db_client()
.await
.builders
.server_templates
.count_documents(query, None)
.await
.context("failed to count all builder documents")?;
.context("failed to count all server template documents")?;
let res = GetServerTemplatesSummaryResponse {
total: total as u32,
};

View File

@@ -27,6 +27,7 @@ use mungos::{
use resolver_api::Resolve;
use crate::{
config::core_config,
helpers::query::get_resource_ids_for_non_admin,
resource,
state::{db_client, State},
@@ -40,7 +41,7 @@ impl Resolve<ListUpdates, User> for State {
ListUpdates { query, page }: ListUpdates,
user: User,
) -> anyhow::Result<ListUpdatesResponse> {
let query = if user.admin {
let query = if user.admin || core_config().transparent_mode {
query
} else {
let server_ids = get_resource_ids_for_non_admin(
@@ -163,7 +164,7 @@ impl Resolve<GetUpdate, User> for State {
.await
.context("failed to query to db")?
.context("no update exists with given id")?;
if user.admin {
if user.admin || core_config().transparent_mode {
return Ok(update);
}
match &update.target {