list updates for admin

This commit is contained in:
mbecker20
2023-07-25 02:33:48 -04:00
parent ec4fcbc553
commit 2bdc7cd39a
5 changed files with 62 additions and 6 deletions

View File

@@ -17,14 +17,15 @@ use monitor_types::{
monitor_timestamp,
permissioned::Permissioned,
};
use mungos::{mongodb::bson::doc, AggStage::*};
use periphery_client::{requests, PeripheryClient};
use rand::{thread_rng, Rng};
use crate::{auth::RequestUser, state::State};
pub mod alert;
pub mod cache;
pub mod channel;
pub mod alert;
pub mod db;
pub fn empty_or_only_spaces(word: &str) -> bool {
@@ -59,7 +60,6 @@ pub fn make_update(
}
impl State {
// USER
pub async fn get_user(&self, user_id: &str) -> anyhow::Result<User> {
@@ -230,6 +230,34 @@ impl State {
Ok(build.get_user_permissions(user_id))
}
pub async fn get_build_ids_for_non_admin(&self, user_id: &str) -> anyhow::Result<Vec<String>> {
self.db
.builds
.aggregate_collect(
[
Match(doc! {
format!("permissions.{}", user_id): { "$in": ["update", "execute", "read"] }
}),
Project(doc! { "_id": 1 }),
],
None,
)
.await
.context("failed to get build ids for non admin | aggregation")?
.into_iter()
.map(|d| {
let id = d
.get("_id")
.context("no _id field")?
.as_object_id()
.context("_id not ObjectId")?
.to_string();
anyhow::Ok(id)
})
.collect::<anyhow::Result<Vec<_>>>()
.context("failed to get build ids for non admin | extract id from document")
}
// BUILDER
pub async fn get_builder(&self, builder_id: &str) -> anyhow::Result<Builder> {

View File

@@ -8,6 +8,7 @@ use monitor_types::{
permissioned::Permissioned,
requests::read::*,
};
use mungos::mongodb::bson::doc;
use resolver_api::Resolve;
use crate::{auth::RequestUser, state::State};
@@ -79,6 +80,19 @@ impl Resolve<GetBuildsSummary, RequestUser> for State {
GetBuildsSummary {}: GetBuildsSummary,
user: RequestUser,
) -> anyhow::Result<GetBuildsSummaryResponse> {
todo!()
let query = if user.is_admin {
None
} else {
let doc = doc! {
};
Some(doc)
};
let total = self.db.builds.collection.count_documents(query, None).await.context("failed to count all build documents")?;
let res = GetBuildsSummaryResponse {
total: total as u32
};
Ok(res)
}
}

View File

@@ -1,5 +1,6 @@
use async_trait::async_trait;
use monitor_types::{entities::update::Update, requests::read::ListUpdates};
use mungos::mongodb::{bson::doc, options::FindOptions};
use resolver_api::Resolve;
use crate::{auth::RequestUser, state::State};
@@ -11,7 +12,19 @@ impl Resolve<ListUpdates, RequestUser> for State {
ListUpdates { query }: ListUpdates,
user: RequestUser,
) -> anyhow::Result<Vec<Update>> {
todo!()
if user.is_admin {
let updates = self
.db
.updates
.get_some(
query,
FindOptions::builder().sort(doc! { "ts": -1 }).build(),
)
.await?;
Ok(updates)
} else {
let build_ids = self.get_build_ids_for_non_admin(&user.id).await?;
todo!()
}
}
}