GetUpdate

This commit is contained in:
mbecker20
2023-08-03 02:09:34 -04:00
parent 73dc18fb78
commit 6d20457f0e
5 changed files with 937 additions and 831 deletions

View File

@@ -94,6 +94,7 @@ enum ReadRequest {
ListTags(ListTags),
// ==== UPDATE ====
GetUpdate(GetUpdate),
ListUpdates(ListUpdates),
// ==== SERVER STATS ====

View File

@@ -1,13 +1,19 @@
use std::collections::HashMap;
use anyhow::Context;
use anyhow::{anyhow, Context};
use async_trait::async_trait;
use monitor_types::{
entities::{
alerter::Alerter, build::Build, builder::Builder, deployment::Deployment, repo::Repo,
alerter::Alerter,
build::Build,
builder::Builder,
deployment::Deployment,
repo::Repo,
server::Server,
update::{ResourceTarget, Update},
PermissionLevel,
},
requests::read::{ListUpdates, ListUpdatesResponse, UpdateListItem},
requests::read::{GetUpdate, ListUpdates, ListUpdatesResponse, UpdateListItem},
};
use mungos::mongodb::{bson::doc, options::FindOptions};
use resolver_api::Resolve;
@@ -103,3 +109,59 @@ impl Resolve<ListUpdates, RequestUser> for State {
Ok(ListUpdatesResponse { updates, next_page })
}
}
#[async_trait]
impl Resolve<GetUpdate, RequestUser> for State {
async fn resolve(
&self,
GetUpdate { id }: GetUpdate,
user: RequestUser,
) -> anyhow::Result<Update> {
let update = self
.db
.updates
.find_one_by_id(&id)
.await
.context("failed to query to db")?
.context("no update exists with given id")?;
if user.is_admin {
return Ok(update);
}
match &update.target {
ResourceTarget::System => {
return Err(anyhow!("user must be admin to view system updates"))
}
ResourceTarget::Server(id) => {
let _: Server = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
ResourceTarget::Deployment(id) => {
let _: Deployment = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
ResourceTarget::Build(id) => {
let _: Build = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
ResourceTarget::Repo(id) => {
let _: Repo = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
ResourceTarget::Builder(id) => {
let _: Builder = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
ResourceTarget::Alerter(id) => {
let _: Alerter = self
.get_resource_check_permissions(id, &user, PermissionLevel::Read)
.await?;
}
}
Ok(update)
}
}

View File

@@ -69,6 +69,7 @@ export type ReadResponses = {
ListTags: Types.CustomTag[];
// ==== UPDATE ====
GetUpdate: Types.Update;
ListUpdates: Types.ListUpdatesResponse;
// ==== SERVER STATS ====

File diff suppressed because it is too large Load Diff

View File

@@ -4,12 +4,19 @@ use typeshare::typeshare;
use crate::{
entities::{
update::{ResourceTarget, UpdateStatus},
update::{ResourceTarget, UpdateStatus, Update},
Operation, Version,
},
MongoDocument, I64,
};
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(Update)]
pub struct GetUpdate {
pub id: String
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(ListUpdatesResponse)]