mirror of
https://github.com/moghtech/komodo.git
synced 2026-04-29 12:43:26 -05:00
add new ec2 instance types clean up testing config document the libraries a bit clean up main update sysinfo and otel update client resolver 3.0 resolver v3 prog clean up gitignore implement periphery resolver v3 clean up core read api v3 more prog execute api missing apis compiling 1.16.13 work on more granular traits prog on crud
89 lines
2.3 KiB
Rust
89 lines
2.3 KiB
Rust
use anyhow::Context;
|
|
use komodo_client::{
|
|
api::read::{
|
|
GetAlert, GetAlertResponse, ListAlerts, ListAlertsResponse,
|
|
},
|
|
entities::{
|
|
deployment::Deployment, server::Server, stack::Stack,
|
|
sync::ResourceSync,
|
|
},
|
|
};
|
|
use mungos::{
|
|
by_id::find_one_by_id,
|
|
find::find_collect,
|
|
mongodb::{bson::doc, options::FindOptions},
|
|
};
|
|
use resolver_api::Resolve;
|
|
|
|
use crate::{
|
|
config::core_config, resource::get_resource_ids_for_user,
|
|
state::db_client,
|
|
};
|
|
|
|
use super::ReadArgs;
|
|
|
|
const NUM_ALERTS_PER_PAGE: u64 = 100;
|
|
|
|
impl Resolve<ReadArgs> for ListAlerts {
|
|
async fn resolve(
|
|
self,
|
|
ReadArgs { user }: &ReadArgs,
|
|
) -> serror::Result<ListAlertsResponse> {
|
|
let mut query = self.query.unwrap_or_default();
|
|
if !user.admin && !core_config().transparent_mode {
|
|
let server_ids =
|
|
get_resource_ids_for_user::<Server>(user).await?;
|
|
let stack_ids =
|
|
get_resource_ids_for_user::<Stack>(user).await?;
|
|
let deployment_ids =
|
|
get_resource_ids_for_user::<Deployment>(user).await?;
|
|
let sync_ids =
|
|
get_resource_ids_for_user::<ResourceSync>(user).await?;
|
|
query.extend(doc! {
|
|
"$or": [
|
|
{ "target.type": "Server", "target.id": { "$in": &server_ids } },
|
|
{ "target.type": "Stack", "target.id": { "$in": &stack_ids } },
|
|
{ "target.type": "Deployment", "target.id": { "$in": &deployment_ids } },
|
|
{ "target.type": "ResourceSync", "target.id": { "$in": &sync_ids } },
|
|
]
|
|
});
|
|
}
|
|
|
|
let alerts = find_collect(
|
|
&db_client().alerts,
|
|
query,
|
|
FindOptions::builder()
|
|
.sort(doc! { "ts": -1 })
|
|
.limit(NUM_ALERTS_PER_PAGE as i64)
|
|
.skip(self.page * NUM_ALERTS_PER_PAGE)
|
|
.build(),
|
|
)
|
|
.await
|
|
.context("failed to get alerts from db")?;
|
|
|
|
let next_page = if alerts.len() < NUM_ALERTS_PER_PAGE as usize {
|
|
None
|
|
} else {
|
|
Some((self.page + 1) as i64)
|
|
};
|
|
|
|
let res = ListAlertsResponse { next_page, alerts };
|
|
|
|
Ok(res)
|
|
}
|
|
}
|
|
|
|
impl Resolve<ReadArgs> for GetAlert {
|
|
async fn resolve(
|
|
self,
|
|
_: &ReadArgs,
|
|
) -> serror::Result<GetAlertResponse> {
|
|
Ok(
|
|
find_one_by_id(&db_client().alerts, &self.id)
|
|
.await
|
|
.context("failed to query db for alert")?
|
|
.context("no alert found with given id")?,
|
|
)
|
|
}
|
|
}
|