Skip to content

Commit d131e91

Browse files
committed
feat: api to get collab as json
1 parent 316d058 commit d131e91

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

libs/shared-entity/src/dto/workspace_dto.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ pub struct EmbeddedCollabQuery {
134134
pub object_id: String,
135135
}
136136

137+
#[derive(Debug, Clone, Serialize)]
138+
pub struct CollabJsonResponse {
139+
pub collab: serde_json::Value,
140+
}
141+
137142
#[derive(Debug, Clone, Serialize, Deserialize)]
138143
pub struct CollabResponse {
139144
#[serde(flatten)]

src/api/workspace.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::biz;
55
use crate::biz::collab::ops::{
66
get_user_favorite_folder_views, get_user_recent_folder_views, get_user_trash_folder_views,
77
};
8+
use crate::biz::collab::utils::collab_from_doc_state;
89
use crate::biz::user::user_verify::verify_token;
910
use crate::biz::workspace;
1011
use crate::biz::workspace::ops::{
@@ -140,6 +141,10 @@ pub fn workspace_scope() -> Scope {
140141
web::resource("/v1/{workspace_id}/collab/{object_id}")
141142
.route(web::get().to(v1_get_collab_handler)),
142143
)
144+
.service(
145+
web::resource("/v1/{workspace_id}/collab/{object_id}/json")
146+
.route(web::get().to(get_collab_json_handler)),
147+
)
143148
.service(
144149
web::resource("/v1/{workspace_id}/collab/{object_id}/full-sync")
145150
.route(web::post().to(collab_full_sync_handler)),
@@ -1048,6 +1053,43 @@ async fn v1_get_collab_handler(
10481053
Ok(Json(AppResponse::Ok().with_data(resp)))
10491054
}
10501055

1056+
async fn get_collab_json_handler(
1057+
user_uuid: UserUuid,
1058+
path: web::Path<(String, String)>,
1059+
query: web::Query<CollabTypeParam>,
1060+
state: Data<AppState>,
1061+
) -> Result<Json<AppResponse<CollabJsonResponse>>> {
1062+
let (workspace_id, object_id) = path.into_inner();
1063+
let collab_type = query.into_inner().collab_type;
1064+
let uid = state
1065+
.user_cache
1066+
.get_user_uid(&user_uuid)
1067+
.await
1068+
.map_err(AppResponseError::from)?;
1069+
1070+
let param = QueryCollabParams {
1071+
workspace_id,
1072+
inner: QueryCollab {
1073+
object_id: object_id.clone(),
1074+
collab_type,
1075+
},
1076+
};
1077+
1078+
let doc_state = state
1079+
.collab_access_control_storage
1080+
.get_encode_collab(GetCollabOrigin::User { uid }, param, true)
1081+
.await
1082+
.map_err(AppResponseError::from)?
1083+
.doc_state;
1084+
let collab = collab_from_doc_state(doc_state.to_vec(), &object_id)?;
1085+
1086+
let resp = CollabJsonResponse {
1087+
collab: collab.to_json_value(),
1088+
};
1089+
1090+
Ok(Json(AppResponse::Ok().with_data(resp)))
1091+
}
1092+
10511093
#[instrument(level = "debug", skip_all)]
10521094
async fn post_web_update_handler(
10531095
user_uuid: UserUuid,

0 commit comments

Comments
 (0)