Skip to content

Commit 8008959

Browse files
authored
Workspace table notification (#1261)
* chore: add delete user notification * chore: create trigger for workspace delete action
1 parent eb92783 commit 8008959

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

libs/database/src/workspace.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,25 @@ pub async fn select_user_owned_workspaces_id<'a, E: Executor<'a, Database = Post
770770
Ok(workspace_ids)
771771
}
772772

773+
pub async fn insert_workspace_ids_to_deleted_table<'a, E>(
774+
executor: E,
775+
workspace_ids: Vec<Uuid>,
776+
) -> Result<(), AppError>
777+
where
778+
E: Executor<'a, Database = Postgres>,
779+
{
780+
if workspace_ids.is_empty() {
781+
return Ok(());
782+
}
783+
784+
let query = "INSERT INTO public.af_workspace_deleted (workspace_id) SELECT unnest($1::uuid[])";
785+
sqlx::query(query)
786+
.bind(workspace_ids)
787+
.execute(executor)
788+
.await?;
789+
Ok(())
790+
}
791+
773792
pub async fn update_workspace_status<'a, E: Executor<'a, Database = Postgres>>(
774793
executor: E,
775794
workspace_id: &Uuid,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
CREATE TABLE IF NOT EXISTS af_workspace_deleted (
2+
workspace_id uuid PRIMARY KEY NOT NULL,
3+
deleted_at timestamp with time zone DEFAULT now()
4+
);
5+
6+
GRANT SELECT, INSERT, UPDATE, DELETE ON public.af_workspace_deleted TO supabase_auth_admin;
7+
8+
-- Workspace delete trigger
9+
CREATE OR REPLACE FUNCTION workspace_deleted_trigger_function()
10+
RETURNS trigger AS
11+
$$
12+
DECLARE
13+
payload jsonb;
14+
BEGIN
15+
payload := jsonb_build_object(
16+
'workspace_id', OLD.workspace_id
17+
);
18+
INSERT INTO public.af_workspace_deleted (workspace_id, deleted_at)
19+
VALUES (OLD.workspace_id, now())
20+
ON CONFLICT DO NOTHING;
21+
PERFORM pg_notify('af_workspace_deleted', payload::text);
22+
RETURN OLD;
23+
END;
24+
$$ LANGUAGE plpgsql;
25+
26+
CREATE TRIGGER on_workspace_delete
27+
AFTER DELETE ON public.af_workspace
28+
FOR EACH ROW
29+
EXECUTE FUNCTION workspace_deleted_trigger_function();
30+
31+
-- Delete user trigger
32+
CREATE OR REPLACE FUNCTION notify_user_deletion()
33+
RETURNS TRIGGER AS $$
34+
DECLARE
35+
payload TEXT;
36+
BEGIN
37+
payload := jsonb_build_object(
38+
'user_uuid', OLD.uuid::text
39+
);
40+
41+
PERFORM pg_notify('af_user_deleted', payload::text);
42+
RETURN OLD;
43+
END;
44+
$$ LANGUAGE plpgsql;
45+
46+
CREATE TRIGGER user_deletion_trigger
47+
AFTER DELETE ON public.af_user
48+
FOR EACH ROW
49+
EXECUTE FUNCTION notify_user_deletion();

src/biz/user/user_delete.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ use crate::{biz::workspace::ops::delete_workspace_for_user, config::config::Appl
55
use app_error::ErrorCode;
66
use authentication::jwt::Authorization;
77
use database::file::s3_client_impl::S3BucketStorage;
8-
use database::workspace::select_user_owned_workspaces_id;
8+
use database::workspace::{insert_workspace_ids_to_deleted_table, select_user_owned_workspaces_id};
99
use gotrue::params::AdminDeleteUserParams;
1010
use secrecy::{ExposeSecret, Secret};
1111
use shared_entity::response::AppResponseError;
12+
use tracing::info;
1213
use uuid::Uuid;
1314

1415
#[allow(clippy::too_many_arguments)]
@@ -36,6 +37,7 @@ pub async fn delete_user(
3637
};
3738
}
3839

40+
info!("admin deleting user: {:?}", user_uuid);
3941
let admin_token = gotrue_admin.token().await?;
4042
gotrue_client
4143
.admin_delete_user(
@@ -50,6 +52,13 @@ pub async fn delete_user(
5052

5153
// spawn tasks to delete all workspaces owned by the user
5254
let workspace_ids = select_user_owned_workspaces_id(pg_pool, &user_uuid).await?;
55+
56+
info!(
57+
"saving workspaces: {:?} to deleted workspace table",
58+
workspace_ids
59+
);
60+
insert_workspace_ids_to_deleted_table(pg_pool, workspace_ids.clone()).await?;
61+
5362
let mut tasks = vec![];
5463
for workspace_id in workspace_ids {
5564
let cloned_pg_pool = pg_pool.clone();

0 commit comments

Comments
 (0)