feat: additional fields for workspace invitation
This commit is contained in:
parent
9422110eaf
commit
11cdc862f2
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n SELECT\n id AS invite_id,\n workspace_id,\n (SELECT workspace_name FROM public.af_workspace WHERE workspace_id = af_workspace_invitation.workspace_id),\n (SELECT email FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_email,\n (SELECT name FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_name,\n status,\n updated_at\n FROM\n public.af_workspace_invitation\n WHERE af_workspace_invitation.invitee_email = (SELECT email FROM public.af_user WHERE uuid = $1)\n AND ($2::SMALLINT IS NULL OR status = $2)\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "invite_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "workspace_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "workspace_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "inviter_email",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "inviter_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "status",
|
||||
"type_info": "Int2"
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "updated_at",
|
||||
"type_info": "Timestamptz"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Uuid",
|
||||
"Int2"
|
||||
]
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "2c1152b8867bebcb63b637820eb44ac932ee88c6326ecaf9b4b4c7f690eff41c"
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n SELECT\n i.id AS invite_id,\n i.workspace_id,\n w.workspace_name,\n u_inviter.email AS inviter_email,\n u_inviter.name AS inviter_name,\n i.status,\n i.updated_at,\n u_inviter.metadata->>'icon_url' AS inviter_icon,\n w.icon AS workspace_icon,\n (SELECT COUNT(*) FROM public.af_workspace_member m WHERE m.workspace_id = i.workspace_id) AS member_count\n FROM\n public.af_workspace_invitation i\n JOIN public.af_workspace w ON i.workspace_id = w.workspace_id\n JOIN public.af_user u_inviter ON i.inviter = u_inviter.uid\n JOIN public.af_user u_invitee ON u_invitee.uuid = $1\n WHERE\n i.invitee_email = u_invitee.email\n AND i.id = $2;\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "invite_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "workspace_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "workspace_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "inviter_email",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "inviter_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "status",
|
||||
"type_info": "Int2"
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "updated_at",
|
||||
"type_info": "Timestamptz"
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"name": "inviter_icon",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"name": "workspace_icon",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"name": "member_count",
|
||||
"type_info": "Int8"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Uuid",
|
||||
"Uuid"
|
||||
]
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
null,
|
||||
false,
|
||||
null
|
||||
]
|
||||
},
|
||||
"hash": "2ee385e58e042071290226289646965553938838c83085273f68f687c976767a"
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n SELECT\n id AS invite_id,\n workspace_id,\n (SELECT workspace_name FROM public.af_workspace WHERE workspace_id = af_workspace_invitation.workspace_id),\n (SELECT email FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_email,\n (SELECT name FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_name,\n status,\n updated_at\n FROM public.af_workspace_invitation\n WHERE af_workspace_invitation.invitee_email = (SELECT email FROM public.af_user WHERE uuid = $1)\n AND id = $2\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "invite_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "workspace_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "workspace_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "inviter_email",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "inviter_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "status",
|
||||
"type_info": "Int2"
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "updated_at",
|
||||
"type_info": "Timestamptz"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Uuid",
|
||||
"Uuid"
|
||||
]
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "6dd7f6db2d364cc37b1b46c611fe111d06e327edd9f3a98a4b0636bfe8fd6319"
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n SELECT\n i.id AS invite_id,\n i.workspace_id,\n w.workspace_name,\n u_inviter.email AS inviter_email,\n u_inviter.name AS inviter_name,\n i.status,\n i.updated_at,\n u_inviter.metadata->>'icon_url' AS inviter_icon,\n w.icon AS workspace_icon,\n (SELECT COUNT(*) FROM public.af_workspace_member m WHERE m.workspace_id = i.workspace_id) AS member_count\n FROM\n public.af_workspace_invitation i\n JOIN public.af_workspace w ON i.workspace_id = w.workspace_id\n JOIN public.af_user u_inviter ON i.inviter = u_inviter.uid\n JOIN public.af_user u_invitee ON u_invitee.uuid = $1\n WHERE\n i.invitee_email = u_invitee.email\n AND ($2::SMALLINT IS NULL OR i.status = $2);\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "invite_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "workspace_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "workspace_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "inviter_email",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "inviter_name",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "status",
|
||||
"type_info": "Int2"
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "updated_at",
|
||||
"type_info": "Timestamptz"
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"name": "inviter_icon",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"name": "workspace_icon",
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"name": "member_count",
|
||||
"type_info": "Int8"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Uuid",
|
||||
"Int2"
|
||||
]
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
null,
|
||||
false,
|
||||
null
|
||||
]
|
||||
},
|
||||
"hash": "de595bd6554d8e1f58c9c4bb94ea14b5ae2fd15b3c5d2b84d5dd5a551954ecde"
|
||||
}
|
||||
|
|
@ -601,6 +601,9 @@ pub struct AFWorkspaceInvitation {
|
|||
pub inviter_name: Option<String>,
|
||||
pub status: AFWorkspaceInvitationStatus,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
pub inviter_icon: Option<String>,
|
||||
pub workspace_icon: String,
|
||||
pub member_count: Option<i64>, // use unwrap_or(0) to get the value
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
|
||||
|
|
|
|||
|
|
@ -409,22 +409,31 @@ pub async fn select_workspace_invitations_for_user(
|
|||
let res = sqlx::query_as!(
|
||||
AFWorkspaceInvitation,
|
||||
r#"
|
||||
SELECT
|
||||
id AS invite_id,
|
||||
workspace_id,
|
||||
(SELECT workspace_name FROM public.af_workspace WHERE workspace_id = af_workspace_invitation.workspace_id),
|
||||
(SELECT email FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_email,
|
||||
(SELECT name FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_name,
|
||||
status,
|
||||
updated_at
|
||||
FROM
|
||||
public.af_workspace_invitation
|
||||
WHERE af_workspace_invitation.invitee_email = (SELECT email FROM public.af_user WHERE uuid = $1)
|
||||
AND ($2::SMALLINT IS NULL OR status = $2)
|
||||
SELECT
|
||||
i.id AS invite_id,
|
||||
i.workspace_id,
|
||||
w.workspace_name,
|
||||
u_inviter.email AS inviter_email,
|
||||
u_inviter.name AS inviter_name,
|
||||
i.status,
|
||||
i.updated_at,
|
||||
u_inviter.metadata->>'icon_url' AS inviter_icon,
|
||||
w.icon AS workspace_icon,
|
||||
(SELECT COUNT(*) FROM public.af_workspace_member m WHERE m.workspace_id = i.workspace_id) AS member_count
|
||||
FROM
|
||||
public.af_workspace_invitation i
|
||||
JOIN public.af_workspace w ON i.workspace_id = w.workspace_id
|
||||
JOIN public.af_user u_inviter ON i.inviter = u_inviter.uid
|
||||
JOIN public.af_user u_invitee ON u_invitee.uuid = $1
|
||||
WHERE
|
||||
i.invitee_email = u_invitee.email
|
||||
AND ($2::SMALLINT IS NULL OR i.status = $2);
|
||||
"#,
|
||||
invitee_uuid,
|
||||
status_filter.map(|s| s as i16)
|
||||
).fetch_all(pg_pool).await?;
|
||||
)
|
||||
.fetch_all(pg_pool)
|
||||
.await?;
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
|
|
@ -437,21 +446,31 @@ pub async fn select_workspace_invitation_for_user(
|
|||
let res = sqlx::query_as!(
|
||||
AFWorkspaceInvitation,
|
||||
r#"
|
||||
SELECT
|
||||
id AS invite_id,
|
||||
workspace_id,
|
||||
(SELECT workspace_name FROM public.af_workspace WHERE workspace_id = af_workspace_invitation.workspace_id),
|
||||
(SELECT email FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_email,
|
||||
(SELECT name FROM public.af_user WHERE uid = af_workspace_invitation.inviter) AS inviter_name,
|
||||
status,
|
||||
updated_at
|
||||
FROM public.af_workspace_invitation
|
||||
WHERE af_workspace_invitation.invitee_email = (SELECT email FROM public.af_user WHERE uuid = $1)
|
||||
AND id = $2
|
||||
SELECT
|
||||
i.id AS invite_id,
|
||||
i.workspace_id,
|
||||
w.workspace_name,
|
||||
u_inviter.email AS inviter_email,
|
||||
u_inviter.name AS inviter_name,
|
||||
i.status,
|
||||
i.updated_at,
|
||||
u_inviter.metadata->>'icon_url' AS inviter_icon,
|
||||
w.icon AS workspace_icon,
|
||||
(SELECT COUNT(*) FROM public.af_workspace_member m WHERE m.workspace_id = i.workspace_id) AS member_count
|
||||
FROM
|
||||
public.af_workspace_invitation i
|
||||
JOIN public.af_workspace w ON i.workspace_id = w.workspace_id
|
||||
JOIN public.af_user u_inviter ON i.inviter = u_inviter.uid
|
||||
JOIN public.af_user u_invitee ON u_invitee.uuid = $1
|
||||
WHERE
|
||||
i.invitee_email = u_invitee.email
|
||||
AND i.id = $2;
|
||||
"#,
|
||||
invitee_uuid,
|
||||
invite_id,
|
||||
).fetch_one(pg_pool).await?;
|
||||
)
|
||||
.fetch_one(pg_pool)
|
||||
.await?;
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,12 +59,21 @@ async fn invite_workspace_crud() {
|
|||
|
||||
assert_eq!(invitation.inviter_email, Some(alice.email));
|
||||
assert_eq!(invitation.status, AFWorkspaceInvitationStatus::Pending);
|
||||
assert_eq!(invitation.member_count.unwrap_or(0), 1);
|
||||
|
||||
bob_client
|
||||
.accept_workspace_invitation(&invite_id)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let invitation = bob_client
|
||||
.get_workspace_invitation(&invite_id)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(invitation.status, AFWorkspaceInvitationStatus::Accepted);
|
||||
assert_eq!(invitation.member_count.unwrap_or(0), 2);
|
||||
|
||||
// list invitation with accepted filter
|
||||
let accepted_invs = bob_client
|
||||
.list_workspace_invitations(Some(AFWorkspaceInvitationStatus::Accepted))
|
||||
|
|
|
|||
Loading…
Reference in New Issue