From d131e9119021c3250b09091d3d870edab03d021f Mon Sep 17 00:00:00 2001 From: khorshuheng Date: Wed, 19 Feb 2025 14:48:31 +0800 Subject: [PATCH] feat: api to get collab as json --- libs/shared-entity/src/dto/workspace_dto.rs | 5 +++ src/api/workspace.rs | 42 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/libs/shared-entity/src/dto/workspace_dto.rs b/libs/shared-entity/src/dto/workspace_dto.rs index be4ace517..892461bf1 100644 --- a/libs/shared-entity/src/dto/workspace_dto.rs +++ b/libs/shared-entity/src/dto/workspace_dto.rs @@ -134,6 +134,11 @@ pub struct EmbeddedCollabQuery { pub object_id: String, } +#[derive(Debug, Clone, Serialize)] +pub struct CollabJsonResponse { + pub collab: serde_json::Value, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CollabResponse { #[serde(flatten)] diff --git a/src/api/workspace.rs b/src/api/workspace.rs index e9f12d325..ab7bb8024 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -5,6 +5,7 @@ use crate::biz; use crate::biz::collab::ops::{ get_user_favorite_folder_views, get_user_recent_folder_views, get_user_trash_folder_views, }; +use crate::biz::collab::utils::collab_from_doc_state; use crate::biz::user::user_verify::verify_token; use crate::biz::workspace; use crate::biz::workspace::ops::{ @@ -140,6 +141,10 @@ pub fn workspace_scope() -> Scope { web::resource("/v1/{workspace_id}/collab/{object_id}") .route(web::get().to(v1_get_collab_handler)), ) + .service( + web::resource("/v1/{workspace_id}/collab/{object_id}/json") + .route(web::get().to(get_collab_json_handler)), + ) .service( web::resource("/v1/{workspace_id}/collab/{object_id}/full-sync") .route(web::post().to(collab_full_sync_handler)), @@ -1048,6 +1053,43 @@ async fn v1_get_collab_handler( Ok(Json(AppResponse::Ok().with_data(resp))) } +async fn get_collab_json_handler( + user_uuid: UserUuid, + path: web::Path<(String, String)>, + query: web::Query, + state: Data, +) -> Result>> { + let (workspace_id, object_id) = path.into_inner(); + let collab_type = query.into_inner().collab_type; + let uid = state + .user_cache + .get_user_uid(&user_uuid) + .await + .map_err(AppResponseError::from)?; + + let param = QueryCollabParams { + workspace_id, + inner: QueryCollab { + object_id: object_id.clone(), + collab_type, + }, + }; + + let doc_state = state + .collab_access_control_storage + .get_encode_collab(GetCollabOrigin::User { uid }, param, true) + .await + .map_err(AppResponseError::from)? + .doc_state; + let collab = collab_from_doc_state(doc_state.to_vec(), &object_id)?; + + let resp = CollabJsonResponse { + collab: collab.to_json_value(), + }; + + Ok(Json(AppResponse::Ok().with_data(resp))) +} + #[instrument(level = "debug", skip_all)] async fn post_web_update_handler( user_uuid: UserUuid,