update tags api

This commit is contained in:
kv
2024-01-16 02:43:41 -08:00
parent 0857cbfa92
commit dbf589da91
4 changed files with 121 additions and 18 deletions

View File

@@ -99,6 +99,7 @@ enum WriteRequest {
CreateTag(CreateTag),
DeleteTag(DeleteTag),
UpdateTag(UpdateTag),
UpdateTagsOnResource(UpdateTagsOnResource),
}
pub fn router() -> Router {

View File

@@ -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<CreateTag, RequestUser> for State {
@@ -77,3 +87,87 @@ impl Resolve<DeleteTag, RequestUser> for State {
Ok(tag)
}
}
#[async_trait]
impl Resolve<UpdateTagsOnResource, RequestUser> for State {
async fn resolve(
&self,
UpdateTagsOnResource { target, tags }: UpdateTagsOnResource,
user: RequestUser,
) -> anyhow::Result<UpdateTagsOnResourceResponse> {
match target {
ResourceTarget::System(_) => return Err(anyhow!("")),
ResourceTarget::Build(id) => {
<State as StateResource<Build>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Build>>::update_tags_on_resource(
self, &id, tags,
)
.await?;
}
ResourceTarget::Builder(id) => {
<State as StateResource<Builder>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Builder>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
ResourceTarget::Deployment(id) => {
<State as StateResource<Deployment>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Deployment>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
ResourceTarget::Server(id) => {
<State as StateResource<Server>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Server>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
ResourceTarget::Repo(id) => {
<State as StateResource<Repo>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Repo>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
ResourceTarget::Alerter(id) => {
<State as StateResource<Alerter>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Alerter>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
ResourceTarget::Procedure(id) => {
<State as StateResource<Procedure>>::get_resource_check_permissions(
self, &id, &user, PermissionLevel::Update
)
.await?;
<State as StateResource<Procedure>>::update_tags_on_resource(
self, &id, tags,
)
.await?
}
};
Ok(UpdateTagsOnResourceResponse {})
}
}

View File

@@ -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<String>,
) -> anyhow::Result<()> {
update_one_by_id(
self.coll(),
id,
doc! { "$set": { "tags": tags } },
None,
)
.await?;
Ok(())
}
}
#[async_trait]

View File

@@ -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<String>, // custom tag ids
}
//
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorWriteRequest)]
#[response(())]
pub struct RemoveTags {
pub target: ResourceTarget,
pub tags: Vec<String>, // custom tag ids
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct UpdateTagsOnResourceResponse {}
//