Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit c007d4e

Browse files
committed
feat(db/user): Delete user
1 parent ae733b1 commit c007d4e

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

src/db/user.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,34 @@ pub async fn get_or_initialize_user(conn: impl Acquire<'_>, user_id: &str) -> Re
5454
Ok(created_user_info)
5555
}
5656

57+
/// Mark the user as deleted.
58+
///
59+
/// You should also remove this user from the authentication service.
60+
pub async fn delete_user(conn: impl Executor<'_>, user_id: &str) -> Result<(), Error> {
61+
tracing::debug!("Deleting user");
62+
63+
let affected_rows = sqlx::query!(
64+
r#"
65+
UPDATE dp_users
66+
SET deleted_at = now()
67+
WHERE user_id = $1 AND deleted_at IS NULL
68+
"#,
69+
user_id,
70+
)
71+
.execute(conn)
72+
.await?
73+
.rows_affected();
74+
75+
if affected_rows == 0 {
76+
return Err(Error::NotFound {
77+
entity: "user",
78+
id: eco_format!("{user_id}"),
79+
});
80+
}
81+
82+
Ok(())
83+
}
84+
5785
pub struct GroupCreateParameter<'a> {
5886
pub name: &'a str,
5987
pub description: Option<&'a str>,

tests/db_user_test.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,45 @@ mod test_get_or_initialize_user {
4646
}
4747
}
4848

49+
mod test_delete_user {
50+
use std::assert_matches::assert_matches;
51+
52+
use sqlx::PgPool;
53+
54+
#[sqlx::test(fixtures("group", "user"))]
55+
async fn test_delete_user(pool: PgPool) {
56+
backend::db::delete_user(&pool, "usergroup1")
57+
.await
58+
.expect("failed to delete user");
59+
60+
let user = sqlx::query!(r#"SELECT deleted_at FROM dp_users WHERE user_id = 'usergroup1';"#)
61+
.fetch_one(&pool)
62+
.await
63+
.expect("failed to fetch user");
64+
assert!(user.deleted_at.is_some());
65+
}
66+
67+
#[sqlx::test]
68+
async fn test_delete_user_not_found(pool: PgPool) {
69+
let user = backend::db::delete_user(&pool, "usernotfound0").await;
70+
71+
assert_matches!(
72+
user,
73+
Err(backend::db::Error::NotFound {
74+
entity: "user",
75+
id,
76+
}) if id == "usernotfound0"
77+
);
78+
}
79+
80+
#[sqlx::test(fixtures("group", "user"))]
81+
async fn test_delete_user_deleted(pool: PgPool) {
82+
let user = backend::db::delete_user(&pool, "userdeleted0").await;
83+
84+
assert_matches!(user, Err(backend::db::Error::NotFound { entity: "user", id }) if id == "userdeleted0");
85+
}
86+
}
87+
4988
mod test_create_group {
5089
use backend::db::GroupCreateParameter;
5190
use sqlx::PgPool;

0 commit comments

Comments
 (0)