diff --git a/bin/core/src/api/write/mod.rs b/bin/core/src/api/write/mod.rs index 949c743b2..52b07a062 100644 --- a/bin/core/src/api/write/mod.rs +++ b/bin/core/src/api/write/mod.rs @@ -99,6 +99,7 @@ enum WriteRequest { CreateTag(CreateTag), DeleteTag(DeleteTag), UpdateTag(UpdateTag), + UpdateTagsOnResource(UpdateTagsOnResource), } pub fn router() -> Router { diff --git a/bin/core/src/api/write/tag.rs b/bin/core/src/api/write/tag.rs index bb98e1ec8..c8b565c91 100644 --- a/bin/core/src/api/write/tag.rs +++ b/bin/core/src/api/write/tag.rs @@ -1,8 +1,16 @@ -use anyhow::Context; +use anyhow::{anyhow, Context}; use async_trait::async_trait; use monitor_client::{ - api::write::{CreateTag, DeleteTag, UpdateTag}, - entities::tag::CustomTag, + api::write::{ + CreateTag, DeleteTag, UpdateTag, UpdateTagsOnResource, + UpdateTagsOnResourceResponse, + }, + entities::{ + alerter::Alerter, build::Build, builder::Builder, + deployment::Deployment, procedure::Procedure, repo::Repo, + server::Server, tag::CustomTag, update::ResourceTarget, + PermissionLevel, + }, }; use mungos::{ by_id::{delete_one_by_id, update_one_by_id}, @@ -10,7 +18,9 @@ use mungos::{ }; use resolver_api::Resolve; -use crate::{auth::RequestUser, state::State}; +use crate::{ + auth::RequestUser, helpers::resource::StateResource, state::State, +}; #[async_trait] impl Resolve for State { @@ -77,3 +87,87 @@ impl Resolve for State { Ok(tag) } } + +#[async_trait] +impl Resolve for State { + async fn resolve( + &self, + UpdateTagsOnResource { target, tags }: UpdateTagsOnResource, + user: RequestUser, + ) -> anyhow::Result { + match target { + ResourceTarget::System(_) => return Err(anyhow!("")), + ResourceTarget::Build(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await?; + } + ResourceTarget::Builder(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + ResourceTarget::Deployment(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + ResourceTarget::Server(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + ResourceTarget::Repo(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + ResourceTarget::Alerter(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + ResourceTarget::Procedure(id) => { + >::get_resource_check_permissions( + self, &id, &user, PermissionLevel::Update + ) + .await?; + >::update_tags_on_resource( + self, &id, tags, + ) + .await? + } + }; + Ok(UpdateTagsOnResourceResponse {}) + } +} diff --git a/bin/core/src/helpers/resource.rs b/bin/core/src/helpers/resource.rs index 5af2ae686..a5ea04f84 100644 --- a/bin/core/src/helpers/resource.rs +++ b/bin/core/src/helpers/resource.rs @@ -28,7 +28,7 @@ use monitor_client::{ }; use mungos::{ aggregate::aggregate_collect, - by_id::find_one_by_id, + by_id::{find_one_by_id, update_one_by_id}, find::find_collect, mongodb::{ bson::{doc, oid::ObjectId, Document}, @@ -175,6 +175,21 @@ pub trait StateResource< .await?; Ok(()) } + + async fn update_tags_on_resource( + &self, + id: &str, + tags: Vec, + ) -> anyhow::Result<()> { + update_one_by_id( + self.coll(), + id, + doc! { "$set": { "tags": tags } }, + None, + ) + .await?; + Ok(()) + } } #[async_trait] diff --git a/client/rs/src/api/write/tags.rs b/client/rs/src/api/write/tags.rs index f9b03ff05..46abad614 100644 --- a/client/rs/src/api/write/tags.rs +++ b/client/rs/src/api/write/tags.rs @@ -60,21 +60,14 @@ pub struct UpdateTag { Serialize, Deserialize, Debug, Clone, Request, EmptyTraits, )] #[empty_traits(MonitorWriteRequest)] -#[response(())] -pub struct AddTags { +#[response(UpdateTagsOnResourceResponse)] +pub struct UpdateTagsOnResource { pub target: ResourceTarget, pub tags: Vec, // custom tag ids } -// - #[typeshare] -#[derive( - Serialize, Deserialize, Debug, Clone, Request, EmptyTraits, -)] -#[empty_traits(MonitorWriteRequest)] -#[response(())] -pub struct RemoveTags { - pub target: ResourceTarget, - pub tags: Vec, // custom tag ids -} +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateTagsOnResourceResponse {} + +//