diff --git a/.sqlx/query-ee059aca8fba787658ad095f44bd0075aef1abc6eb0f34d11905765da9fd38e5.json b/.sqlx/query-ee059aca8fba787658ad095f44bd0075aef1abc6eb0f34d11905765da9fd38e5.json new file mode 100644 index 000000000..c1cca4689 --- /dev/null +++ b/.sqlx/query-ee059aca8fba787658ad095f44bd0075aef1abc6eb0f34d11905765da9fd38e5.json @@ -0,0 +1,41 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT af_user.uid, af_user.name, af_user.email, af_workspace_member.role_id AS role\n FROM public.af_workspace_member\n JOIN public.af_user ON af_workspace_member.uid = af_user.uid\n WHERE af_workspace_member.workspace_id = $1\n AND af_user.uuid = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "uid", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "role", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Uuid" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + }, + "hash": "ee059aca8fba787658ad095f44bd0075aef1abc6eb0f34d11905765da9fd38e5" +} diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index fce790be1..deb02def6 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -555,6 +555,29 @@ pub async fn select_workspace_member<'a, E: Executor<'a, Database = Postgres>>( Ok(member) } +#[inline] +pub async fn select_workspace_member_by_uuid<'a, E: Executor<'a, Database = Postgres>>( + executor: E, + uuid: Uuid, + workspace_id: Uuid, +) -> Result { + let member = sqlx::query_as!( + AFWorkspaceMemberRow, + r#" + SELECT af_user.uid, af_user.name, af_user.email, af_workspace_member.role_id AS role + FROM public.af_workspace_member + JOIN public.af_user ON af_workspace_member.uid = af_user.uid + WHERE af_workspace_member.workspace_id = $1 + AND af_user.uuid = $2 + "#, + workspace_id, + uuid, + ) + .fetch_one(executor) + .await?; + Ok(member) +} + #[inline] pub async fn select_user_profile<'a, E: Executor<'a, Database = Postgres>>( executor: E, diff --git a/src/api/workspace.rs b/src/api/workspace.rs index 82c59465e..e9f12d325 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -117,10 +117,15 @@ pub fn workspace_scope() -> Scope { .route(web::put().to(update_workspace_member_handler)) .route(web::delete().to(remove_workspace_member_handler)), ) + // Deprecated since v0.9.24 .service( web::resource("/{workspace_id}/member/user/{user_id}") .route(web::get().to(get_workspace_member_handler)), ) + .service( + web::resource("v1/{workspace_id}/member/user/{user_id}") + .route(web::get().to(get_workspace_member_v1_handler)), + ) .service( web::resource("/{workspace_id}/collab/{object_id}") .app_data( @@ -615,6 +620,42 @@ async fn get_workspace_member_handler( Ok(AppResponse::Ok().with_data(member).into()) } +// This use user uuid as opposed to uid +#[instrument(skip_all, err)] +async fn get_workspace_member_v1_handler( + user_uuid: UserUuid, + state: Data, + path: web::Path<(Uuid, Uuid)>, +) -> Result> { + let (workspace_id, member_uuid) = path.into_inner(); + let uid = state.user_cache.get_user_uid(&user_uuid).await?; + // Guest users can not get workspace members + state + .workspace_access_control + .enforce_role(&uid, &workspace_id.to_string(), AFRole::Member) + .await?; + let member_row = + workspace::ops::get_workspace_member_by_uuid(member_uuid, &state.pg_pool, workspace_id) + .await + .map_err(|_| { + AppResponseError::new( + ErrorCode::MemberNotFound, + format!( + "requested member uid {} is not present in workspace {}", + member_uuid, workspace_id + ), + ) + })?; + let member = AFWorkspaceMember { + name: member_row.name, + email: member_row.email, + role: member_row.role, + avatar_url: None, + }; + + Ok(AppResponse::Ok().with_data(member).into()) +} + #[instrument(level = "debug", skip_all, err)] async fn open_workspace_handler( user_uuid: UserUuid, diff --git a/src/biz/workspace/ops.rs b/src/biz/workspace/ops.rs index 0d9dade27..d69ee8056 100644 --- a/src/biz/workspace/ops.rs +++ b/src/biz/workspace/ops.rs @@ -604,6 +604,14 @@ pub async fn get_workspace_member( Ok(select_workspace_member(pg_pool, uid, workspace_id).await?) } +pub async fn get_workspace_member_by_uuid( + member_uuid: Uuid, + pg_pool: &PgPool, + workspace_id: Uuid, +) -> Result { + Ok(select_workspace_member_by_uuid(pg_pool, member_uuid, workspace_id).await?) +} + pub async fn update_workspace_member( uid: &i64, pg_pool: &PgPool,