diff --git a/backend/supports/iam/src/basic/dto/iam_app_dto.rs b/backend/supports/iam/src/basic/dto/iam_app_dto.rs index e663b2ec2..859a512eb 100644 --- a/backend/supports/iam/src/basic/dto/iam_app_dto.rs +++ b/backend/supports/iam/src/basic/dto/iam_app_dto.rs @@ -145,6 +145,16 @@ pub struct IamAppDetailResp { pub kind: IamAppKind, } +/// Batch modify app set category request +/// +/// 批量修改应用集合分类请求 +#[derive(poem_openapi::Object, Serialize, Deserialize, Debug)] +pub struct IamAppBatchModifySetCateReq { + pub app_ids: Vec, + #[oai(validator(min_length = "2", max_length = "255"))] + pub set_cate_id: String, +} + /// Transfer ownership request for app /// /// 应用转移所有权请求 diff --git a/backend/supports/iam/src/basic/serv/iam_app_serv.rs b/backend/supports/iam/src/basic/serv/iam_app_serv.rs index c7ec5fd7d..0bcc6931e 100644 --- a/backend/supports/iam/src/basic/serv/iam_app_serv.rs +++ b/backend/supports/iam/src/basic/serv/iam_app_serv.rs @@ -349,6 +349,30 @@ impl IamAppServ { Ok(()) } + pub async fn batch_modify_set_cate(app_ids: &[String], set_cate_id: &str, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> { + let tenant_ctx = IamCertServ::use_sys_or_tenant_ctx_unsafe(ctx.clone())?; + let apps_set_id = IamSetServ::get_default_set_id_by_ctx(&IamSetKind::Apps, funs, &tenant_ctx).await?; + for app_id in app_ids { + let set_items = IamSetServ::find_set_items(Some(apps_set_id.clone()), None, Some(app_id.to_owned()), None, true, Some(true), funs, &tenant_ctx).await?; + let sort = set_items.first().map(|set_item| set_item.sort).unwrap_or(0); + for set_item in set_items { + IamSetServ::delete_set_item(&set_item.id, funs, &tenant_ctx).await?; + } + IamSetServ::add_set_item( + &IamSetItemAddReq { + set_id: apps_set_id.clone(), + set_cate_id: set_cate_id.to_string(), + sort, + rel_rbum_item_id: app_id.to_string(), + }, + funs, + &tenant_ctx, + ) + .await?; + } + Ok(()) + } + pub async fn find_rel_account(app_id: &str, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult> { IamRelServ::find_to_simple_rels(&IamRelKind::IamAccountApp, app_id, None, None, funs, ctx).await } diff --git a/backend/supports/iam/src/console_interface/api/iam_ci_app_api.rs b/backend/supports/iam/src/console_interface/api/iam_ci_app_api.rs index 8477c2b35..54fdef505 100644 --- a/backend/supports/iam/src/console_interface/api/iam_ci_app_api.rs +++ b/backend/supports/iam/src/console_interface/api/iam_ci_app_api.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use crate::basic::dto::iam_app_dto::{IamAppAggAddReq, IamAppAggModifyReq}; +use crate::basic::dto::iam_app_dto::{IamAppAggAddReq, IamAppAggModifyReq, IamAppBatchModifySetCateReq}; use crate::basic::dto::iam_filer_dto::IamAppFilterReq; use crate::basic::serv::iam_app_serv::IamAppServ; @@ -268,6 +268,20 @@ impl IamCiAppApi { TardisResp::ok(result) } + /// Batch Modify App Set Category + /// 批量修改应用集合分类 + #[oai(path = "/set_cate/batch", method = "put")] + async fn batch_modify_set_cate(&self, modify_req: Json, mut ctx: TardisContextExtractor, request: &Request) -> TardisApiResult { + let mut funs = iam_constants::get_tardis_inst(); + check_without_owner_and_unsafe_fill_ctx(request, &funs, &mut ctx.0)?; + try_set_real_ip_from_req_to_ctx(request, &ctx.0).await?; + funs.begin().await?; + IamAppServ::batch_modify_set_cate(&modify_req.0.app_ids, &modify_req.0.set_cate_id, &funs, &ctx.0).await?; + funs.commit().await?; + ctx.0.execute_task().await?; + TardisResp::ok(Void {}) + } + /// Add App Rel Account /// 添加应用关联账号 #[oai(path = "/:id/account/:account_id", method = "put")] diff --git a/backend/supports/iam/tests/test_iam_scenes_passport.rs b/backend/supports/iam/tests/test_iam_scenes_passport.rs index 4d984df84..ddfe63b09 100644 --- a/backend/supports/iam/tests/test_iam_scenes_passport.rs +++ b/backend/supports/iam/tests/test_iam_scenes_passport.rs @@ -784,6 +784,7 @@ pub async fn login_by_oauth2(client: &mut BIOSWebTestClient) -> TardisResult<()> supplier: TrimString(IamCertOAuth2Supplier::WechatMp.to_string()), ak: TrimString(app_id.to_string()), sk: TrimString(secret.to_string()), + base_url: None, }]), cert_conf_by_ldap: None, },