fix: incorrect requester avatar url and workspace member count (#847)
This commit is contained in:
parent
47a1aae75c
commit
757d0e5380
|
|
@ -1,52 +0,0 @@
|
||||||
{
|
|
||||||
"db_name": "PostgreSQL",
|
|
||||||
"query": "\n SELECT\n request_id,\n view_id,\n (\n workspace_id,\n af_workspace.database_storage_id,\n af_workspace.owner_uid,\n owner_profile.name,\n af_workspace.created_at,\n af_workspace.workspace_type,\n af_workspace.deleted_at,\n af_workspace.workspace_name,\n af_workspace.icon\n ) AS \"workspace!: AFWorkspaceRow\",\n (\n af_user.uuid,\n af_user.name,\n af_user.email,\n af_user.metadata ->> 'avatar'\n ) AS \"requester!: AFAccessRequesterColumn\",\n status AS \"status: AFAccessRequestStatusColumn\",\n af_access_request.created_at AS created_at\n FROM af_access_request\n JOIN af_user USING (uid)\n JOIN af_workspace USING (workspace_id)\n JOIN af_user AS owner_profile ON af_workspace.owner_uid = owner_profile.uid\n WHERE request_id = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "request_id",
|
|
||||||
"type_info": "Uuid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 1,
|
|
||||||
"name": "view_id",
|
|
||||||
"type_info": "Uuid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 2,
|
|
||||||
"name": "workspace!: AFWorkspaceRow",
|
|
||||||
"type_info": "Record"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 3,
|
|
||||||
"name": "requester!: AFAccessRequesterColumn",
|
|
||||||
"type_info": "Record"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 4,
|
|
||||||
"name": "status: AFAccessRequestStatusColumn",
|
|
||||||
"type_info": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 5,
|
|
||||||
"name": "created_at",
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Uuid"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"hash": "222344980faea1b159256d6d5128f28e239a30fab8891497a28d6b079141f7bf"
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
"db_name": "PostgreSQL",
|
||||||
|
"query": "\n WITH request_id_workspace_member_count AS (\n SELECT\n request_id,\n COUNT(*) AS member_count\n FROM af_access_request\n JOIN af_workspace_member USING (workspace_id)\n WHERE request_id = $1\n GROUP BY request_id\n )\n SELECT\n request_id,\n view_id,\n (\n workspace_id,\n af_workspace.database_storage_id,\n af_workspace.owner_uid,\n owner_profile.name,\n af_workspace.created_at,\n af_workspace.workspace_type,\n af_workspace.deleted_at,\n af_workspace.workspace_name,\n af_workspace.icon,\n request_id_workspace_member_count.member_count\n ) AS \"workspace!: AFWorkspaceWithMemberCountRow\",\n (\n af_user.uuid,\n af_user.name,\n af_user.email,\n af_user.metadata ->> 'icon_url'\n ) AS \"requester!: AFAccessRequesterColumn\",\n status AS \"status: AFAccessRequestStatusColumn\",\n af_access_request.created_at AS created_at\n FROM af_access_request\n JOIN af_user USING (uid)\n JOIN af_workspace USING (workspace_id)\n JOIN af_user AS owner_profile ON af_workspace.owner_uid = owner_profile.uid\n JOIN request_id_workspace_member_count USING (request_id)\n WHERE request_id = $1\n ",
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"ordinal": 0,
|
||||||
|
"name": "request_id",
|
||||||
|
"type_info": "Uuid"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 1,
|
||||||
|
"name": "view_id",
|
||||||
|
"type_info": "Uuid"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 2,
|
||||||
|
"name": "workspace!: AFWorkspaceWithMemberCountRow",
|
||||||
|
"type_info": "Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 3,
|
||||||
|
"name": "requester!: AFAccessRequesterColumn",
|
||||||
|
"type_info": "Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 4,
|
||||||
|
"name": "status: AFAccessRequestStatusColumn",
|
||||||
|
"type_info": "Int4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 5,
|
||||||
|
"name": "created_at",
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Uuid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hash": "343cdf36e68c8333ecc6b778789d8de543c15f2aa0318dac2d10c5f1ef0f0232"
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::pg_row::{
|
use crate::pg_row::{
|
||||||
AFAccessRequestStatusColumn, AFAccessRequestWithViewIdColumn, AFAccessRequesterColumn,
|
AFAccessRequestStatusColumn, AFAccessRequestWithViewIdColumn, AFAccessRequesterColumn,
|
||||||
AFWorkspaceRow,
|
AFWorkspaceWithMemberCountRow,
|
||||||
};
|
};
|
||||||
use app_error::AppError;
|
use app_error::AppError;
|
||||||
use database_entity::dto::AccessRequestWithViewId;
|
use database_entity::dto::AccessRequestWithViewId;
|
||||||
|
|
@ -54,6 +54,15 @@ pub async fn select_access_request_by_request_id<'a, E: Executor<'a, Database =
|
||||||
let access_request = sqlx::query_as!(
|
let access_request = sqlx::query_as!(
|
||||||
AFAccessRequestWithViewIdColumn,
|
AFAccessRequestWithViewIdColumn,
|
||||||
r#"
|
r#"
|
||||||
|
WITH request_id_workspace_member_count AS (
|
||||||
|
SELECT
|
||||||
|
request_id,
|
||||||
|
COUNT(*) AS member_count
|
||||||
|
FROM af_access_request
|
||||||
|
JOIN af_workspace_member USING (workspace_id)
|
||||||
|
WHERE request_id = $1
|
||||||
|
GROUP BY request_id
|
||||||
|
)
|
||||||
SELECT
|
SELECT
|
||||||
request_id,
|
request_id,
|
||||||
view_id,
|
view_id,
|
||||||
|
|
@ -66,13 +75,14 @@ pub async fn select_access_request_by_request_id<'a, E: Executor<'a, Database =
|
||||||
af_workspace.workspace_type,
|
af_workspace.workspace_type,
|
||||||
af_workspace.deleted_at,
|
af_workspace.deleted_at,
|
||||||
af_workspace.workspace_name,
|
af_workspace.workspace_name,
|
||||||
af_workspace.icon
|
af_workspace.icon,
|
||||||
) AS "workspace!: AFWorkspaceRow",
|
request_id_workspace_member_count.member_count
|
||||||
|
) AS "workspace!: AFWorkspaceWithMemberCountRow",
|
||||||
(
|
(
|
||||||
af_user.uuid,
|
af_user.uuid,
|
||||||
af_user.name,
|
af_user.name,
|
||||||
af_user.email,
|
af_user.email,
|
||||||
af_user.metadata ->> 'avatar'
|
af_user.metadata ->> 'icon_url'
|
||||||
) AS "requester!: AFAccessRequesterColumn",
|
) AS "requester!: AFAccessRequesterColumn",
|
||||||
status AS "status: AFAccessRequestStatusColumn",
|
status AS "status: AFAccessRequestStatusColumn",
|
||||||
af_access_request.created_at AS created_at
|
af_access_request.created_at AS created_at
|
||||||
|
|
@ -80,6 +90,7 @@ pub async fn select_access_request_by_request_id<'a, E: Executor<'a, Database =
|
||||||
JOIN af_user USING (uid)
|
JOIN af_user USING (uid)
|
||||||
JOIN af_workspace USING (workspace_id)
|
JOIN af_workspace USING (workspace_id)
|
||||||
JOIN af_user AS owner_profile ON af_workspace.owner_uid = owner_profile.uid
|
JOIN af_user AS owner_profile ON af_workspace.owner_uid = owner_profile.uid
|
||||||
|
JOIN request_id_workspace_member_count USING (request_id)
|
||||||
WHERE request_id = $1
|
WHERE request_id = $1
|
||||||
"#,
|
"#,
|
||||||
request_id,
|
request_id,
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,49 @@ impl TryFrom<AFWorkspaceRow> for AFWorkspace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, FromRow, Serialize, Deserialize, sqlx::Type)]
|
||||||
|
pub struct AFWorkspaceWithMemberCountRow {
|
||||||
|
pub workspace_id: Uuid,
|
||||||
|
pub database_storage_id: Option<Uuid>,
|
||||||
|
pub owner_uid: Option<i64>,
|
||||||
|
pub owner_name: Option<String>,
|
||||||
|
pub created_at: Option<DateTime<Utc>>,
|
||||||
|
pub workspace_type: i32,
|
||||||
|
pub deleted_at: Option<DateTime<Utc>>,
|
||||||
|
pub workspace_name: Option<String>,
|
||||||
|
pub icon: Option<String>,
|
||||||
|
pub member_count: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<AFWorkspaceWithMemberCountRow> for AFWorkspace {
|
||||||
|
type Error = AppError;
|
||||||
|
|
||||||
|
fn try_from(value: AFWorkspaceWithMemberCountRow) -> Result<Self, Self::Error> {
|
||||||
|
let owner_uid = value
|
||||||
|
.owner_uid
|
||||||
|
.ok_or(AppError::Internal(anyhow!("Unexpected empty owner_uid")))?;
|
||||||
|
let database_storage_id = value
|
||||||
|
.database_storage_id
|
||||||
|
.ok_or(AppError::Internal(anyhow!("Unexpected empty workspace_id")))?;
|
||||||
|
|
||||||
|
let workspace_name = value.workspace_name.unwrap_or_default();
|
||||||
|
let created_at = value.created_at.unwrap_or_else(Utc::now);
|
||||||
|
let icon = value.icon.unwrap_or_default();
|
||||||
|
|
||||||
|
Ok(Self {
|
||||||
|
workspace_id: value.workspace_id,
|
||||||
|
database_storage_id,
|
||||||
|
owner_uid,
|
||||||
|
owner_name: value.owner_name.unwrap_or_default(),
|
||||||
|
workspace_type: value.workspace_type,
|
||||||
|
workspace_name,
|
||||||
|
created_at,
|
||||||
|
icon,
|
||||||
|
member_count: Some(value.member_count),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Represent the row of the af_user table
|
/// Represent the row of the af_user table
|
||||||
#[derive(Debug, FromRow, Deserialize, Serialize, Clone)]
|
#[derive(Debug, FromRow, Deserialize, Serialize, Clone)]
|
||||||
pub struct AFUserRow {
|
pub struct AFUserRow {
|
||||||
|
|
@ -563,7 +606,7 @@ impl From<AFAccessRequestMinimalColumn> for AccessRequestMinimal {
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct AFAccessRequestWithViewIdColumn {
|
pub struct AFAccessRequestWithViewIdColumn {
|
||||||
pub request_id: Uuid,
|
pub request_id: Uuid,
|
||||||
pub workspace: AFWorkspaceRow,
|
pub workspace: AFWorkspaceWithMemberCountRow,
|
||||||
pub requester: AccessRequesterInfo,
|
pub requester: AccessRequesterInfo,
|
||||||
pub view_id: Uuid,
|
pub view_id: Uuid,
|
||||||
pub status: AFAccessRequestStatusColumn,
|
pub status: AFAccessRequestStatusColumn,
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,10 @@ async fn access_request_test() {
|
||||||
access_request_to_be_approved.workspace.workspace_id,
|
access_request_to_be_approved.workspace.workspace_id,
|
||||||
workspace_id
|
workspace_id
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
access_request_to_be_approved.workspace.member_count,
|
||||||
|
Some(1)
|
||||||
|
);
|
||||||
owner_client
|
owner_client
|
||||||
.approve_access_request(access_request_id)
|
.approve_access_request(access_request_id)
|
||||||
.await
|
.await
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue