From f849f39133f6a608336cda0583e2347c04e2fa1f Mon Sep 17 00:00:00 2001 From: Zack Fu Zi Xiang Date: Sun, 28 Jan 2024 02:01:15 +0800 Subject: [PATCH] chore: add flakes to gitignore --- .gitignore | 3 +- ...cc8cb083f9d52ebecd252311c4faf6fb5ab22.json | 58 ------------------- libs/database/src/workspace.rs | 14 +++-- tests/workspace/workspace_crud.rs | 43 ++++++++++++++ 4 files changed, 54 insertions(+), 64 deletions(-) delete mode 100644 .sqlx/query-030b315f14742d266f545d6db37cc8cb083f9d52ebecd252311c4faf6fb5ab22.json diff --git a/.gitignore b/.gitignore index 3f5c1417..9e804ce3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ node_modules data/ .env .logs -shell.nix +flake.nix +flake.lock .envrc .direnv/ diff --git a/.sqlx/query-030b315f14742d266f545d6db37cc8cb083f9d52ebecd252311c4faf6fb5ab22.json b/.sqlx/query-030b315f14742d266f545d6db37cc8cb083f9d52ebecd252311c4faf6fb5ab22.json deleted file mode 100644 index a1ba58d1..00000000 --- a/.sqlx/query-030b315f14742d266f545d6db37cc8cb083f9d52ebecd252311c4faf6fb5ab22.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT * FROM public.af_workspace WHERE owner_uid = (\n SELECT uid FROM public.af_user WHERE uuid = $1\n )\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workspace_id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "database_storage_id", - "type_info": "Uuid" - }, - { - "ordinal": 2, - "name": "owner_uid", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 4, - "name": "workspace_type", - "type_info": "Int4" - }, - { - "ordinal": 5, - "name": "deleted_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 6, - "name": "workspace_name", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false, - false, - false, - true, - false, - true, - true - ] - }, - "hash": "030b315f14742d266f545d6db37cc8cb083f9d52ebecd252311c4faf6fb5ab22" -} diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index 37795538..ce5f7b31 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -409,19 +409,23 @@ pub async fn select_user_workspace<'a, E: Executor<'a, Database = Postgres>>( Ok(workspaces) } +/// Returns a list of workspaces that the user is part of. +/// User may owner or non-owner. #[inline] pub async fn select_all_user_workspaces( pool: &PgPool, - owner_uuid: &Uuid, + user_uuid: &Uuid, ) -> Result, AppError> { let workspaces = sqlx::query_as!( AFWorkspaceRow, r#" - SELECT * FROM public.af_workspace WHERE owner_uid = ( - SELECT uid FROM public.af_user WHERE uuid = $1 - ) + SELECT * FROM public.af_workspace + WHERE workspace_id IN ( + SELECT workspace_id FROM public.af_workspace_member + WHERE af_workspace_member.uid = (SELECT uid FROM public.af_user WHERE uuid = $1) + ); "#, - owner_uuid + user_uuid ) .fetch_all(pool) .await?; diff --git a/tests/workspace/workspace_crud.rs b/tests/workspace/workspace_crud.rs index b6c59b60..c38e780a 100644 --- a/tests/workspace/workspace_crud.rs +++ b/tests/workspace/workspace_crud.rs @@ -1,4 +1,6 @@ use client_api_test_util::generate_unique_registered_user_client; +use database_entity::dto::AFRole; +use shared_entity::dto::workspace_dto::CreateWorkspaceMember; use shared_entity::dto::workspace_dto::CreateWorkspaceParam; #[tokio::test] @@ -29,3 +31,44 @@ async fn add_and_delete_workspace_for_user() { let workspaces = c.get_workspaces().await.unwrap(); assert_eq!(workspaces.0.len(), 1); } + +#[tokio::test] +async fn add_and_delete_workspace_for_non_owner_user() { + let (member, member_user) = generate_unique_registered_user_client().await; + + // Owner added member to workspace + let (owner, _user) = generate_unique_registered_user_client().await; + let owner_workspace = owner + .create_workspace(CreateWorkspaceParam { + workspace_name: Some("owner_workspace".to_string()), + }) + .await + .unwrap(); + + owner + .add_workspace_members( + owner_workspace.workspace_id.to_string(), + vec![CreateWorkspaceMember { + email: member_user.email.clone(), + role: AFRole::Member, + }], + ) + .await + .unwrap(); + + // Member should have 2 workspaces + let member_workspaces = member.get_workspaces().await.unwrap(); + assert_eq!(member_workspaces.0.len(), 2); + + owner + .remove_workspace_members( + owner_workspace.workspace_id.to_string(), + vec![member_user.email], + ) + .await + .unwrap(); + + // Member should have 1 workspaces, because owner removed him + let member_workspaces = member.get_workspaces().await.unwrap(); + assert_eq!(member_workspaces.0.len(), 1); +}