feat: fetch workspace member via uuid

This commit is contained in:
khorshuheng 2025-02-14 16:52:49 +08:00
parent 603faf3631
commit 672118355e
4 changed files with 113 additions and 0 deletions

View file

@ -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"
}

View file

@ -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<AFWorkspaceMemberRow, AppError> {
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,

View file

@ -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<AppState>,
path: web::Path<(Uuid, Uuid)>,
) -> Result<JsonAppResponse<AFWorkspaceMember>> {
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,

View file

@ -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<AFWorkspaceMemberRow, AppResponseError> {
Ok(select_workspace_member_by_uuid(pg_pool, member_uuid, workspace_id).await?)
}
pub async fn update_workspace_member(
uid: &i64,
pg_pool: &PgPool,